2013-03-14 2 views
3

В последнее время я пытаюсь использовать формы Symfony 2, которые довольно хороши для простых форм.Разделение проблем с формами Symfony

Но для использования в отдельных ячейках или что-то в этом роде. Мне часто нужен список связанных объектов в форме. В нескольких Symfony и · блоги, · документы, они предлагают что-то вроде этого ...

//BlogPostType implements FormTypeInterface 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
    ->add('category', null, array(
    'property' => 'name', 
    'query_builder' => function(EntityRepository $er) use($options) { 
     return $er->createQueryBuilder('category')->orderBy('category.name', 'ASC'); 
    } 
); 
} 

Как я обращаю много внимания к области управляемых-дизайна и особенно разделения проблем, мне трудно поверить, что только для привязки связанных объектов к типу пользовательской формы в Symfony, запрашивая его в пользовательском типе формы.

На мой взгляд, это нарушает SoC, потому что формы не должны запрашивать. Таким образом, форма всегда принимает те же объекты, но не форма, которая должна выбирать, какие объекты отображаются ...

Контроллер, который просит конструктора форм построить форму, должен вставлять связанные объекты в конструктор типа пользовательской формы или так ...

//BlogPostType implements FormTypeInterface 
public function __construct(array $categories) { 
    $this->categories = $categories; 
} 

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
    ->add('category', null, array(
     'property' => 'name', 
     'choices' => $this->categories 
    ); 
} 

Кто-нибудь знает, как это можно достичь?

ответ

6

Да, вы можете передать выбор с контроллера. Просто создайте опцию вместо того, чтобы вводить ее через конструктор, потому что конструктор будет использоваться только при создании первой формы заданного типа для каждого запроса. Итак, если вам нужно вывести на страницу более одной формы того же типа, их выбор будет таким же, если он передается через конструктор.

Внедрение чего-либо в тип формы с помощью конструктора имеет смысл, когда вы вводите услуги, которые можно повторно использовать несколько раз без каких-либо проблем.

Многие примеры в документах и ​​в Интернете нарушают множество лучших практик, но было бы гораздо труднее научить новичка чему-то примерам, соблюдающим практику.

+0

Хорошо, чтобы передать его через параметры, но как передать список сущностей в элемент управления формы «entity». Согласно документации Symfony, я могу запросить только объекты ... – Stivni

+2

Правильно указан путь к вашему вопросу - просто передайте набор объектов в опцию 'choice' типа' entity'. –