Une erreur Symfony2 (2.0.17-DEV) 500 se produit après la création du type de formulaire
黄舟
黄舟 2017-05-16 16:46:23
0
1
415

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);"

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

répondre à tous(1)
迷茫

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 ;

public function __toString()
{
    return $this->categoryName;
}
(2) Spécifiez un champ dans l'entité comme texte d'option :

$builder
    ->add('name') 
    ->add('price') 
    ->add('description') 
    ->add('category', 'entity', array(
        // ...
        'property' => 'categoryName'
        // ...
    ))
;
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!