gpt4 book ai didi

php - 使用 Symfony 2.8 生成表单会抛出 Twig_Error_Runtime

转载 作者:IT王子 更新时间:2023-10-29 01:21:57 27 4
gpt4 key购买 nike

自从几天前(2015 年 11 月 30 日)发布了最新的 Symfony LTS 版本后,我就开始使用它了。不幸的是,我无法使用在 Symfony 2.7.7 中运行良好的相同代码生成具有写入操作的 CRUD。

首先,我在 Linux Mint 17.2 下使用 bash 创建一个新的 Symfony 项目:

symfony new tasks lts

新目录 tasks 被创建,里面有一个新的 Symfony 2.8.0 项目。

app/config/parameters.yml 中调整数据库凭据后,我创建了数据库:

app/console doctrine:database:create

并生成一个新包:

app/console generate:bundle --namespace=Acme/TasksBundle --format=yml

然后我创建一个新目录 src/Acme/TasksBundle/Resources/config/doctrine 并在其中放置我的模型的两个文件。它们是:

任务.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

标签.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

创建了 Controller ,但没有创建表单。

在没有写入选项的情况下生成 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 也会出现同样的问题。文件 form/FormType.php.twig 自 2.8 版以来已更改。

最佳答案

看起来像是 datetime fix 之后的回归在生成器包中。

一个快速的解决方案是在你的 composer.json 中恢复到 v2.*:

"sensio/generator-bundle": "^2.5",

最好的解决方案是 fork 存储库、修复错误并创建拉取请求以回馈社区。

由于您已经完成了隔离错误的所有工作,因此修复很简单:检查 Resources/skeleton/form/FormType.php.twig 中是否存在 type .有点像

{%- if fields_mapping[field]['type'] is defined and fields_mapping[field]['type'] in ['date', 'time', 'datetime'] %}

除非该错误基于相同的假设掩盖了更多隐藏的错误。

关于php - 使用 Symfony 2.8 生成表单会抛出 Twig_Error_Runtime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34066637/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com