J'ai fait une démonstration d'ajout, de navigation, de mise à jour et de suppression de produits conformément au dernier manuel PDF officiel (en édition). Il y a un attribut de catégorie plusieurs à un dans le produit. Après les tests précédents, il n'y a aucun problème.
src/Acme/StoreBundle/Entity/Product.php
/** * @ORM\ManyToOne(targetEntity="Category", inversedBy="products") * @ORM\JoinColumn(name="category_id", referencedColumnName="id") */ protected $category;
src/Acme/StoreBundle/Entity/Category.php
/** * @ORM\OneToMany(targetEntity="Product", mappedBy="category") */ protected $products;
Puis selon le chapitre Formulaire, j'ai transformé la page d'ajout de produits en formulaire pour soumettre et ajouter des produits :
public function createAction(Request $request) { $category = $this->getDoctrine() ->getRepository('AcmeStoreBundle:Category') ->find(1); $product = new Product(); $product->setCategory($category); $form = $this->createFormBuilder($product) ->add('name') ->add('price') ->add('description') ->getForm(); if($request->getMethod() == 'POST') { $form->bindRequest($request); if($form->isValid()) { $created = true; $em = $this->getDoctrine()->getEntityManager(); $em->persist($product); $em->flush(); } } return $this->render('AcmeStoreBundle:Default:create.html.twig', array('created' => $created, 'form' => $form->createView(), 'product_id' => $product->getId() )); }
À ce stade, tous les liens peuvent fonctionner normalement et la base de données peut également créer des données réussies. Ensuite, j'ai vu "Création de classes de formulaire", j'ai donc créé une classe Form en utilisant la doctrine:generate:form fournie avec la ligne de commande :
php app/console doctrine:generate:form AcmeStoreBundle:Product
src/Acme/StoreBundle/Form/ProductType.php
namespace Acme\StoreBundle\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilder; class ProductType extends AbstractType { public function buildForm(FormBuilder $builder, array $options) { $builder ->add('name') ->add('price') ->add('description') ->add('category') ; } public function getName() { return 'acme_storebundle_producttype'; } }
Puis j'ai modifié le code du contrôleur selon le manuel :
... use Acme\StoreBundle\Form\ProductType; ... $form = $this->createForm(new ProductType(), $product); ...
Mais après avoir vidé le cache, une erreur symfony2 500 s'est produite dans l'adresse d'accès. Le message d'erreur dans le journal est :
.[2012-08-26 16:00:27] request.INFO: Matched route "store_create" (parameters: "_controller": "Acme\StoreBundle\Controller\DefaultController::createAction", "_route": "store_create") [] [] [2012-08-26 16:00:27] request.CRITICAL: Symfony\Component\Form\Exception\FormException: Entity "Acme\StoreBundle\Entity\Category" passed to the choice field must have a "__toString()" method defined (or you can also override the "property" option). (uncaught exception) at /work/projects/admin/php/vendor/symfony/src/Symfony/Bridge/Doctrine/Form/ChoiceList/EntityChoiceList.php line 188 [] []
Après avoir débogué le contenu de la sortie d'écho, il se trouve dans la phrase modifiée "$form = $this->createForm(new ProductType(), $product);"
La signification de cette erreur est que lorsque Symfony génère le menu déroulant (<select>), il ne sait pas quel doit être utilisé comme contenu texte de l'option (<option>). dans le message d'erreur. Supposons que vous souhaitiez Le texte affiché est CategoryName :
(1) Ajoutez une méthode "__toString()" à votre classe Entity ;
(2) Spécifiez un champ dans l'entité comme texte d'option :