Forms 将参数传递给Symfony的FormBuilder add()

Forms 将参数传递给Symfony的FormBuilder add(),forms,symfony,formbuilder,Forms,Symfony,Formbuilder,我试图显示一个表单,其中包含调查x中的所有问题,以及来自用户y的答案数据。这些类具有以下关系: 用户m-m调查 调查1-m问题 问题1-m答案 用户1-m答案 问题对象通常包含所有答案的集合。我认为我很狡猾,因为我创建了一个关于问题的方法,可以为特定用户返回答案: class Question { public function getAnswer(User $user) { return $this->getAnswers()->filter(fun

我试图显示一个表单,其中包含调查x中的所有问题,以及来自用户y的答案数据。这些类具有以下关系:

用户m-m调查 调查1-m问题 问题1-m答案 用户1-m答案 问题对象通常包含所有答案的集合。我认为我很狡猾,因为我创建了一个关于问题的方法,可以为特定用户返回答案:

class Question
{
    public function getAnswer(User $user)
    {
        return $this->getAnswers()->filter(function(Answer $answer) use ($user) {
            return $answer->getUserId() == $user->getId();
        })->first();
    }
}
一秒钟之内,忽略了这个虚假的急切加载的过滤器调用;我不知道该如何将其与Symfony的FormBuilder联系起来:

调查表格:

class SurveyType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('questions', 'collection', ['type' => new QuestionType()]);
    }
}
问题表格:

class QuestionType extends AbstractType
{
    public function __construct(User $user)
    {
        $this->user  $user;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        // How to pass $this->user to the FormBuilder's call to $question->getAnswer()?
        $builder->add('answer', 'text');
    }
}

问题是框架试图通过调用$QUEST->getAnswer来填充字段的数据,但失败了,因为它需要一个用户参数。有没有办法传入该参数?或者我应该从一个完全不同的角度来处理这个问题?

查看Symfony代码后,我发现您可以将一个选项数组传递到Symfonys FormBuilder中。所以你应该能够写下:

class QuestionType extends AbstractType
{
    protected $user;

    public function __construct(User $user)
    {
        $this->user = $user;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('answer', 'text', array($this->user));
    }
}

请注意,我还没有测试过这个。一般来说,源代码为您提供了有关选项的良好指示。如果某个特性没有实现,您可以扩展该类并自己实现它

最终,解决方案是确保初始对象图是正确的,而不是在涉及到FormBuilder之后就乱搞。就将自定义参数输入setter而言,这似乎是最干净的方法:


我认为,当你查询问题时,最好能得到基于用户的答案。但是,您可以将用户传递给表单类型的构造函数。新问题类型$user;我认为你是对的;在开始构建表单之前,我需要将对象图简化为正确答案。您提到在构造时传入用户。那会有什么帮助?我在获取用户id时没有遇到问题,但将其作为过滤器应用。我会更新我的问题,让它更清楚。你是对的。我没有仔细阅读你原来的问题。您可以在$questions上迭代,在开始表单之前,只需对每个问题调用setUser。但当你问问题时,你真的只想加入答案。