这里是我结束了使用DataTransformer
我ArticleType
:
class ArticleType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')
->add('description')
->add('category', CategoryType::class)
//...
新CategoryType
类:
class CategoryType extends AbstractType
{
protected $myService;
public function __construct(MyService $myService)
{
$this->myService = $myService;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$transformer = new CategoryTransformer($this->myService);
$builder->addModelTransformer($transformer);
}
}
注册为服务
app.form.category_type:
class: AppBundle\Form\CategoryType
arguments: ['@app.my.service']
tags:
- { name: form.type }
最后变压器:
class CategoryTransformer implements DataTransformerInterface
{
// ...MyService initialization...
public function transform($category)
{
if (null === $category) {
return '';
}
return $category->getName();
}
public function reverseTransform($categoryName)
{
if (!$categoryName) {
return null;
}
$category = $this->myService->getOrCreateCategoryFromName($categoryName);
if (null === $category) {
throw new TransformationFailedException();
}
return $category;
}
}
MyService
负责获取或创建使用实体管理器给定名称的类别。
相当一些代码行,但是一旦做到这一点,无论我会用我的形式,也可以在轻松的标准方式处理:
$articleForm = $this->createForm(ArticleType::class, $article);
$articleForm->handleRequest($request);
if ($articleForm->isValid()) {
$em->persist($article);
$em->flush();
//...
实际上,这不适用于集合,如果我们输入多个具有相同新“类别”的“Article” –