Poiché l'ultima versione LTS di Symfony è stata rilasciata pochi giorni fa (30.11.2015) ho iniziato a giocarci. Sfortunatamente non riesco a generare un CRUD con azioni di scrittura con lo stesso codice che funziona bene in Symfony 2.7.7.Generazione di moduli con Symfony 2.8 genera un Twig_Error_Runtime
Per prima cosa ho creare un nuovo progetto Symfony utilizza il bash
sotto Linux Mint 17.2:
symfony new tasks lts
La nuova directory tasks
viene creato con un nuovo progetto Symfony 2.8.0 dentro.
Dopo aver adattato le credenziali del database in app/config/parameters.yml
ho creare il database:
app/console doctrine:database:create
e generare un nuovo bundle:
app/console generate:bundle --namespace=Acme/TasksBundle --format=yml
Poi creo una nuova directory src/Acme/TasksBundle/Resources/config/doctrine
e posizionare due file per i miei modelli dentro. Questi sono:
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
Lo schema del database dovrebbe in questo modo:
+----------------+ +--------------+
| task | | task_tag | +---------+
+----------------+ +--------------+ | tag |
| id |<--->| task_id | +---------+
| description | | tag_id |<--->| id |
+----------------+ +--------------+ | name |
+---------+
ora posso generare il entità:
app/console generate:doctrine:entities AcmeTasksBundle
Questo funziona bene, in modo che il database può essere aggiornato:
app/console doctrine:schema:update --force
Tutto ok fino ad ora. Le tabelle sono nel database. Ora voglio generare CRUD con le azioni di scrittura:
app/console generate:doctrine:crud --entity=AcmeTasksBundle:Task --with-write --format=yml
Dopo aver confermato alcune domande genera il CRUD e stampa:
Generating the CRUD code: OK
e poi getta questo errore:
[Twig_Error_Runtime]
Key "tags" for array with keys "id, description" does not exist in "form/FormType.php.twig" at line 29
Il il controller viene creato, ma non il modulo.
Generare il CRUD senza opzioni di scrittura funziona correttamente. Lo stesso codice funziona perfettamente con Symfony 2.7.7.
ho controllato le differenze nel file form/FormType.php.twig
tra le versioni e qui ci sono le parti pertinenti:
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 %}
A mio if condizione nel ciclo for è il luogo in cui si è verificato l'errore. (Suppongo che l'espressione fields_mapping[field]['type']
causa il problema dal momento che il campo molti a molti (tag
) non ha attributi type
.)
Quello che sto facendo male? Come posso risolvere questo problema? Grazie mille per il tuo aiuto.
MODIFICA: Lo stesso problema si verifica con Symfony 3.0.0. Il file form/FormType.php.twig
è stato modificato dalla versione 2.8.
Grazie! Sto solo scrivendo una lunga risposta con i miei risultati di ricerca. La mia soluzione è leggermente diversa, ma l'idea è la stessa. – cezar