Symfonyの最後のLTSバージョンが数日前(3011年11月30日)にリリースされてから、私はそれを試し始めました。残念ながら、私はSymfony 2.7.7でうまく動作する同じコードで書き込みアクションを持つCRUDを生成することはできません。Symfony 2.8でフォームを生成すると、Twig_Error_Runtimeがスローされます
まず私は、Linuxミント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
を作成し、私のモデルのための2つのファイルを配置します内部。これらは次のとおりである:
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
すべてOK。テーブルはデータベースにあります。
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を生成して出力しますいくつかの質問を確認した後
app/console generate:doctrine:crud --entity=AcmeTasksBundle:Task --with-write --format=yml
:今、私は、ライトアクションでCRUDを生成したいですコントローラは作成されますが、フォームは作成されません。
書き込みオプションなしでCRUDを生成すると問題なく動作します。非常に同じコードがSymfony 2.7.7で完璧に動作します。
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:
私は関連する部分をバージョン間でファイルform/FormType.php.twig
の違いをチェックし、ここにいます。私は、forループであれば条件を見るとわかるように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 %}
は、エラーが発生した場所です。 (多くのフィールド(tag
)には属性type
がないため、式fields_mapping[field]['type']
が問題を引き起こすと仮定します)
私は間違っていますか?どうすればこの問題を解決できますか?ご助力ありがとうございます。
EDIT: Symfony 3.0.0でも同じ問題が発生します。ファイルform/FormType.php.twig
がバージョン2.8以降に変更されました。
ありがとうございました!私は私の研究成果で長い答えを書いているだけです。私の解決策はわずかに異なりますが、アイデアは同じです。 – cezar