我有一个表单类型,但想使用此表单中的容器来检测当前用户 ID (FOSUserBundle)。我不确定是否最好将容器直接注入表单或用户类中,但我无法正常工作。以下是我的表单类型:
class AddValueType extends AbstractType
{
private $container;
public function __construct(ContainerInterface $container)
{
$this->container = $container;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
//build form, get user ID
}
}
服务.yml:
parameters:
AddValueType.class: Main'MyBundle'Form'Type'AddValueType
services:
main.form.addValueType:
class: "%AddValueType.class%"
arguments: ['@service_container']
我收到错误Warning: Missing argument 1 for Main'MyBundle'Form'Type'AddValueType::__construct()
所以它显然没有正确传递给表单类型。我对依赖注入很陌生,但无法弄清楚我哪里出了问题?我让其他人以同样的方式在我的应用程序中工作,以获得服务。
更新
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add(
$builder->create('aDate', 'hidden' ,array('empty_data' => new 'DateTime() ))->addViewTransformer( new DateTimeToStringTransformer() )
)
->add('field1', 'hidden')
->add('field2', 'hidden')
->add('submit', 'submit')
->getForm();
$builder->addEventListener(FormEvents::PRE_BIND, function(FormEvent $event) {
$data = $event->getData();
$data['addedByUser'] = $userId;//this is what I need to fetch
//some other simple logic to set data after form is sent
$event->setData($data);
});
}
public function getName()
{
return 'AddValue';
}
在我的控制器中创建:
$form = $this->createForm(new AddValueType(), $myDoctrineEntity/Class);
您需要
将服务标记为表单。
main.form.addValueType:
class: "%AddValueType.class%"
arguments: ['@service_container']
tags:
- { name: form.type, alias: valueType }
表单的名称需要 valueType
。现在,您可以按窗体的名称使用窗体,而无需手动创建新实例。
事实上,注入服务容器是一种不好的做法。
不要将表单声明为服务,但是创建一个新服务并将form.factory
和表单注入其中,如下所示:
service.xml
<service id="my_form_handler" class="namespace'FormHandler">
<argument type="service" id="form.factory" />
<argument id="yourFormClass">'namespace'of'your'form'class</argument>
</service>
您的表单处理程序:
class FormHandler
{
private $formFactory;
private $formType;
public function __construct($formFactory, $formType) {....}
public function test()
{
$form = $this->formFactory->create(new $this->formType, $entity, $options);
....
}
这对我有用