Symfony2 : création de pages statiques
Après notre premier article concernant la création d’un nouveau projet Symfony2, nous allons voir à présent comment créer un ensemble de pages statiques pour notre site. Cela nous permettra de voir brièvement le fonctionnement des contrôleurs ainsi que du routing Symfony2.
Création d’un bundle
Nous allons regrouper toutes nos pages statiques dans une unité logique appelé bundle. Un bundle est un ensemble de fichiers pouvant indépendamment être transportés d’un projet à un autre et comprenant tout un ensemble de classes (tests, contrôleurs, vues, fichiers de configuration, etc.) cohabitant entre elles dans un seul et même but. Il s’agit un peu de l’équivalent d’un plug-in sous Symfony 1.4.
Il existe une multitude de bundles que vous pouvez utiliser selon vos besoins. L’annuaire de bundles le plus complet à ce jour est Symfony2 Bundles.
Nous allons créer un bundle JonathanPetitcolasStaticBundle. Comme vous pouvez le constater, un bundle est constitué du nom du vendor (votre société, votre pseudo, ou ce que vous voulez) ainsi que d’un nom, sensé être représentatif du but de votre bundle.
Pour créer un bundle, c’est très simple : on utilise le script app/console (l’équivalent de symfony dans la version précédente) qui nous permet tout un tas d’actions automatisées.
php ./app/console generate:bundle
S’ensuit un petit interrogatoire.
- Namespace: JonathanPetitcolas/StaticBundle
- Bundle name: JonathanPetitcolasStaticBundle
- Target directory: /home/jpetitcolas/myProject/src
- Configuration format: annotation
- Do you want to generate the whole directory structure? no
- Do you confirm generation? yes
- Confirm automatic update of your Kernel? yes
- Confirm automatic update of your Routing? yes
Et voilà, notre bundle est prêt à être utilisé. On commence par spécifier l’espace de noms (pour éviter les classes portant le même nom d’un bundle à l’autre), le nom et l’emplacement de notre bundle. Tous nos bundles devront se retrouver dans le dossier src de notre application, par convention. Après, vous êtes libres de suivre vos propres conventions, mais pensez à vos successeurs. ;)
Nous avons ensuite le choix entre plusieurs types de configuration. Nous choisissons de configurer notre application sous forme d’annotations, à savoir des @parameter dans la PHPDoc de nos méthodes. Cela nous obligera par ailleurs à penser à mettre à jour la documentation de notre code. ;)
Ensuite, nous laissons Symfony2 nous préparer le Kernel (le noyau de l’application) ainsi que le routeur.
Ouvrons le Kernel de notre application pour voir ce que Symfony y a fait. Editons donc le fichier app/AppKernel.php.
<?php
use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\Config\Loader\LoaderInterface;
class AppKernel extends Kernel
{
public function registerBundles()
{
$bundles = array(
new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
new Symfony\Bundle\SecurityBundle\SecurityBundle(),
new Symfony\Bundle\TwigBundle\TwigBundle(),
new Symfony\Bundle\MonologBundle\MonologBundle(),
new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
new Symfony\Bundle\DoctrineBundle\DoctrineBundle(),
new Symfony\Bundle\AsseticBundle\AsseticBundle(),
new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
new JMS\SecurityExtraBundle\JMSSecurityExtraBundle(),
new JonathanPetitcolas\StaticBundle\JonathanPetitcolasStaticBundle(),
);
if (in_array($this->getEnvironment(), array('dev', 'test'))) {
$bundles[] = new Acme\DemoBundle\AcmeDemoBundle();
$bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
$bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle();
$bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle();
}
return $bundles;
}
public function registerContainerConfiguration(LoaderInterface $loader)
{
$loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');
}
}
La console Symfony2 a donc ajouté la ligne 20 surlignée ci-dessus, qui ajoute simplement notre bundle dans le tableau des bundles enregistrés. C’est un peu l’équivalent du ProjectConfiguration de Symfony 1.4 pour les plug-ins.
Quant au routing, il nous suffit de jeter un oeil sur app/config/routing.yml :
JonathanPetitcolasStaticBundle:
resource: « @JonathanPetitcolasStaticBundle/Controller/ »
type: annotation
prefix: /
On voit donc que notre bundle gérera lui-même les routes dont il a besoin directement dans ses contrôleurs sous le format d’annotations. Quant au préfixe, cela nous permettra de différencier la route d’un bundle et d’un autre. Par exemple, si nous voulions desservir toutes nos pages statiques avec des URLs de la forme statique/…, c’est ce préfixe qu’il faudrait modifier.
Route et contrôleur
Nous allons à présent créer une action chargée de retourner la bonne page statique, dépendant du paramètre passé en URL (typiquement, le nom de la page dans ce cas).
Ouvrons notre contrôleur situé dans src/JonathanPetitcolas/StaticBundle/Controller/DefaultController.php et modifions le comme suit :
<?php
namespace JonathanPetitcolas\StaticBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class DefaultController extends Controller
{
/**
* Desserves a static page specified in parameters.
* @param string $name Name of the page to desserve.
* @return Response
*
* @Route("/{page}")
*/
public function indexAction($page)
{
// Try to retrieve correct content to desserve.
$template = sprintf("JonathanPetitcolasStaticBundle:Pages:%s.html.twig", $page);
if(!$this->get('templating')->exists($template))
{
// If specified page does not exist, forward to 404.
throw new NotFoundHttpException("The specified page does not exist.");
}
// Render current template
return $this->render($template);
}
}
A noter que nous avons rajouté, par rapport au template par défaut, l’utilisation du composant Symfony2 NotFoundHttpException. Cela nous permettra de rediriger proprement vers une page d’erreur 404 dans le cas où l’internaute recherche une page qui n’existe pas.
Examinons le commentaire de notre méthode. Nous avons ici une annotation Route, qui nous permet de spécifier la route depuis laquelle nous allons retrouver notre page. Nous lui passons un paramètre (défini par son nom entre accolades). Ainsi, en supposant que le préfixe de routing soit toujours /, nous atteindrons notre page de mentions légales en appelant, par exemple, /mentions-legales.
On remarque par ailleurs que ce paramètre se retrouve en argument du contrôleur. C’est ce qui nous permettra de le réutiliser.
Nous allons utiliser Twig , un moteur de templates utilisé par défaut avec Symfony2, pour afficher nos pages. Il faut donc spécifier à Symfony2 quelle vue Twig utiliser. Nous utiliserons la vue $template. Celle-ci est très lourde à écrire, je vous l’accorde, mais reste néanmoins très simple à comprendre : on spécifie le bundle et l’emplacement de la vue dans icelui.
Nous vérifions alors l’existence du fichier, et n’hésitons par à rediriger l’internaute vers une 404 s’il veut une page que nous n’avons pas.
Enfin, nous laissons la main à Twig pour afficher notre vue avec la méthode render. Nous retournons le résultat de notre appel à Twig sous forme d’un objet Response.
Normalement, si vous essayez de vous rendre sur la page app_dev.php/mentions-legales, vous devriez vous retrouver nez-à-nez avec une jolie page d’exception Symfony2 : « The specified page does not exist. ». Nous allons donc la créer.
Toutes les vues sont stockées dans le dossier Resources/views/ de votre bundle. Créons-y donc un dossier Pages ainsi qu’un fichier mentions-legales.html.twig.
<h1>Mentions légales</h1> <p>Bla bla bla</p>
Si vous rechargez votre page, vous devriez normalement apercevoir votre titre ainsi que vos blablas. Ainsi s’achève ce second tutorial Symfony2. Nous verrons par la suite l’utilisation du moteur de templates Twig afin de former une page valide W3C grâce à l’inclusion de blocs notamment.
Comments
Trackbacks
There are no trackbacks on this entry.

Merci pour le code. Bonne continuation à toi.
Merci pour cet article, je cherchais justement un code simple pour ajouter rapidement du contenu statique à mon site.