在Symfony2

时间:2017-09-28 09:56:22

标签: forms symfony

一般信息

我正在使用Symfony 2.8 在这个问题中,两个实体是主题。 ObjectElementTask和Activity。我将Activity作为ObjectElementTask中的集合嵌入。 这么久,一切都很好,并且正常运行。

问题

我在ActivityType中添加了一个evenlistener。因为ObjectElementTaskForm中的ActivityForm的一部分必须是动态的(基于使用该表单的经过身份验证的用户...)

当我直接查看ActivityForm时:通过ActivityController(使用此代码调用表单:$editForm = $this->createForm('AppBundle\Form\ActivityType', $activity);),eventlistener正在工作。

当我查看ObjectElementTaksForm时,我得到一个例外:

  

类型错误:传递给AppBundle \ Form \ ActivityType :: __ construct()的参数1必须实现接口Symfony \ Component \ Security \ Core \ Authentication \ Token \ Storage \ TokenStorageInterface,没有给出,在/ home / vpcont1q / public_html中调用第62行/test/src/AppBundle/Form/ObjectElementTaskType.php

我的猜测

我想是因为在ObjectElementTaksForm中,ActivityForm以另一种方式调用,然后在ActivityController中调用。然后参数(在services.yml中注册)没有通过。嵌入表单时如何确保注册服务被调用?或者......我正朝着错误的方向前进。

代码

在我的类型和services.yml部分下面:

这是我的ActivityType:

<?php
namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;

class ActivityType extends AbstractType
{

    private $tokenStorage;

    public function __construct(TokenStorageInterface $tokenStorage)
    {
        $this->tokenStorage = $tokenStorage;
    }

    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('executionDate')
            ->add('status'),
            ->add('scheduledDate')

        // grab the user, do a quick sanity check that one exists
        $user = $this->tokenStorage->getToken()->getUser();
        if (!$user) {
            throw new \LogicException(
                'You are NOT an authenticated user!'
            );
        }
        $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($user) {
            //TODO
        });



    }

    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Activity'
        ));
    }
}

这是我的ObjectElementTaskType:

<?php
namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;

class ObjectElementTaskType extends AbstractType
{

    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('activities', 'collection', array(
            'entry_type' => new ActivityType(),
            'allow_add' => true,
            'allow_delete' => true,
            'by_reference' => false,
            ))
        ;

    }

    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\ObjectElementTask',
        ));
    }
}

我已将ActivityForm注册为服务,并将令牌作为参数:

  app.form.activity:
        class: AppBundle\Form\ActivityType
        arguments: ['@security.token_storage']
        tags:
            - { name: form.type }

修改

这似乎有效:

我没有将ActivityType注册为服务,而是将ObjectElementTask注册为服务(也使用Tokenstorage)。 我没有使用其他嵌入在ObjectElementTaskType中的ActivityType,这就是为什么我将ActivityType作为services.yml中的服务删除。

  app.form.object_element_task:
        class: AppBundle\Form\ObjectElementTaskType
        arguments: ['@security.token_storage']
        tags:
            - { name: form.type }

在ObjectElementTaskType中我添加了构造:

<?php
namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;

class ObjectElementTaskType extends AbstractType
{
    private $tokenStorage;

    public function __construct(TokenStorageInterface $tokenStorage)
    {
        $this->tokenStorage = $tokenStorage;
    }

    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {        
$tokenStorage = $this->tokenStorage;

在buildform中,我将tokenstorage添加为ActivityType类decleration中的参数:

    ->add('activities', 'collection', array(
    'entry_type' => new ActivityType($tokenStorage),
    'allow_add' => true,
    'allow_delete' => true,
    'by_reference' => false,
    ))

我没有改变活动类型。这是一种解决方法或方法吗?

0 个答案:

没有答案