J’ai décidé de créer un projet avec Symfony 2. Je vais donc en profiter pour mettre quelques notes à ce sujet sur ce blog, au fur et à mesure des bugs que j’ai rencontré. Cela fait trop longtemps que je corrige des bugs, et que, une fois confronté au même problème 6 mois plus tard, je reprends la méthode « essai/erreur » pour le résoudre… Désormais, tout (ou presque) sera consigné ici, et consultable par tous !

Pour démarrer, je vais expliquer comment j’ai installé Symfony2 sous OS X Lion, et créé un simple accès à la base de données en CRUD (Create, Read, Update, Delete).

Installation

J’ai bien entendu téléchargé Symfony2 (v. 2.0.4) sur le site de Sensio Labs. J’ai ensuite décompressé le fichier dans le répertoire « Sites » de mon mac. J’ai renommé le dossier « Symfony » nouvellement créé en « monapp ».

J’ai lancé le terminal et fait le premier test.

cd ~/Sites/monapp
php app/check.php

Et corrigé les erreurs selon ce que Symfony2 me dit. Une étape incontournable est de changer les permissions de certains répertoires en 777 :

chmod -R 777 /Users/ced/Sites/upsendr/app/cache/
chmod -R 777 /Users/ced/Sites/upsendr/app/logs/

Le -R indique au script que l’intégralité du dossier, avec ses sous-dossiers, doit être passé en 777.

Ensuite, un petit tour vers http://votreserveur/monapp/app_dev.php/config.php pour la configuration de la base de données, etc.

On rentre dans le lard !

Dans le terminal, et toujours au sein du dossier de mon appli, j’ai créé un bundle en suivant les options par défaut :

./app/console generate:bundle

Notez qu’il faut lui donner un espace de nom (namespace), et qu’il doit finir par le terme Bundle : « Delalande/BlogBundle », par exemple. Ensuite, il faut lui donner un nom, idéalement basé sur ce que vous avez indiqué avant, comme « DelalandeBlogBundle ». J’ai ensuite validé les options proposées, mais répondu « yes » à la question suivante :

Do you want to generate the whole directory structure [no]?

Une fois notre Bundle créé, nous avons une coquille vide. Il faut la remplir avec une structure liée à la base de données. On fait donc appel à Doctrine pour créer une entité.

./app/console gen:doctrine:entity

J’ai donc créé le shortcut tel que demandé :

The Entity shortcut name: DelalandeBlogBundle:Post

Puis validé le format de configuration (ici, Annotation)

J’ai ensuite créé mes champs :

New field name (press  to stop adding fields): content   
Field type [string]:
Field length [255]:
New field name (press  to stop adding fields): private
Field type [string]: boolean
New field name (press  to stop adding fields): payerdate
Field type [string]: datetime
New field name (press  to stop adding fields):
Do you want to generate an empty repository class [no]?

…et confirmé.

Vient ensuite le moment où cette entité va prendre « vie » sur la base de données :

./app/console doctrine:database:create
./app/console doctrine:schema:update --force

Si vous vérifiez votre serveur de base de données, une base portant le nom de celle spécifiée lors de l’installation de Symfony a été créée, et la table correspondante ajoutée.

L’étape suivante est la création des vues et du contrôleur de l’entité générée. Il suffit de taper :

./app/console doctrine:generate:crud

De rappeler le raccourci :

The Entity shortcut name: DelalandeBlogBundle:Post

Puis :

Do you want to generate the "write" actions [no]? yes

et valider le reste ! Allez faire un tour sur http://votreserveur/monapp/app_dev.php/post et faites mumuse avec les champs de votre base de donnée !

Autoriser un champ NULL dans l’interface CRUD

J’ai créé un champ de « private » type Boolean. Ce champ n’a pas la possibilité d’être NULL, ce qui le rend par ailleurs complètement inutile, à moins qu’il ne serre à une validation de CGV, par exemple.

Pour autoriser « private » à être décoché, il faut se rendre dans src/Delalande/BlogBundle/Entity/Post.php et modifier :

/**
* @var boolean $private
*
* @ORMColumn(name="private", type="boolean")
*/
private $private;

en

/**
* @var boolean $private
*
* @ORMColumn(name="private", type="boolean", nullable="true")
*/
private $private;

J’ai également modifié le champ directement dans la base de données, en autorisant une valeur NULL.

Ainsi, mon champ « private » peut être activé, ou non.