Jul
2
2010

Créer un nouveau projet sous Symfony

Devant explorer de près le framework Symfony, j'ai suivi différents tutoriaux, dont l'excellent Practical Symfony, que je suis en train de terminer petit à petit. Cependant, celui-ci traîne peut-être un peu en longueur par moment, et je trouve l'application peut-être légèrement complexe pour un apprentissage aisé. C'est pourquoi je vous propose une alternative qui sera, ne nous le cachons pas, inspiré de ce premier.

Le but de cette série de billets sera de vous faire partager mon expérience naissante sur ce framework PHP en créant une application de ToDo-List. Celle-ci comprendra un espace membres basique (afin que chacun ne voit que les tâches qui lui sont attribuées) et également quelques autres petites fonctionnalités.

[Note : ce tutoriel est réalisé sous Windows mais est facilement transposable sous Linux. Seule la partie de modification de la variable d'environnement Path n'a pas lieue d'être avec le pingouin.]

Installation de Symfony

Pour installer Symfony, rien de plus simple. Je suppose tout d'abord que le lecteur sait configurer un VirtualHost avec la solution qu'il utilise habituellement (étant sous Windows pour jouer à WoW essentiellement - je sais, c'est le mal ! - j'utilise UwAmp, que je trouve plus pratique que Wamp). Nous nommerons ce projet Toudoo par la suite.

Test de la configuration (1/2)

Tout d'abord, vérifions que les paramètres requis par Symfony sont bien configurés sur votre machine. Pour ce faire, il existe un script récupérable à l'adresse :

http://sf-to.org/1.4/check.php

Téléchargez-le, et placez-le dans votre DocumentRoot.

Nous allons à présent devoir l'exécuter en deux temps. Une première fois en ligne de commandes, et une seconde fois à travers votre navigateur. Pourquoi tester deux fois ? Car la configuration en CLI (ligne de commandes) n'est pas la même que celle pour les navigateurs. C'est d'ailleurs une source d'erreurs assez fréquente lorsque l'on commence à utiliser l'interface console.

Commençons par le plus facile : le test à travers le navigateur. Ouvrez donc ce fichier en vous servant du VirtualHost configuré précédemment.

********************************
*                              *
*  symfony requirements check  *
*                              *
********************************

php.ini used by PHP: C:UwAmpapachephp.ini

** Mandatory requirements **

  OK        PHP version is at least 5.2.4 (5.2.13)

** Optional checks **

  OK        PDO is installed
  OK        PDO has some drivers installed: mysql, sqlite, sqlite2
  OK        PHP-XML module is installed
  OK        XSL module is installed
  OK        The token_get_all() function is available
  OK        The mb_strlen() function is available
  OK        The iconv() function is available
  OK        The utf8_decode() is available
[[WARNING]] The posix_isatty() is available: FAILED
            *** Install and enable the php_posix extension (used to colorized the CLI output) ***
[[WARNING]] A PHP accelerator is installed: FAILED
            *** Install a PHP accelerator like APC (highly recommended) ***
  OK        php.ini has short_open_tag set to off
  OK        php.ini has magic_quotes_gpc set to off
  OK        php.ini has register_globals set to off
  OK        php.ini has session.auto_start set to off
  OK        PHP version is not 5.2.9

Comme nous pouvons le constater, nous avons deux avertissements. Ceux-ci ne sont pas dramatiques et n'empêchent en rien le bon fonctionnement du framework. L'absence de posix_isatty ne coloriera pas les retours en mode console (et n'est de toute façon pas disponible sous Windows), et l'accélérateur PHP n'a que peu d'importance en développement (mais s'avère vital pour gérer une bonne montée en charge en environnement de production). Nous ne nous attarderons donc pas dessus. On peut donc considérer que tout est opérationnel.

Modification de la variable d'environnement Path

Testons à présent en mode console. Tout d'abord, et afin d'éviter d'avoir à écrire de trop longues commandes (oui, le geek est fainéant à la base, ne l'oublions pas !), nous allons modifier la variable d'environnement Path qui contient les dossiers à partir desquels nous pouvons appeler directement un exécutable. Pour ce faire : Menu Démarrer > Clic-droit sur Ordinateur > Propriétés > Paramètres systèmes avancés > Variables d'environnement.

[troll]Vive la simplicité de Windows ![/troll]

Variable d'environnement PATH

Dans le fenêtre (enfin) ouverte, recherchez la variable Path, et ajoutez le dossier contenant le binaire php.exe. Sous UwAmp, on rajoutera à la fin de la liste de dossiers (séparés par des points virgules) le dossier C:\UwAmp\apache\php_5.3.2.

Démarrons donc une invite de commandes (touche Windows + R ; tapez cmd). Grâce à notre changement de variable d'environnement, nous pourrons appeler l'interpréteur PHP directement grâce à la ligne de commande :

php

Sans, il aurait fallu écrire :

C:\UwAmp\apache\php_5.3.2\php

Vous comprenez à présent pourquoi cette modification est importante ! :)

Test de la configuration (2/2)

Plaçons nous donc dans notre dossier et exécutons le même script (à savoir check_configuration.php). Bien entendu, il faudra changer le nom de dossier par le votre. ;)

D:
cd Sites\toudoo
php check_configuration.php

On obtient alors davantage d'avertissements (par défaut) :

********************************
*                              *
*  symfony requirements check  *
*                              *
********************************

php.ini used by PHP: WARNING: not using a php.ini file

** WARNING **
*  The PHP CLI can use a different php.ini file
*  than the one used with your web server.
*  (especially on the Windows platform)
*  If this is the case, please launch this
*  utility from your web server.
** WARNING **

** Mandatory requirements **

  OK        PHP version is at least 5.2.4 (5.3.2)

** Optional checks **

  OK        PDO is installed
[[WARNING]] PDO has some drivers installed: : FAILED
            *** Install PDO drivers (mandatory for Propel and Doctrine) ***
  OK        PHP-XML module is installed
[[WARNING]] XSL module is installed: FAILED
            *** Install and enable the XSL module (recommended for Propel) ***
  OK        The token_get_all() function is available
[[WARNING]] The mb_strlen() function is available: FAILED
            *** Install and enable the mbstring extension ***
  OK        The iconv() function is available
  OK        The utf8_decode() is available
[[WARNING]] The posix_isatty() is available: FAILED
            *** Install and enable the php_posix extension (used to colorized the CLI output) ***
[[WARNING]] A PHP accelerator is installed: FAILED
            *** Install a PHP accelerator like APC (highly recommended) ***
[[WARNING]] php.ini has short_open_tag set to off: FAILED
            *** Set it to off in php.ini ***
[[WARNING]] php.ini has magic_quotes_gpc set to off: FAILED
            *** Set it to off in php.ini ***
  OK        php.ini has register_globals set to off
  OK        php.ini has session.auto_start set to off
  OK        PHP version is not 5.2.9

On voit bien que le fichier de configuration utilisé n'est pas le même. La solution ? Utiliser le même. ;)

Pour ce faire, copiez le fichier C:\UwAmp\apache\php.ini dans C:\UwAmp\apache\php_5.3.2\php.ini. Si le fichier n'existe pas, créez le. Puis, redémarrez votre serveur Apache, et réessayez. Le test devrait à présent être concluant (malgré l'appartion de deux messages d'erreurs chez moi indiquant que les fichiers php_exif.dll et php_mbstring.dll sont manquants... ce qui n'a pas l'air d'influer sur la suite).

Une fois que la configuration est opérationnelle, on supprime le fichier check_configuration.php. Fichier avec un nom standard, il pourrait révéler certaines choses à un pirate potentiel. Jouons donc la carte de la sécurité. ;)

Déploiement du framework Symfony

Après tant de vérification et de configuration ô combien pas très passionante, nous pouvons enfin téléchargez Symfony. Nous prendrons la dernière version stable (ici, la 1.4) afin de profiter des dernières nouveautés du framework.

Décompressez-là dans un dossier (par convention) lib/vendor/ de votre DocumentRoot. Il est important de respecter toutes les conventions de nommage utilisées lors de l'utilisation d'un framework. Et encore plus pour Symfony, qui utilise tout un ensemble de scripts de génération automatique qui nous feront gagner un temps précieux.

Retournons donc en ligne de commande, et exécutons le script suivant :

php lib/vendor/data/bin/symfony generate:project toudoo

La sortie de ce script est assez impressionante. Mais rien de bien extraordinaire, si ce n'est la création de toute l'arborescence de dossiers du projet.

>> dir+      D:/Sites/toudoo/apps
>> dir+      D:/Sites/toudoo/cache
>> dir+      D:/Sites/toudoo/config
>> file+     D:/Sites/toudoo/config/ProjectConfiguration.class.php
>> file+     D:/Sites/toudoo/config/properties.ini
>> file+     D:/Sites/toudoo/config/rsync_exclude.txt
>> dir+      D:/Sites/toudoo/data
>> dir+      D:/Sites/toudoo/data/fixtures
>> file+     D:/Sites/toudoo/data/fixtures/fixtures.yml
>> dir+      D:/Sites/toudoo/lib/form
>> file+     D:/Sites/toudoo/lib/form/BaseForm.class.php
>> dir+      D:/Sites/toudoo/log
>> dir+      D:/Sites/toudoo/plugins
>> file+     D:/Sites/toudoo/symfony
>> dir+      D:/Sites/toudoo/test
>> dir+      D:/Sites/toudoo/test/bootstrap
>> file+     D:/Sites/toudoo/test/bootstrap/functional.php
>> file+     D:/Sites/toudootest/bootstrap/unit.php
>> dir+      D:/Sites/toudoo/test/functional
>> dir+      D:/Sites/toudoo/test/unit
>> dir+      D:/Sites/toudoo/web
>> file+     D:/Sites/toudoo/web/.htaccess
>> dir+      D:/Sites/toudoo/web/css
>> file+     D:/Sites/toudoo/web/css/main.css
>> dir+      D:/Sites/toudoo/web/images
>> dir+      D:/Sites/toudoo/web/js
>> file+     D:/Sites/toudoo/web/robots.txt
>> dir+      D:/Sites/toudoo/web/uploads
>> dir+      D:/Sites/toudoo/web/uploads/assets
>> tokens    D:/Sites/toudoo/config/ProjectConfiguration.class.php
>> tokens    D:/Sites/toudoo/config/properties.ini
>> tokens    D:/Sites/toudoo/config/rsync_exclude.txt
>> tokens    D:/Sites/toudoo/config/ProjectConfiguration.class.php
>> tokens    D:/Sites/toudoo/config/properties.ini
>> tokens    D:/Sites/toudoo/config/rsync_exclude.txt
>> tokens    D:/Sites/toudoo/lib/form/BaseForm.class.php
>> file+     D:/Sites/toudoo/config/databases.yml
>> dir+      D:/Sites/toudoo/config/doctrine
>> file+     D:/Sites/toudoo/config/doctrine/schema.yml
>> chmod 777 D:/Sites/toudoo/web/uploads
>> chmod 777 D:/Sites/toudoo/cache
>> chmod 777 D:/Sites/toudoo/log
>> chmod 777 D:/Sites/toudoo/symfony
>> chmod 777 D:/Sites/toudoo/web/uploads/assets
>> tokens    D:/Sites/toudoo/config/databases.yml
>> tokens    D:/Sites/toudoo/config/doctrine/schema.yml
>> tokens    D:/Sites/toudoo/config/ProjectConfiguration.class.php
>> tokens    D:/Sites/toudoo/config/properties.ini
>> tokens    D:/Sites/toudoo/config/rsync_exclude.txt
>> tokens    D:/Sites/toudoo/lib/form/BaseForm.class.php

Je ne m'étendrais pas davantage sur l'utilité de tel ou tel dossier. Nous verrons cela progressivement.

On remarquera simplement la création d'un fichier symfony à la racine de notre dossier, qui est simplement un lien vers le fichier /lib/vendor/data/bin/symfony. Encore une fois, on évitera ainsi de trop se fatiguer en écrivant du texte inutile. ;)

Il est temps à présent de créer une application. En gros, une application sera simplement un ensemble de fichiers qui s'appuiera sur les mêmes données d'un site. Nous allons générer la partie utilisateur (frontend). Soit :

php symfony generate:app frontend

Encore une fois, pas mal de blablas en sortie :

>> dir+      D:/Sites/toudoo/apps/frontendconfig
>> file+     D:/Sitestoudooapps/frontendconfig/app.yml
>> file+     D:/Sitestoudooapps/frontend/c...licationConfiguration.class.php
>> file+     D:/Sitestoudooapps/frontend/config/cache.yml
>> file+     D:/Sitestoudooapps/frontend/config/factories.yml
>> file+     D:/Sites/toudoo/apps/frontend/config/filters.yml
>> file+     D:/Sites/toudoo/apps/frontend/config/routing.yml
>> file+     D:/Sites/toudoo/apps/frontend/config/security.yml
>> file+     D:/Sites/toudoo/apps/frontend/config/settings.yml
>> file+     D:/Sites/toudoo/apps/frontend/config/view.yml
>> dir+      D:/Sites/toudoo/apps/frontend/i18n
>> dir+      D:/Sites/toudoo/apps/frontend/lib
>> file+     D:/Sites/toudoo/apps/frontend/lib/myUser.class.php
>> dir+      D:/Sites/toudooapps/frontend/modules
>> dir+      D:/Sites/toudooapps/frontend/templates
>> file+     D:/Sites/toudooapps/frontend/templates/layout.php
>> tokens    D:/Sites/toudoo/apps/frontend/config/settings.yml
>> file+     D:/Sites/toudoo/web/index.php
>> file+     D:/Sites/toudoo/web/frontend_dev.php
>> tokens    D:/Sites/toudoo/web/index.php
>> tokens    D:/Sites/toudoo/web/frontend_dev.php
>> rename    D:/Sites/toudoo/apps/frontend/c...frontendConfiguration.class.php
>> tokens    D:/Sites/toudoo/apps/frontend/c...frontendConfiguration.class.php
>> chmod 777 D:/Sites/toudoo/web/uploads
>> chmod 777 D:/Sites/toudoo/cache
>> chmod 777 D:/Sites/toudoo/log
>> chmod 777 D:/Sites/toudoo/symfony
>> chmod 777 D:/Sites/toudoo/web/uploads/assets
>> dir+      D:/Sites/toudoo/test/functional/frontend

Il est temps de changer légèrement la configuration de notre serveur Web, maintenant que le projet est configuré. On remarque la présence d'un dossier web. C'est en fait le DocumentRoot de notre projet. Cela nous assurera que l'internaute ne pourra farfouiller gaiement dans le fichier de configuration des accès à la base de données par exemple, qui lui est situé à l'extérieur (dans config). On modifie donc le DocumentRoot de notre VirtualHost.

Puis, ouvrez votre projet dans votre navigateur, pour voir ce que ça donne.

Symfony sans CSS

Ca a l'air de marcher, mais c'est plutôt hideux, non ? Et pour cause : aucun CSS n'est chargé. En regardant dans le code source, on remarque l'appel à une feuille de style située à l'adresse /sf/sf_default/css/screen.css. Problème, aucun dossier sf n'est présent dans le dossier web/. Que faire ? Simplement mettre en place le bon alias dans votre fichier de configuration, dans la partie correspondante à votre VirtualHost. Vous pouvez également le faire graphiquement avec UwAmp, ce qui est plus simple et plus rapide (je trouve).

Alias /sf "D:\Sites\toudoo\lib\vendor\symfony\data\web\sf"

Redémarrez votre serveur Apache pour qu'il prenne en compte vos modifications, et réessayez de visualiser votre site.

Symfony - Page par défaut

Félicitations ! Vous venez de déployer le framework Symfony sur votre premier projet ! Vous avez également déployé un environnement de développement, volontairement éclipsé (comme l'IDE :p) dans ce billet, car il se verra attribué un article à lui tout seul.

N'hésitez pas à faire part de vos remarques. Grand débutant en Symfony, je n'ai sans doute pas tous les réflexes des codeurs les plus aguerris en la matière ! ;)

La suite de cette série de tutoriaux avec le billet Symfony : modèle de données et module.

10 Comments + Add Comment

  • Pas mal du tout ! Vivement le prochain où tu vas détailler toute l'arborescence.

    Je l'avais testé moi-même (il est toujours perdu quelque part dans un virtual host) mais j'avais trop galéré pour créer un premier triptyque modèle vue controlleur et était retourné sur zend et wordpress hihi

  • Très bon tuto pour un débutant comme moi... Je te félicite ! Mais en lisant Pratical Symfony en parallèle du tien, je vois qu'a la fin on aura une interface avec la barre d'outils web de débogage dans le coin supérieur droit ! Ce qui n'est pas le cas sur mon interface. o_O"

    Pour cela, j'aimerai bien, si c'est possible, être guidé pour avoir une interface incluant la barre d'outils Web.

    Merci d'avance.

    • Merci pour tes félicitations. Content que mes tutoriaux continuent de plaire, même si je n'ai pas autant de temps que je le souhaiterai pour en ajouter suffisamment...

      Pour ta barre d'outils, il faut regarder dans les contrôleurs frontaux (les fichiers web/frontend_dev.php, web/backend_dev.php, etc...) et regarder les arguments de la méthode getApplicationConfiguration :

      ProjectConfiguration::getApplicationConfiguration('app', 'dev', 0);

      Le premier argument est le nom de l'application, le second l'environnement, et le troisième (booléen, qui ne se voit pas ici pour des raisons de mise en page) indique si l'on veut afficher ou non la barre de débug. Vérifie donc ce dernier argument. :)

  • Dommage que je ne vois ce post que maintenant : je viens de finir de mettre en place un site web symfony avec une dev sur ma machine et les sources sous sourceforge et une prod sur un serveur mutualisé OVH...

    Ça m'aurait fait gagner du temps quand même... tant pis.

    (Oui, ce commentaire n'a pour seul utilité de dire que oui, moi aussi je lis ton blog... et que si un jour t'as besoin d'aide pour un serveur OVH mutualisé, tu as devant toi un nouvel expert du déploiement classe via rsync de Symfony)

  • Salut,
    Un exemple de configuration du VirtualHost aurait été souhaitable pour avoir un tuto complet. Surtout que tu en parles à la fin.
    Sinon, merci.
    A plus.

  • Concernant le VirtualHost, voici un exemple de fichier (sous Linux, n'ayant que ça sous la main pour l'instant) :

    <VirtualHost *:80>
    
            ServerName toudoo
    
            DocumentRoot /home/www/toudoo/web/
            <Directory /home/www/toudoo/web/>
                    Options Indexes FollowSymLinks MultiViews
                    AllowOverride None
                    Order allow,deny
                    allow from all
            </Directory>
    
            ErrorLog ${APACHE_LOG_DIR}/error.log
            LogLevel warn
            CustomLog ${APACHE_LOG_DIR}/access.log combined
    
            Alias /sf /home/www/toudoo/lib/vendor/symfony/data/web/sf
    
    </VirtualHost>

    Tout doit être assez limpide je pense. Si tu as des questions, n'hésite cependant pas. :)

  • Bonsoir,
    Pour ceux qui utilisent NetBeans pour développer, sachez qu'il est possible de créer un projet symfony via l'IDE.
    http://wiki.netbeans.org/NB68symfony
    @+

  • Bonjour,

    J'ai relus ce tuto pour me faire une réinstallation plus personnalisée.

    Les "/" ont disparus des différents chemins et dans l'alias, le répertoire "symfony" manque non?

    Deuxième fois que je refais ce tuto et toujours bien pratique.

    A+

  • Concernant la ligne Alias /sf "D:\Sites\toudoo\lib\vendor\symfony\data\web\sf"
    Je bloque depuis. je pense qu'il y a pas assez de détails à ce niveau !

  • @Steeve : Concernant l'alias, il faut simplement le faire pointer dans le dossier web de Symfony, tel qu'indiqué ci-dessus. En quoi bloques-tu ?

Leave a comment