Comment déployer une application symfony2 sur OVH

Comment déployer une application symfony2 sur OVH

Exceptionally, this article is in French. I’ll talk about how to deploy a symfony2 application on an OVH server, which is a french webhost.

J’ai récemment déployé mon nouveau projet symfony2 sur mon serveur mutualisé OVH. Et c’est après quelques petites astuces que j’ai pu faire marcher tout cela sans heurt.

La première chose à savoir sur un serveur OVH, c’est comment changer la version de php. En effet la version par défaut est la 4.4.9 au moment où j’écris ces lignes, alors que symfony 2 requiert au mois la version 5.3.2.

Pour avoir la dernière version de php en ligne de commande : [cci]php.TEST.5[/cci]

Et pour activer la dernière version de PHP pour apache, mettez en tête du .htaccess :

[cc]
SetEnv REGISTER_GLOBALS 0
SetEnv MAGIC_QUOTES 0
SetEnv ZEND_OPTIMIZER 1
SetEnv PHP_VER 5_TEST
[/cc]

Comme vous pouvez le voir, j’ai rajouté quelques lignes pour avoir une configuration plus propre.

Ensuite, si comme moi vous développez en environnement Windows, vous allez avoir des erreurs signifiant que symfony n’arrive pas à charger certaines classes. Cela vient probablement du fait que vous avez oublié de respecter la case dans le nommage de vos répertoire ou bien dans le fichier [cci]/app/autoload.php[/cci].

Finalement, lors de l’utilisation de la commande [cci]assets :install web[/cci] pour le déploiement de vos ressources (images, swf…), la commande risque de vous signifier que le répertoire [cci]web[/cci] n’existe pas. Pour cela vous devez pointer vers le répertoire avec un chemin relatif au répertoire [cci]/app/[/cci]. Ce qui nous donne : [cci]assets :install ../web[/cci].

Et voilà, normalement tout fonctionne. En cas de soucis, n’oubliez pas de vérifier la configuration de la connexion à votre base de données dans le fichier [cci]/app/config/parameters.ini[/cci] et d’effacer le répertoire [cci]/app/cache/prod/[/cci].

Note : A propos de php, il est toujours possible d’avoir la liste des versions disponibles en faisant [cci]ls -l /usr/local/bin/php*[/cci] depuis la ligne de commande.

EDIT: la dernière note est devenue obsolète. De plus php.TEST.5 n’est plus utilisable, on peut maintenant utiliser php.ORIG.5.3.2.

Symfony2 : More about the ExtraToolsBundle

Symfony2 : More about the ExtraToolsBundle

Following some of my previous posts A translation message extractor command and Create your own constraint validator in symfony2 : A Doctrine unique validator, these two handful functionalities are available on Github in the ExtraToolBundle.

Please, fork me 😉

Also, both functionalities have been strongly improved since I have blogged about them.

The Doctrine UniqueValidator, is now much more configurable and have been updated to support the new namespace annotation injection. And, thanks to Matt Agar the trans:udpate command is now much more robust and supports export to xliff and php translation files. He did a very nice job and it was very nice to have another developer to challenge and contribute to my implementation.

You can find the full details of the new tools on the ExtraToolsBundle’s github.

Symfony2: A translation message extractor command

Symfony2: A translation message extractor command

One of the very painful taks you may face using symfony2 is the extration of all you translation message from your twig templates. This is much more annoying knowing that symfony1.4 did the job for you with a simple command, which does not exist in symfony2.

Today I will give give you a command for symfony2 that checks all your twig messages, combine them with your already existing messages in your yaml translations files and save the new ones. It is a recent work for me and it just works with twig/yml files.

The Command
I embedded it in a Bundle on github: https://github.com/michelsalib/ExtraToolsBundle.

You just need to get it, register the namespace and the bundle.

The name of the command is [cci]bcc:trans:update locale bundleName[/cci], where the [cci]locale[/cci] is the targeted locale (en, fr, es…) and the [cci]bundleName[/cci] is the name of the targeted bundle. You have several options:
– –dump-messages to display your final messages
– –force to update/write your translation files, it also perform a backup of the old ones
– –prefix=”…” if you want to change the prefix use for your new messages, by default [cci]__ [/cci] is used

Some example:
– To extract the messages of your bundle and display them in the console:
[cci]bcc:trans:update –dump-messages fr MyBundle[/cci]

– You can save them:
[cci]bcc:trans:update –force fr MyBundle[/cci]

– In another language:
[cci]bcc:trans:update –force en MyBundle[/cci]

– Or if you want to chaneg the prefix used to generate the new messages:
[cci]bcc:trans:update –force –prefix=’myprefix’ en MyBundle[/cci]

Behind the scene
The trick behind the code is how to properly crawl your twig templates.

First to get them:
[cc lang=”php”]
// get bundle directory
$foundBundle = $this->getApplication()->getKernel()->getBundle(‘MyBundle’);
// get twig templates
$finder = new Finder();
$files = $finder->files()->name(‘*.html.twig’)->in($foundBundle->getPath() . ‘/Resources/views/’);
// iterate over the files
foreach ($files as $file) {
$path = $file->getPathname();
// parse the files
}
[/cc]

Here you just need to use the kernel to retrieve the bundle data from a simple bundle name. When you have the bundle path, you can use the finder to get all the file ending by [cci].html.twig[/cci] in the relative [cci]/Resources/views/[/cci] directory.

You can now parse the twig files:
[cc lang=”php”]
$tree = $twig->parse($twig->tokenize(file_get_contents($path)));
[/cc]

Then you get a tree composed of [cci]Twig_Node[/cci]. The rest is just an algorithmic problem using recursion and type checking to find [cci]SymfonyBridgeTwigNodeTransNode[/cci] (for [cci]{% trans %}…{% end trans %} syntax[/cci]) and [cci]Twig_Node_Print[/cci] that contains trans filter (for [cci]{{ … | trans }}[/cci] syntax).

When you finally have all your messages, you might want to save them into yaml. For that you have two very simple static functions:
[cc lang=”php”]
// get a yaml file into a php array
$array = SymfonyComponentYamlYaml::load($path);
// transform an array into a yaml string
$yml = SymfonyComponentYamlYaml::dump($array);
[/cc]

Wrap up
I hope this command will help you building better symfony2 app, by automatizing some work. Don’t hesitate to report me bugs, suggestions or to fork me on github!