在 Symfony 3 中从控制器传递参数以形成 __construct 类型

Posted

技术标签:

【中文标题】在 Symfony 3 中从控制器传递参数以形成 __construct 类型【英文标题】:Passing arguments from controller to form type __construct in Symfony 3 【发布时间】:2018-01-19 15:39:58 【问题描述】:

在 Symfony2 中我们使用:

$form = $this->createForm(new MyFormType($mySession));

我们可以在 __construct 中将 $session 作为参数传递。

但我无法在 Symfony3 中传递 $session 参数

我尝试过这样的事情:

$form = $this->createForm(MyFormType::class, array(
        'mySession' => $mySession
    ));

谁能指导我?如何解决这个问题。 提前致谢!

【问题讨论】:

【参考方案1】:

createForm 方法的第二个参数是您设置的 $datas。您可以使用 FormType configureOptions 中的 data_class 将数据链接到实体,如下所示:

public function configureOptions(OptionsResolver $resolver)

    $resolver->setDefaults(array(
        'data_class' => MyEntity::class,
    ));

此外,Symfony 接受选项的第三个参数 以下是核心方法:

/**
     * Creates and returns a Form instance from the type of the form.
     *
     * @param string $type    The fully qualified class name of the form type
     * @param mixed  $data    The initial data for the form
     * @param array  $options Options for the form
     *
     * @return Form
     */
    protected function createForm($type, $data = null, array $options = array())
    
        return $this->container->get('form.factory')->create($type, $data, $options);
    

【讨论】:

【参考方案2】:

希望此链接对您有所帮助:

public function buildForm(FormBuilderInterface $builder, array $options)

    $this->yourVarableName = $options['yourVarableName']; // here you will catch your pass data

    $builder
        ->add('name', TextType::class)
        ...
        ->add('your_field_type', ChoiceType::class, array(
            'label' => 'Label Field',
            'mapped' => false,
            'choices' => $this->traitChoices['figure_type']
        ))
        ...
    ;


/**
 * @inheritdoc
 */
public function configureOptions(OptionsResolver $resolver)

    $resolver->setDefaults(array(
        'data_class' => 'Foo\YouBundle\Entity\Goal',
        'yourVarableName' => null, // here your data
    ));

当你的控制器创建表单时:

$goal = new Goal(); //instance of Entity
$form = $this->createForm(GoalType::class, $goal, array(
        'action' => $this->generateUrl('profile_update'),
        'method' => 'PUT',
        'yourVarableName' => $yourVarableName,
    ));

【讨论】:

我们必须在哪里定义"$profile" 我对symfony3比较新,所以最好用一个例子来解释。谢谢 @mobizen 你明白吗? 是的,我已经按照您告诉我的那样进行了更改...但是得到相同的错误“类型错误:函数 FD\PatientBundle\Form\GoalType::__construct(), 0 传递的参数太少” @mobizen 您需要从 GoalType 中删除构造函数。出于所有意图和目的,S3 不再允许使用构造函数。 (好吧,理论上您可以将表单类型定义为服务,但这是另一回事)。

以上是关于在 Symfony 3 中从控制器传递参数以形成 __construct 类型的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数从控制器传递给 FormType 构造函数

将参数传递给 symfony 5.4 表单测试不起作用

在Django中传递参数以形成动作?

Symfony 4:如何将$ _SERVER数组作为构造函数参数传递

如何在swift 3中从一个视图控制器传递到上一个视图控制器时设置委托?

最好在 PHP (Symfony 2) 中传递完整的对象或只是一个必需的值?