PHP / Symfony2:动态调用方法"#34;

时间:2014-04-15 17:32:54

标签: php symfony

我有一个问卷,我的用户需要填写。我有一个问卷实体,其属性为$ question1,$ question2,$ question3等。使用相应的方法getQuestion1(),setQuestion1()等。

我在控制器函数中收到的问题如下所示:

$questions = array("1" => 'Answer to question 1', "2" => 'Answer to question 2',...);

有没有办法可以在循环中“动态”调用相应的set方法,这样我就不必运行输出所有内容了?

类似的东西:

foreach ($questions as $key => $question)
{
    $questionnaire->setQuestion.$key($question);
}

我知道上面的内容不起作用,但有一些方法我可以这样做,因为有大约100个问题,我真的不想全部输入。也使控制器功能更通用,以便在以后添加/删除问题时,我不必对控制器功能进行任何更改。

2 个答案:

答案 0 :(得分:0)

我会从另一个角度接近:

如何仅为另一个名为Question实体打包?您可以在1:nQuestionnaire之间添加Question关系。 实体看起来像这样:

class Question {
    /**
     * @ORM\Column(type="text")
     */
    private $answer;

    /**
     * @ORM\ManyToOne(targetEntity="Questionnaire")
     */
    private $questionnaire;
}

另一方面是Questionnaire实体:

class Questionnaire {    
    /**
     * @ORM\OneToMany(targetEntity="Question")
     */
    private $questions;

    public function getQuestions()
    {
        return $this->questions;
    }
}

现在,您可以使用简单的Questions循环迭代覆盖Questionnaire的所有foreach

foreach ($questionnaire->getQuestions() as $question)  {
//...

这将为您提供以下优势:只需添加删除更改问题,而不会弄乱控制器表单类型代码。

编辑:

为了使用表单进行此操作,您应将其更改为:

public function buildForm(FormBuilderInterface $builder, array $options)
{
  $this->add(
    'question',
    'entity',
    array(
      'class' => 'Question'
      // any more options you want...
    )
  );      
  // ...

在你的控制器中调用它:

$questionnaire = new Questionnaire();
$questionnaire->addQuestion(/* ... */);

$this->createForm(new QuestionnaireType(), $questionnaire);
//...

作为模板,您可以使用以下内容:

{% for question in form.questions %}
     {{ form_widget(question) }}
{% endfor %}

答案 1 :(得分:-1)

$method = 'question' . $key;
$questionnaire->$method();