Critères d'acceptances :
[x] La création de produit se fait avec un formulaire.
[x] Un produit constitué d'un nom, d'un prix et d'un fichier PDF.
[x] Utiliser la configuration sémantique dans le bundle afin de rendre configurable le chemin d'upload de fichier et valider cette configuration.
- Générer un bundle qu'il faut appeler : Vendor/ShopBundle.
- Créer une entité
Product
avec 3 propriétés :name
,price
anddocument
. - Ajouter les annotation
@ORM
de façon à déclarer le schéma Doctrine. - Lancer la commande
php app/console doctrine:database:create
puisphp app/console doctrine:schema:update
. - Créer la classe
ProductType
dans le dossier "Form", avec 4 champs :name
,price
,document
andsubmit
. - Déclarer la comme service service.
- Créer la classe
ProductController
étendantSymfony\Bundle\FrameworkBundle\Controller\Controller
(ainsi nous aurons accès au container d'injection dépendance ainsi qu'à l'ensemble de méthodes raccourcies). - Créer une action
newAction
dans la classeProductController
avec l'url/product/new
et faire en sorte de créer le formulaire et le passer à la vue. - Restreindre la méthode HTTP de la route (GET and POST)
- Créer une vue dans le dossier
Resources/views/Product
la vue nomméenew.html.twig
afin de rendre le formulaire. - Ajouter les contraintes de validation pour les champs de la classe Produit gràce aux annotations.
- Ajouter le form thème afin d'englober chacun des champs avec un "fieldset".
- Dans le template, désactiver la validation HTML5, et ajouter le
form_enctype
dans la balise ouvrante<form…
. - Appeler la méthode
handleRequest()
dans l'action. - Ajouter la logique dans le
if ($form->isValid())
afin de persister le produit dans l'upload du document. - Créer un service
Uploader
dans le dossierVendor\ShopBundle\Services
avec la méthodeupload()
. - Dans la méthode
upload()
, implementer la logique pour générer le nom du document uploadé et le déplacer dans le bon dossier . La méthode doit retourner le nom de fichier généré. - Déclarer l'Uploader en tant que service et injecter le service
filesystem
via son constructeur. - Créer la configuration sémantique pour déclarer le chemin d'upload (dossier).
- Indiquer la clé
vendor_shop.upload_path
dansapp/config/config.yml
avec la valeur"%upload_path%"
. - Déclarer le noeud dans la classe
src/Vendor/ShopBundle/DependencyInjection/Configuration.php
. - Ajouter l'argument
upload_path
à la définition du servicevendor.uploader
dans la méthodesrc/Vendor/ShopBundle/DependencyInjection/VendorShopExtension::load()
. - Ajouter la propriété privée
$path
dans la classeUploader
de manière à ce qu'elle soit initialisée dans le constructeur du service - Dans l'action, récupérer le service uploader et appeler la méthode
upload()
. - Ne pas oublier de mettre à jour la priopriété
$product->document
. - Lorsque le produit est persité, rediriger l'utilisateur vers la page ayant la route
/product/show/{id}
afin de montrer le produit nouvellement créé en base de données. - Créer une action
showAction
avec la route/product/show/{id}
. - Créer le template
show.html.twig
dans le dossiersrc/Vendor/ShopBundle/Resources/views/Product
afin d'afficher les informations du produits.
Et voilà!
Code associé : https://github.com/poledev/Katas/tree/kata-upload-file
Un peu de documentation :