Php

On peut personnaliser le comportement du site à l'aide de PHP.
Pour cela on met des fichiers php dans le dossier de config path_php et on respecte quelques principes de programmation PHP.

Les fichiers php intégrés avec un comportement doivent retourner un objet, cet objet peut être de deux types.

L'objet retourné implémente l'interface Arnapou\SimpleSite\Core\PhpCode

interface Arnapou\SimpleSite\Core\PhpCode
{
    public function init(\Arnapou\SimpleSite\Core\ServiceContainer $container);
}

Comme dans l'exemple php/twig_globals.php qui injecte en variable global twig des données d'une table yaml :

<?php

use Arnapou\SimpleSite\Core\PhpCode;
use Arnapou\SimpleSite\Core\ServiceContainer;

return new class() implements PhpCode {

    public function init(ServiceContainer $container): void
    {
        $twig = $container->TwigEnvironment();

        $parameters = $container->Database()->getTable('twig_globals');
        foreach ($parameters as $key => $data) {
            $twig->addGlobal($key, $data['value'] ?? '');
        }
    }
};

L'objet retourné étend la classe Arnapou\SimpleSite\Core\Controller

Obligation d'implémenter la méthode abstraite configure (pour les routes) :

abstract class Arnapou\SimpleSite\Core\Controller
{
    abstract public function configure(): void;
}

Comme dans l'exemple php/controller.php qui déclare une route hello pour afficher une page bidon :

<?php

use Arnapou\SimpleSite\Core\Controller;

return new class() extends Controller {

    public function configure(): void
    {
        $this->addRoute('hello-{name}', [$this, 'hello'], 'hello')
            ->setRequirement('name', '[a-zA-Z]+');
    }

    public function hello($name)
    {
        return $this->render('@templates/demo/hello.twig', ['name' => $name]);
    }
};

Exemple de page : /hello-world lien produit avec {{ path('hello', { name: 'world'}) }}

Evènements de kernel

On peut intercepter des évènements de kernel pour changer le comportement du site : changer la réponse par exemple et/ou court-circuiter le routing.

Evènements de la classe Arnapou\SimpleSite\Core\Kernel :

Exemple php/event_hook.php qui court-circuite le routing pour envoyer une autre page :

<?php

use Arnapou\SimpleSite\Core\Event;
use Arnapou\SimpleSite\Core\Kernel;
use Arnapou\SimpleSite\Core\PhpCode;
use Arnapou\SimpleSite\Core\ServiceContainer;
use Symfony\Component\HttpFoundation\Response;

return new class() implements PhpCode {

    public function init(ServiceContainer $container): void
    {
        $container->Kernel()->eventListener()->addListener(Kernel::onRequest, [$this, 'onRequest']);
    }

    public function onRequest(Event $event)
    {
        if ($event->getRequest()->get('killme')) {
            $event->setResponse(new Response('<h1>Arrrgghh .... I am killed ...</h1>', 500));
        }
    }
};

Tester la page : /hello-world?killme=1