Seit die letzte LTS-Version von Symfony vor wenigen Tagen (30.11.2015) veröffentlicht wurde, habe ich angefangen, damit zu spielen. Leider kann ich keine CRUD mit Schreibaktionen mit demselben Code generieren, der in Symfony 2.7.7 einwandfrei funktioniert.
Zuerst erstelle ich ein neues Symfony-Projekt mit der bash
unter Linux Mint 17.2:
symfony new tasks lts
Das neue Verzeichnis tasks
wird mit einem neuen Symfony 2.8.0-Projekt erstellt.
Nach dem Anpassen der Datenbankanmeldeinformationen in app/config/parameters.yml
Ich erstelle die Datenbank:
app/console doctrine:database:create
und generiere ein neues Bundle:
app/console generate:bundle --namespace=Acme/TasksBundle --format=yml
Dann erstelle ich ein neues Verzeichnis src/Acme/TasksBundle/Resources/config/doctrine
und lege zwei Dateien für meine Modelle hinein. Diese sind:
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
Das Datenbankschema sollte wie folgt aussehen:
+----------------+ +--------------+
| task | | task_tag | +---------+
+----------------+ +--------------+ | tag |
| id |<--->| task_id | +---------+
| description | | tag_id |<--->| id |
+----------------+ +--------------+ | name |
+---------+
Jetzt kann ich die Entitäten generieren:
app/console generate:doctrine:entities AcmeTasksBundle
Dies funktioniert gut, sodass die Datenbank aktualisiert werden kann:
app/console doctrine:schema:update --force
Alles ok bis jetzt. Die Tabellen befinden sich in der Datenbank. Jetzt möchte ich CRUD mit Schreibaktionen generieren:
app/console generate:doctrine:crud --entity=AcmeTasksBundle:Task --with-write --format=yml
Nach Bestätigung einiger Fragen generiert es das CRUD und druckt Folgendes aus:
Generating the CRUD code: OK
und wirft danach diesen Fehler:
[Twig_Error_Runtime]
Key "tags" for array with keys "id, description" does not exist in "form/FormType.php.twig" at line 29
Der Controller wird erstellt, aber nicht das Formular.
Das Generieren des CRUD ohne Schreiboptionen funktioniert einwandfrei. Derselbe Code funktioniert einwandfrei mit Symfony 2.7.7.
Ich habe die Unterschiede in der Datei überprüft form/FormType.php.twig
zwischen den Versionen und hier sind die relevanten Teile:
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 %}
Wie ich sehe, ist die if-Bedingung in der for-Schleife der Ort, an dem der Fehler auftritt. (Ich nehme an, dass der Ausdruck fields_mapping[field]['type']
verursacht das Problem, da das Many-to-Many-Feld (tag
) hat kein Attribut type
.)
Was mache ich falsch? Wie kann ich dieses Problem lösen? Vielen Dank für Ihre Hilfe.
EDIT: Das gleiche Problem tritt bei Symfony 3.0.0 auf. Die Datei form/FormType.php.twig
wurde seit Version 2.8 geändert.