2011-12-11 6 views
0

나는 Data Transformations을 읽고 있었다. 나는 약간 수정했다. 나는Symfony 2는 사용자 정의 양식 유형을 어떻게 찾습니까?

을 얻고있다

내가 변압기 사용하여 사용자 지정 양식 유형

class CSV2TagsType extends AbstractType { 
    public function buildForm(FormBuilder $builder, array $opts) { 
     $builder->appendClientTransformer(new CSV2TagsTransformer()); 
    } 
    public function getParent() { 
     return 'text'; 
    } 
    public function getName() { 
     return 'csv2tags'; 
    } 
} 

을 유형 "csv2tags"을로드 할 수 없습니다 : services.yml

에서

class CSV2TagsTransformer implements DataTransformerInterface { 
    /** 
    * @var EntityManager 
    */ 
    protected $em; 
    public function __construct(EntityManager $em) { 
     $this->em = $em; 
    } 
    // ... 
} 

services: 
    jm.blog.csv2tagsTransformer: 
     class: JM\BlogBundle\Form\DataTransformer\CSV2TagsTransformer 
     arguments: ["@doctrine.orm.entity_manager"] 

몇 가지 질문 :

  • 내가 변압기 대신 양식 유형 EntityManager 이동, 그 확인은?
  • 문서와 같이 변환기 서비스의 별칭을 선언하지 않았습니다. 양식 유형에 대한 별칭이 AbstractType::getName() 함수라고 생각 했습니까? 내 맞춤 양식을 서비스로 선언해야합니까?
  • EntityManager을 변압기로 옮겼습니다. new CSV2TagsTransformer()EntityManager이 없으면 올바른 일을 했습니까? 주요 문제에 관해서는

답변

3

@ greg0ire가 준 답변을 거의 완성 할 것입니다.

먼저 양식 작성자가 사용하는 양식 유형이므로 사용자가 정의한 서비스는 양식 유형 (CSV2TagsType)이어야하며 변환기 (CSV2TagsTransformer)가 아니어야합니다. 양식 작성자는 AbstractType을 예상하므로 데이터 변환기가 AbstractType이 아니므로 양식 정의기에서 서비스 정의와 함께 작동하지 않습니다. @ greg0ire가 말한대로 form.type 태그를 사용하여 사용자 정의 양식 유형에 태그를 지정해야합니다.

services: 
    jm.blog.csv2tagsType: 
    class: JM\BlogBundle\Form\Type\CSV2TagsType 
    arguments: ["@doctrine.orm.entity_manager"] 
    tags: 
     - { name: form.type, alias: csv2tags } 

당신이 준 별명 (cvs2tags) 또는 정의 된 서비스 ID (jm.blog.csv2tagsType)와 일치해야합니다 사용자 지정 양식 유형의 기능 getName에 의해 반환되는 값. 이것은 Symfony가 당신의 커스텀 타입을 찾을 수있는 방법입니다. 그것은 getName() 메소드에 의해 주어진 서비스 id를 찾으려고합니다.

데이터 변환기의 경우에는 문제가 있습니다. new CSV2TagsTransformer()을하고 있지만 엔티티 관리자를 전달하지 않습니다. 이로 인해 오류가 발생합니다. 서비스 방식으로 데이터 변환기를 삽입 할 방법이 없기 때문에 이런 식으로 할 수 없습니다.

엔터티 관리자를 사용자 지정 양식 유형에 삽입 한 다음 인스턴스화 할 때 데이터 변환기에 전달해야합니다.

class CSV2TagsType extends AbstractType 
{ 
    protected $em; 

    public function __construct(EntityManager $em) { 
     $this->em = $em; 
    } 

    public function buildForm(FormBuilder $builder, array $opts) { 
     $builder->appendClientTransformer(new CSV2TagsTransformer($this->em)); 
    } 

    // Rest of class 
} 

이렇게하면 양식 유형이 서비스로 정의되어 있기 때문에 가능한 양식 유형에 엔터티 관리자를 삽입합니다. 양식 유형에서 데이터 변환기를 인스턴스화하고 양식 유형에 삽입 된 엔티티 관리자를 구성합니다.

또 다른 방법은 데이터 변압기를 서비스로 선언 한 다음 양식 유형에 삽입하는 것입니다. 이렇게하면 데이터 변환기를 직접 인스턴스화하지 않지만 양식 유형의 생성자에 삽입 된 것을 사용합니다. 따라서 폼 유형에서 엔티티 관리자가 필요하지 않으면 삽입하지 않아도됩니다. 이 대안의 여기 예 :

services: 
    jm.blog.csv2tagsTransformer: 
    class: JM\BlogBundle\Form\DataTransformer\CSV2TagsTransformer 
    arguments: ["@doctrine.orm.entity_manager"] 

    jm.blog.csv2tagsType: 
    class: JM\BlogBundle\Form\Type\CSV2TagsType 
    arguments: ["@jm.blog.csv2tagsTransformer"] 
    tags: 
     - { name: form.type, alias: csv2tags } 

class CSV2TagsType extends AbstractType 
{ 
    protected $transformer; 

    public function __construct(CSV2TagsTransformer $transformer) { 
     $this->transformer= $transformer; 
    } 

    public function buildForm(FormBuilder $builder, array $opts) { 
     $builder->appendClientTransformer($this->transformer); 
    } 

    // Rest of class 
} 
다음

질문에 대한 답변의 작은 이력서 :

  1. 이 올바른 것입니다.
  2. 변환기 서비스에 별명이 필요하지 않습니다. 그러나 @ greg0ire가 말했듯이, 양식 유형에 맞는 서비스를 정의해야합니다. getName() 함수는 사용해야하는 ID를 반환해야합니다. 정의 된 별명이거나 서비스 ID입니다. 일반적으로 사람들은 별칭을 getName이 반환하는 값으로 사용합니다.
  3. 당신이 당신의 클래스에 엔티티 관리자를 전송하지, 그것이 null 값을 받아 들일 수 없기 때문에,이 PHP에 실패,이 방법 때문에 new CSV2TagsTransformer()을 할 올바르지 않습니다.

희망이 도움이됩니다.

감사합니다,
매트

+0

+1, 좋은 답변을 – greg0ire

1

, 당신의 services.yml 파일에서이 같은 form.type로 서비스를 태그로되어있다 : 다른 문제에 대한

services: 
    jm.blog.csv2tagsTransformer: 
     class: JM\BlogBundle\Form\DataTransformer\CSV2TagsTransformer 
     arguments: ["@doctrine.orm.entity_manager"] 
     tags: 
      - { name: form.type, alias: csv2tags } 

, 나는 아무 생각이 없습니다.

관련 문제