Saya membuat demo menambah, menyemak imbas, mengemas kini dan memadam produk mengikut manual PDF rasmi (en Edition) Terdapat atribut kategori banyak-ke-satu dalam produk tersebut.
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;
Kemudian mengikut bab Borang, saya menukar halaman untuk menambah produk kepada borang untuk menghantar dan menambah produk:
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() )); }
Pada ketika ini, semua pautan boleh berfungsi seperti biasa, dan pangkalan data juga boleh mencipta data yang berjaya Kemudian saya melihat "Mencipta Kelas Borang", jadi saya mencipta kelas Borang menggunakan doktrin:generate:form yang disertakan dengan baris arahan:
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'; } }
Kemudian saya ubah suai kod pengawal mengikut manual:
... use Acme\StoreBundle\Form\ProductType; ... $form = $this->createForm(new ProductType(), $product); ...
Tetapi selepas mengosongkan cache, ralat symfony2 500 berlaku dalam alamat akses Mesej ralat dalam log ialah:
[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 [] []
Selepas menyahpepijat kandungan output gema, ia terletak pada ayat yang diubah suai "$form = $this->createForm(new ProductType(), $product);"
Maksud ralat ini ialah apabila Symfony menjana menu lungsur (<pilih>), ia tidak tahu apa yang harus digunakan sebagai kandungan teks pilihan (< pilihan> Penyelesaian telah disediakan dalam mesej ralat. Katakan anda mahu Teks yang dipaparkan ialah kategoriNama:
(1) Tambahkan kaedah "__toString()" pada kelas Entiti anda
(2) Tentukan medan dalam Entiti sebagai teks pilihan: