如何将参数从控制器传递给 FormType 构造函数
How to pass parameter to FormType constructor from controller
在 Symfony2.7 中,我可以在创建表单时直接从控制器将参数传递给 Form Type 构造函数,但是在 Symfony3 中,我不能这样做!
Symfony2.7之前
$postedBy = $this->getUser()->getFullname();
$form = $this->createForm(new NewsType($postedBy));
在 Symfony3 之后
$form = $this->createForm(NewsType::class); // no idea how to pass parameter?
更新:
我还想从以下位置访问它:
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
// how to access posted_by_name here which is sent from controller
}
任何帮助将不胜感激..
您需要定义您的form as service。
namespace AppBundle\Form\Type;
use App\Utility\MyCustomService;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
class NewsType extends AbstractType
{
private $myCustomService;
private $myStringParameter;
public function __construct(MyCustomService $service, $stringParameter)
{
$this->myCustomService = $service;
$this->myStringParameter = $stringParameter;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
// Your code
}
}
添加到您的服务配置:
#src/AppBundle/Resources/config/services.yml
services:
app.form.type.task:
class: AppBundle\Form\Type\NewsType
arguments:
- "@app.my_service"
- "posted_by_name"
tags:
- { name: form.type }
感谢您的宝贵时间!我自己解决了这个问题:
我从 NewsType 构造函数中删除了参数,并使用 $options 数组将数据添加到 postedBy 表单字段,并将数据从控制器传递到 $options 数组,请检查以下内容:
NewsType
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('postedBy', HiddenType::class, array(
'data' => $options['postedBy']
)
)
;
}
// WARNING: this is a MANDATORY block! Only options described here will be allowed to be passed.
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'postedBy' => null,
));
}
控制器
$form = $this->createForm(NewsType::class, $news, array(
'postedBy' => $this->getUser()->getFullname(),
);
更新:
如果您想从 addEventListener 访问 $options 数组,请使用以下代码:
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
$postedBy = $event->getForm()->getConfig()->getOptions()['postedBy'];
}
希望对大家有所帮助!
你们都对。
@Muzafar 和@jkucharovic,问题是什么时候使用哪个...
正如 Bernard Schussek 在 Symfony Forms 101 中展示的那样:
1 不要将 动态数据 传递给构造函数..
2 ... 但使用 自定义选项 代替
3 将 全局设置 传递给构造函数(或服务)
在 Symfony2.7 中,我可以在创建表单时直接从控制器将参数传递给 Form Type 构造函数,但是在 Symfony3 中,我不能这样做!
Symfony2.7之前
$postedBy = $this->getUser()->getFullname();
$form = $this->createForm(new NewsType($postedBy));
在 Symfony3 之后
$form = $this->createForm(NewsType::class); // no idea how to pass parameter?
更新: 我还想从以下位置访问它:
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
// how to access posted_by_name here which is sent from controller
}
任何帮助将不胜感激..
您需要定义您的form as service。
namespace AppBundle\Form\Type;
use App\Utility\MyCustomService;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
class NewsType extends AbstractType
{
private $myCustomService;
private $myStringParameter;
public function __construct(MyCustomService $service, $stringParameter)
{
$this->myCustomService = $service;
$this->myStringParameter = $stringParameter;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
// Your code
}
}
添加到您的服务配置:
#src/AppBundle/Resources/config/services.yml
services:
app.form.type.task:
class: AppBundle\Form\Type\NewsType
arguments:
- "@app.my_service"
- "posted_by_name"
tags:
- { name: form.type }
感谢您的宝贵时间!我自己解决了这个问题:
我从 NewsType 构造函数中删除了参数,并使用 $options 数组将数据添加到 postedBy 表单字段,并将数据从控制器传递到 $options 数组,请检查以下内容:
NewsType
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('postedBy', HiddenType::class, array(
'data' => $options['postedBy']
)
)
;
}
// WARNING: this is a MANDATORY block! Only options described here will be allowed to be passed.
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'postedBy' => null,
));
}
控制器
$form = $this->createForm(NewsType::class, $news, array(
'postedBy' => $this->getUser()->getFullname(),
);
更新: 如果您想从 addEventListener 访问 $options 数组,请使用以下代码:
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
$postedBy = $event->getForm()->getConfig()->getOptions()['postedBy'];
}
希望对大家有所帮助!
你们都对。
@Muzafar 和@jkucharovic,问题是什么时候使用哪个...
正如 Bernard Schussek 在 Symfony Forms 101 中展示的那样:
1 不要将 动态数据 传递给构造函数..
2 ... 但使用 自定义选项 代替
3 将 全局设置 传递给构造函数(或服务)