2015-12-03 4 views
25

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以降に変更されました。

答えて

15

私はちょっと調べて、エラーをデバッグしようとしました。

上記のとおり、ファイルform/FormType.php.twigはバージョン2.8.0以降に変更されています。

明らかに、Symfonyメーカーはフォームを拡張し、タイプdate,timeおよびdatetimeを自動的に解決したいと考えました。これは、行に起こる:

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

これは、アレイfields_mappingの助けを借りて達成されなければなりません。

いくつかの迅速で汚れた回避策を使用して、fields_mappingの中に何が隠されているかを調べようとしました。

タスク

{ 
    id => { 
     id => 1, 
     fieldName => id, 
     type => integer, 
     columnName => id 
    }, 
    description => { 
     fieldName => description, 
     type => text, 
     columnName => description 
    } 
} 

それはフィールドtagsを通過する最後のステップで、タスクのフィールドを反復処理:これは私のモデルの結果です。 if節の式は次のようになります。

fields_mapping['tags']['type'] 

我々は、前の例でわかるとおり、唯一iddescriptionタスクのためのfields_mappingにはキーtagsはありません。キーtagsが存在しないため、エラーがスローされます。

私はこのように見えるようにファイルform/FormType.php.twigに懸念の行を変更:

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

今、私たちは新しい機能を使用することができますし、我々は、キーが配列に存在するかどうかをチェックしてエラーを防ぎます。

これはバグか、私の特別なケースで何か問題があるかどうかわかりません。バージョン2.8.0と3.0.0がリリースされてからすでに1週間が経過しているので、おそらく何千人ものユーザーが遊んでいるはずです。私はそれがバグだと誰もが気づいていないと信じられませんでした。

EDIT:

私はGitHubの上の問題を掲載:

https://github.com/sensiolabs/SensioGeneratorBundle/issues/443

これは私が思った以上書いたように、同じ方法で解決されたバグであった:

https://github.com/Maff-/SensioGeneratorBundle/commit/205f64e96a94759f795271cb00fc86fb03b1fd4a

17

発電機のバンドルにdatetime fixの後に回帰のように見えます。

迅速な解決にはV2に戻すことである*あなたのcomposer.jsonに:。

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

最善の解決策は、レポをフォークバグを修正し、地域社会に戻って貢献するプルリクエストを作成することです。

バグを隔離するために既にすべての作業を行っているので、修正は簡単です。typeResources/skeleton/form/FormType.php.twigに存在するかどうかを確認してください。何かのように

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

同じ想定に基づいてより多くの隠れたエラーをマスクしない限り、

+0

ありがとうございました!私は私の研究成果で長い答えを書いているだけです。私の解決策はわずかに異なりますが、アイデアは同じです。 – cezar

3

固定バンドルを更新した後でも、問題はまだ存在しますが、時には最も簡単な方法です問題を解決するには、カタログvendorを削除し、作曲家を更新してください。

関連する問題