我按照官方最新的pdf手冊(en Edition)做了一個添加、瀏覽、更新、刪除產(chǎn)品的demo,product里面有一個多對一的category屬性,經(jīng)過之前測試,是沒有問題的。
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;
然后按照Form章節(jié),我把添加產(chǎn)品的頁面改造成了個表單提交添加產(chǎn)品:
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() )); }
到此時所有的環(huán)節(jié)都可以正常的工作,數(shù)據(jù)庫也可以創(chuàng)建成功數(shù)據(jù),然后我看到 “Creating Form Classes”,于是用命令行自帶的 doctrine:generate:form 創(chuàng)建了個Form類:
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'; } }
然后按照手冊上,修改了控制器的代碼:
... use Acme\StoreBundle\Form\ProductType; ... $form = $this->createForm(new ProductType(), $product); ...
但是清除緩存之后訪問地址出現(xiàn)了symfony2的500錯誤,日志中的錯誤提示:
[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 [] []
echo輸出內(nèi)容調(diào)試之后定位在修改的那句 “ $form = $this->createForm(new ProductType(), $product); ”
人生最曼妙的風(fēng)景,竟是內(nèi)心的淡定與從容!
這個報錯的意思是,Symfony在生成下拉菜單(<select>)時,不知道應(yīng)該把什么作為選項(<option>)的文字內(nèi)容,解決辦法在報錯信息里已經(jīng)提供了,假設(shè)你要顯示的文字是categoryName:
(一)在你的Entity類里增加一個“__toString()”方法;
public function __toString() { return $this->categoryName; }
(二)指定Entity里某個字段作為option文字:
$builder ->add('name') ->add('price') ->add('description') ->add('category', 'entity', array( // ... 'property' => 'categoryName' // ... )) ;