最近几天Symfony发布了最新的LTS版本(2015年11月30日),我开始研究它。不幸的是,我无法使用在Symfony 2.7.7中正常工作的相同代码生成带有写操作的CRUD。
首先我使用Linux Mint 17.2下的bash
创建了一个新的Symfony项目:
symfony new tasks lts
在一个新的Symfony 2.8.0项目中,创建了一个名为tasks
的新目录。
在调整了app/config/parameters.yml
中的数据库凭据后,我创建了数据库:
app/console doctrine:database:create
并生成一个新的打包文件:
app/console generate:bundle --namespace=Acme/TasksBundle --format=yml
然后我创建一个新目录 src/Acme/TasksBundle/Resources/config/doctrine
并在其中放置两个文件来定义我的模型。这些文件分别是:Task.orm.yml
Acme\TasksBundle\Entity\Task:
type: entity
repositoryClass: Acme\TasksBundle\Repository\TaskRepository
table: task
id:
id:
type: integer
generator: { strategy : AUTO }
fields:
description:
type: text
manyToMany:
tags:
targetEntity: Tag
inversedBy: tasks
cascade: [ "persist" ]
joinTable:
name: task_tag
joinColumns:
task_id:
referencedColumnName: id
inverseJoinColumns:
tag_id:
referencedColumnName: id
Tag.orm.yml
Acme\TasksBundle\Entity\Tag:
type: entity
repositoryClass: Acme\TasksBundle\Repository\TagRepository
table: tag
id:
id:
type: integer
generator: { strategy : AUTO }
fields:
name:
type: string
length: 50
manyToMany:
tasks:
targetEntity: Task
mappedBy: tags
数据库模式应该像这样:
+----------------+ +--------------+
| task | | task_tag | +---------+
+----------------+ +--------------+ | tag |
| id |<--->| task_id | +---------+
| description | | tag_id |<--->| id |
+----------------+ +--------------+ | name |
+---------+
现在我可以生成实体:
app/console generate:doctrine:entities AcmeTasksBundle
这个代码可以正常运行,因此数据库可以被更新:
app/console doctrine:schema:update --force
到目前为止一切都好。 表已经在数据库中了。现在我想生成带有写入操作的CRUD:
app/console generate:doctrine:crud --entity=AcmeTasksBundle:Task --with-write --format=yml
确认了几个问题后,它生成CRUD并打印出:
Generating the CRUD code: OK
然后出现以下错误:
[Twig_Error_Runtime]
Key "tags" for array with keys "id, description" does not exist in "form/FormType.php.twig" at line 29
控制器被创建,但表单未被创建。
没有编写选项生成CRUD能正常工作。相同的代码在Symfony 2.7.7中运行完美无缺。
我检查了版本间 form/FormType.php.twig
文件的区别,以下是相关部分:
Symfony 2.7.7
vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle/Resources/skeleton/form/FormType.php.twig
{%- if fields|length > 0 %}
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
{%- for field in fields %}
->add('{{ field }}')
{%- endfor %}
;
}
{% endif %}
Symfony 2.8.0
vendor/sensio/generator-bundle/Resources/skeleton/form/FormType.php.twig
{%- if fields|length > 0 %}
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
{%- for field in fields -%}
{%- if fields_mapping[field]['type'] in ['date', 'time', 'datetime'] %}
->add('{{ field }}', '{{ fields_mapping[field]['type'] }}')
{%- else %}
->add('{{ field }}')
{%- endif -%}
{%- endfor %}
;
}
{% endif %}
在for循环的if条件语句中,我认为错误发生的地方就在那里。(我猜测表达式fields_mapping[field]['type']
引起了问题,因为多对多字段(tag
)没有type
属性。)
我做错了什么?我怎样才能解决这个问题?非常感谢您的帮助。
编辑: 在Symfony 3.0.0中也会出现相同的问题。自版本2.8以来,文件form/FormType.php.twig
已更改。