@ 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
}
다음
질문에 대한 답변의 작은 이력서 :
- 이 올바른 것입니다.
- 변환기 서비스에 별명이 필요하지 않습니다. 그러나 @ greg0ire가 말했듯이, 양식 유형에 맞는 서비스를 정의해야합니다.
getName()
함수는 사용해야하는 ID를 반환해야합니다. 정의 된 별명이거나 서비스 ID입니다. 일반적으로 사람들은 별칭을 getName
이 반환하는 값으로 사용합니다.
- 당신이 당신의 클래스에 엔티티 관리자를 전송하지, 그것이 null 값을 받아 들일 수 없기 때문에,이 PHP에 실패,이 방법 때문에
new CSV2TagsTransformer()
을 할 올바르지 않습니다.
희망이 도움이됩니다.
감사합니다,
매트
+1, 좋은 답변을 – greg0ire