2013-03-14 2 views
3

나는 최근 Symfony 2 양식을 사용하고 있는데, 이는 간단한 양식에 아주 좋습니다.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'); 
    } 
); 
} 

I 도메인 중심의 디자인과 우려의 특히 분리에 많은 관심을 지불하고로서, 나는 열심히 그 믿고 찾을 수 ...이 같은 제안 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

질문에 표시된 방법이 정확합니다. 엔터티 컬렉션을 '엔터티'유형의'choices' 옵션에 전달하십시오. –