一般信息
我正在使用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,
))
我没有改变活动类型。这是一种解决方法或方法吗?