传递给选择字段的实体必须进行管理 - 在app.php和app_dev.php上不同

时间:2017-12-17 23:53:50

标签: forms symfony

欢迎!

我已在表单中添加了一个字段

    ->add('languageLevel', ChoiceType::class, [
        'choices' => [
            Meme::LEVEL_BEGINNER => Meme::LEVEL_BEGINNER,
            Meme::LEVEL_INTERMEDIATE => Meme::LEVEL_INTERMEDIATE,
            Meme::LEVEL_ADVANCED => Meme::LEVEL_ADVANCED,
            Meme::LEVEL_EXPERT => Meme::LEVEL_EXPERT
        ]
    ])

此表格可以保存实体&Meme'具有相同的属性

/**
 * @var string
 * @ORM\Column(name="language_level", type="string", length=20)
 */
private $languageLevel;

prod.log给了我这个:

[2017-12-17 23:41:18] request.INFO: Matched route "meme_add". {"route":"meme_add","route_parameters":{"_controller":"AppBundle\\Controller\\MemeController::addAction","_route":"meme_add"},"request_uri":"http://keenweasel.com/meme/add","method":"GET"} []
[2017-12-17 23:41:18] security.DEBUG: Read existing security token from the session. {"key":"_security_main"} []
[2017-12-17 23:41:18] security.DEBUG: User was reloaded from a user provider. {"username":"acid","provider":"FOS\\UserBundle\\Security\\UserProvider"} []
[2017-12-17 23:41:18] php.WARNING: Warning: spl_object_hash() expects parameter 1 to be object, integer given {"exception":"[object] (ErrorException(code: 0): Warning: spl_object_hash() expects parameter 1 to be object, integer given at /var/www/keen/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php:1239)"} []
[2017-12-17 23:41:18] php.WARNING: Warning: spl_object_hash() expects parameter 1 to be object, integer given {"exception":"[object] (ErrorException(code: 0): Warning: spl_object_hash() expects parameter 1 to be object, integer given at /var/www/keen/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php:1592)"} []
[2017-12-17 23:41:18] request.CRITICAL: Uncaught PHP Exception Symfony\Component\Form\Exception\RuntimeException: "Entities passed to the choice field must be managed. Maybe persist them in the entity manager?" at /var/www/keen/vendor/symfony/symfony/src/Symfony/Bridge/Doctrine/Form/ChoiceList/IdReader.php line 98 {"exception":"[object] (Symfony\\Component\\Form\\Exception\\RuntimeException(code: 0): Entities passed to the choice field must be managed. Maybe persist them in the entity manager? at /var/www/keen/vendor/symfony/symfony/src/Symfony/Bridge/Doctrine/Form/ChoiceList/IdReader.php:98)"} []
[2017-12-17 23:41:18] security.DEBUG: Stored the security token in the session. {"key":"_security_main"} []
在我的开发机器上的dev.log中,没有类似的东西,它工作正常。在prod上我得到错误500.请帮忙吗?我尝试删除供应商并在dev和prod服务器上再次安装它。使用--env = prod多次清除缓存。

修改

好的,在开发服务器上遇到了同样的问题(刚从apache配置中的app_dev.php切换到app.php并添加了app / autoload.php)

/**
 * @Route("/meme/add", name="meme_add")
 * @param Request $request
 * @return \Symfony\Component\HttpFoundation\Response
 * @internal param Request $request
 */
public function addAction(Request $request)
{
    $user = $this->getUser();
    if (!$user || !$user->hasRole('ROLE_MEME_ADD_AWAITING')) {
        $this->addFlash('notice', 'You need to login');
        return $this->redirectToRoute('fos_user_security_login');
    }

    if (!$this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')) {
        throw $this->createAccessDeniedException();
    }

    $meme = new Meme();
    $form = $this->createForm(MemeAddType::class, $meme);

    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid() ) {
        if ($user->hasRole('ROLE_MEME_ADD_AWAITING')) {
            $meme->setPublishingStatus('awaiting-publishing');
        } else if ($this->getUser()->hasRole('ROLE_MEME_ADD_MAIN')) {
            $meme->setPublishingStatus('published');
        }
        $em = $this->getDoctrine()->getManager();
        $em->persist($meme);
        $em->flush();
    }

    return $this->render(
        '@App/memes/add.html.twig',
        [
            'memeAddForm' => $form->createView()
        ]
    );
}

表格:

<?php

namespace AppBundle\Form;

use AppBundle\Entity\Language;
use AppBundle\Entity\Meme;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Vich\UploaderBundle\Form\Type\VichImageType;

class MemeAddType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        $builder
            ->add('textOne', TextareaType::class, [
                'label' => 'A phrase or a word',
                'attr' => ['style' => 'width:320px; height: 110px']
            ])
            ->add('textOneLang', EntityType::class , [
                'class' => Language::class,
                'choice_label' => 'language',
                'expanded' => false,
                'multiple' => false,
                'label' => 'Language of the phrase of the word',
                'data' => 2

            ])
            ->add('textTwo', TextareaType::class, [
                'label' => 'Translation, might be with an example',
                'attr' => ['style' => 'width:320px; height: 110px']
            ])
            ->add('textTwoLang', EntityType::class , [
                'class' => Language::class,
                'choice_label' => 'language',
                'expanded' => false,
                'multiple' => false,
                'label' => 'Language of the translation of the phrase of the word',
                'data' => 2
            ])
            ->add('languageLevel', ChoiceType::class, [
                'choices' => [
                    Meme::LEVEL_BEGINNER => Meme::LEVEL_BEGINNER,
                    Meme::LEVEL_INTERMEDIATE => Meme::LEVEL_INTERMEDIATE,
                    Meme::LEVEL_ADVANCED => Meme::LEVEL_ADVANCED,
                    Meme::LEVEL_EXPERT => Meme::LEVEL_EXPERT
                ]
            ])
            ->add('imageFile', VichImageType::class)
            ->add(
                'save',
                SubmitType::class,
                [
                    'attr' => ['class' => 'save']
                ]
            )
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Meme::class
        ]);
    }

    public function getBlockPrefix()
    {
        return 'app_bundle_meme_add';
    }

    public function getName() {
        return 'app_bundle_meme_add';
    }
}

2 个答案:

答案 0 :(得分:2)

在formType

中尝试此操作
<?php

namespace AppBundle\Form;

use AppBundle\Entity\Language;
use AppBundle\Entity\Meme;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Vich\UploaderBundle\Form\Type\VichImageType;

class MemeAddType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        $builder
            ->add('textOne', TextareaType::class, [
                'label' => 'A phrase or a word',
                'attr' => ['style' => 'width:320px; height: 110px']
            ])
            ->add('textOneLang', EntityType::class , [
                'class' => Language::class,
                'choice_label' => 'language',
                'expanded' => false,
                'multiple' => false,
                'label' => 'Language of the phrase of the word',
                'data' => 2

            ])
            ->add('textTwo', TextareaType::class, [
                'label' => 'Translation, might be with an example',
                'attr' => ['style' => 'width:320px; height: 110px']
            ])
            ->add('textTwoLang', EntityType::class , [
                'class' => Language::class,
                'choice_label' => 'language',
                'expanded' => false,
                'multiple' => false,
                'label' => 'Language of the translation of the phrase of the word',
                'data' => 2
            ])
            ->add('languageLevel', ChoiceType::class, [
                'choices' => [
                    Meme::LEVEL_BEGINNER => Meme::LEVEL_BEGINNER,
                    Meme::LEVEL_INTERMEDIATE => Meme::LEVEL_INTERMEDIATE,
                    Meme::LEVEL_ADVANCED => Meme::LEVEL_ADVANCED,
                    Meme::LEVEL_EXPERT => Meme::LEVEL_EXPERT
                ]
            ])
            ->add('imageFile', VichImageType::class)
            ->add(
                'save',
                SubmitType::class,
                [
                    'attr' => ['class' => 'save']
                ]
            )
        ;
        $builder->get('languageLevel')->resetViewTransformers();
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Meme::class
        ]);
    }

    public function getBlockPrefix()
    {
        return 'app_bundle_meme_add';
    }
}

答案 1 :(得分:1)

实际上,发生的事情是我有

 'data' => 2

在textOneLang表单元素中,因此当它被赋予spl_object_hash()函数时它失败了,它只接受对象而不是整数。没有使用数据转换器。但是这个'数据'参数不应该首先存在,不知道它是如何结束的。可能在尝试调试时。经验教训,找出所有选项,并将你在spl_object_hash()中作为参数转储。

app_dev.php和app.php之间的区别与它没有任何关系。它可能在app_dev.php中以某种方式缓存并处理了一些旧版本。