我有一个表单类型,但希望使用此表单中的容器来检测当前用户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
}
}
Services.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);
答案 0 :(得分:4)
您需要将服务标记为表单。
main.form.addValueType:
class: "%AddValueType.class%"
arguments: ['@service_container']
tags:
- { name: form.type, alias: valueType }
表单名称需要valueType
。您现在可以按名称使用表单,而不是手动创建新实例。
确实注入服务容器是不好的做法。
答案 1 :(得分:0)
不要将您的表单声明为服务,但是请创建一个新服务并将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);
....
}
这对我有用