【问题标题】:Passing a parameter to Symfony's FormBuilder add()将参数传递给 Symfony 的 FormBuilder add()
【发布时间】:2014-08-11 16:15:32
【问题描述】:

我正在尝试显示一个表单,其中包含Survey x 中的所有Questions,以及来自User y 的Answer 数据。这些类具有以下关系:

  • User m-m Survey
  • Survey 1-m Question
  • Question 1-m Answer
  • User 1 米 Answer

问题对象通常包含所有答案的集合。我认为我很狡猾,因为我在 Question 上创建了一个方法,该方法将为特定用户返回答案:

class Question
{
    public function getAnswer(User $user)
    {
        return $this->getAnswers()->filter(function(Answer $answer) use ($user) {
            return $answer->getUserId() == $user->getId();
        })->first();
    }
}

暂时忽略急切加载的 filter() 调用;我不知道应该如何将它与 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');
    }
}

问题是框架试图通过调用$question->getAnswer() 来填充字段的数据,但由于它需要用户参数而失败。有没有办法传入那个参数?还是我应该从完全不同的角度来解决这个问题?

【问题讨论】:

  • 我认为您在查询问题时最好获得基于用户的答案。但是,您可以将用户传递给表单类型的构造函数。新的 QuestionType($user);
  • 我认为你是对的;在开始构建表单之前,我需要将对象图简化为正确的答案。您提到在构造上传递用户。那会有什么帮助?我在获取用户 ID 时没有遇到问题,而是将其用作过滤器。我会更新我的问题以使其更清楚。
  • 你是对的。我没有足够仔细地阅读您的原始问题。您可以遍历 $questions 并在开始表单内容之前对每个问题调用 setUser 。但你真的只是想在查询问题时加入答案。

标签: forms symfony formbuilder


【解决方案1】:

查看 Symfony 代码后,我发现您可以将选项数组传递给 Symfonys FormBuilder (http://api.symfony.com/2.4/Symfony/Component/Form/FormBuilderInterface.html#method_add)。所以你应该可以这样写:

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));
    }
}

请注意,我尚未对此进行测试。一般来说,源代码可以很好地说明选项。如果没有实现某个功能,您可以扩展该类并自己实现它。

【讨论】:

    【解决方案2】:

    最终,解决方案是确保初始对象图是正确的,而不是一旦涉及到 FormBuilder 就搞砸了。在将自定义参数放入 setter 方面,这似乎是最干净的方法:

    Symfony form: customize the setter that is called

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-08
      • 2017-08-23
      • 1970-01-01
      相关资源
      最近更新 更多