我有一个问卷,我的用户需要填写。我有一个问卷实体,其属性为$ 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个问题,我真的不想全部输入。也使控制器功能更通用,以便在以后添加/删除问题时,我不必对控制器功能进行任何更改。
答案 0 :(得分:0)
我会从另一个角度接近:
如何仅为另一个名为Question
的实体打包?您可以在1:n
和Questionnaire
之间添加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();