Créer un site en Twig avec Puppy framework

Puppy est un micro-framework PHP prêt à l’emploi. Vous pouvez directement créer un site sans même devoir écire une seule ligne de PHP. Il est spécialement dédié aux petits sites, mais dispose néanmoins de pas mal de fonctionnalités de base.

Examinons ensemble ses principes de fonctionnement.

Installation

Une fois téléchargé avec Composer, il suffit de lancer la commande puppy run avant de se rendre dans son navigateur en localhost.

1
puppy run [dev]

Cette commande lance simplement le serveur interne de PHP sur le port 8080 du localhost. On peut ainsi accéder à la démo de Puppy. L’option « dev » n’est utile qu’en développement, car elle annule le système de cache.

Le routage automatique

Sa spécialité? Puppy permet de construire directement un site en Twig sans devoir configurer de routes. Son moteur lie automatiquement l’adresse de la page courante à un template correspondant.

Par exemple, il suffit d’ajouter un fichier « index.html.twig » pour avoir une homepage (les templates publics se trouvent dans le dossier « /templates/public »).

1
2
3
<!-- templates/public/index.html.twig -->

<h1>Hello world</h1>

A l’instar d’un site en HTML, Puppy va pointer vers le template équivalent (lequel doit toutefois être agrémenté d’une extension .twig). Il suffit ensuite d’y insérer son code HTML, et le site tourne!

Les templates Twig

Puppy utilise Twig (bien qu’on puisse potentiellement utiliser un autre moteur). Vous bénéficiez donc de toute la puissance d’un moteur de template. Par exemple, vous pouvez communautariser le code HTML commun à toutes vos pages.

1
2
3
4
5
{% extends 'common.html.twig' %}

{% block content %}
    <h1>Hello world</h1>
{% endblock %}

Twig est capable de beaucoup de choses. Le mieux est d’en parcourir la documentation.

Le routage dynamique

Parallèlement Puppy dispose des mêmes fonctionnalités de base que n’importe quel autre micro-framework: routing, middlewares, services,… Vous pouvez ainsi rajouter un comportement dynamique à certaines de vos pages.

Déclarer une route

Vous pouvez, par exemple, implémenter le traitement d’un formulaire de contact, et créer une route en POST, à l’instar d’un Slim ou d’un Silex.

1
2
3
$puppy->post('contact', function(){
    ...
});

Récupérer les services

Avec ce système, vous pouvez récupérer dynamiquement les services dans les paramètres de la callbable. Il suffit de les déclarer, dans n’importe quel ordre.

Par exemple, si vous voulez utiliser le StaticController, qui est la classe qui gère les routages automatiques vers les templates, il faut simplement le préciser dans les paramètres.

1
2
3
$puppy->post('contact', function(StaticController $staticController){
    ...
});

Vous pouvez aussi appeler la Request, la RequestStack, le Router, la Config,…

Utiliser StaticController

Une fois que vous disposer d’une route, vous pouvez effectuer des traitements spécifiques. Si vous voulez afficher le template associé à la route courante, il suffit d’appeler le StaticController.

1
2
3
return $staticController->render([
    'text-danger' => 'Form not filled'
]);

Puppy appelera alors le template « contact/index.html.twig » (toujours dans le dossier « /templates/public »).

Et si vous voulez effectuer une redirection vers la page courante pour empêcher une nouvelle soumission du formulaire, à nouveau StaticController vous vient en aide.

1
2
3
return $staticController->redirect([
    'text-info' => 'Email sent'
]);

Remarquez que dans ce cas, Puppy traite de manière transparente les données passées directement au template ou les données qui utilisent la session flash lors d’une redirection.

Gestion des variables du template

Du côté du template, la récupération est également transparente. Que ce soit une redirection ou pas, il existe un service retriever qui permet de ne pas s’en soucier.

1
2
3
<p class="text-info">
    {{ services['retriever'].get('text-info') }}
</p>

Utiliser les méthodes génériques

Vous ne devez donc pas vous soucier du chemin vers votre template. Mais bien sûr, il est possible d’appeler facilement un autre template, à la manière traditionnelle d’un framework. Un truc sympa, c’est que les callback bénéficient d’une série de méthodes utilitaires, comme par exemple de la méthode render pour afficher un template.

1
2
3
$puppy->post('contact', function(){
    return $this->render('path/file.html.twig');
});

Vous pouvez aussi faire une redirection, renvoyer une erreur 404, appeler un autre controller, ajouter un message flash,…

Le module

Le code final doit être mis dans un module et ressemblera à quelque-chose comme ceci:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class ContactModule implements IModule
{
    /**
     * init the module.
     *
     * @param Application $application
     */

    public function init(Application $application)
    {
        $application->post(
            'contact',
            function (Request $request, StaticController $staticController) {

                if (!$request->get('email')) {
                    //if the form is not filled, we display the form with the error
                    return $staticController->render([
                        'text-danger' => 'Form not filled'
                    ]);
                }
   
                //send the email...
   
                //if the email is send, we redirect to avoid F5.
                return $staticController->redirect([
                    'text-info' => sprintf('Email sent from %s', $request->get('email'))
                ]);

            }
        );
    }
}

Le module est chargé dynamiquement par Puppy et mis en cache, pas besoin de s’en soucier. Pas même besoin de le déclarer à Puppy!

Conclusion

En conclusion, Puppy s’adresse à des petits sites avec quelques traitements dynamiques simples.

Il ne s’agit pas simplement un générateur de sites statiques, car on dispose également des avantages d’un vrai framework.

Puppy permet de réaliser un petit site rapidement, sans devoir configurer quoique ce soit, tout en bénéficiant de la puissance d’un moteur de template.

Il dispose aussi des outils de base indispensables, notamment un système de routage simple. On peut facilement ajouter des petites extensions pour des besoins spécifiques.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>