Je suis développeur web freelance et propose des formations à Symfony2 ! Contactez-moi pour en discuter.

Cet article est la traduction d’un article original de Fabien Potencier, à l’origine de Symfony2, disponible ici.

Un des inconvénients actuel de notre framework réside dans le fait qu’il faut copier le code de front.php à chaque fois que l’on veut créer un nouveau site web. 40 lignes de code ça n’est pas grand chose, mais ça pourrait être sympa de pouvoir mettre ce code dans une classe dédiée. Cela nous apporterait une meilleure réutilisabilité et faciliterait les tests, pour ne citer que quelques bénéfices.

Si vous regardez de plus près le code, front.php a une entrée la Request, et une sortie, la Response. Notre classe de framework va suivre ce principe simple : la logique consiste à créer la réponse associée à une requête.

Comme les composants nécessitent PHP 5.3, créons notre propre espace de nom pour notre framework : Simplex.

Déplacez la logique de gestion des requêtes dans sa propre classe Simplex\\Framework :


matcher = $matcher;
$this->resolver = $resolver;
}

public function handle(Request $request)
{
try {
$request->attributes->add($this->matcher->match($request->getPathInfo()));

$controller = $this->resolver->getController($request);
$arguments = $this->resolver->getArguments($request, $controller);

return call_user_func_array($controller, $arguments);
} catch (Routing\Exception\ResourceNotFoundException $e) {
return new Response('Not Found', 404);
} catch (Exception $e) {
return new Response('An error occurred', 500);
}
}
}

Mettez à jour example.com/web/front.php en conséquences :


fromRequest($request);
$matcher = new Routing\Matcher\UrlMatcher($routes, $context);
$resolver = new HttpKernel\Controller\ControllerResolver();

$framework = new Simplex\Framework($matcher, $resolver);
$response = $framework->handle($request);

$response->send();

Pour continuer dans le refactoring, déplaçons tout sauf les définitions de routes de example.com/src/app.php vers encore un autre espace de nom : Calendar.

Pour que les classes définies dans les espaces de nom Simplex et Calendar soient chargées automatiquement, il faut mettre à jour le fichier composer.json :


{
"require": {
"symfony/class-loader": "2.1.*",
"symfony/http-foundation": "2.1.*",
"symfony/routing": "2.1.*",
"symfony/http-kernel": "2.1.*"
},
"autoload": {
"psr-0": { "Simplex": "src/", "Calendar": "src/" }
}
}

Pour que l’autoloader soit mis à jour, lancez la commande php composer.phar update.

Déplacez le contrôleur dans Calendar\\Controller\\LeapYearController :

isLeapYear($year)) {
return new Response('Yep, this is a leap year!');
}

return new Response('Nope, this is not a leap year.');
}
}

Et déplacez la fonction is_leap_year() dans sa propre classe également :


N'oubliez pas de mettre à jour le fichier example.com/src/app.php en conséquences :


$routes->add('leap_year', new Routing\Route('/is_leap_year/{year}', array(
'year' => null,
'_controller' => 'Calendar\\Controller\\LeapYearController::indexAction',
)));

Pour résumer, voici la nouvelle architecture des fichiers :


example.com
├── composer.json
│ src
│ ├── app.php
│ └── Simplex
│ └── Framework.php
│ └── Calendar
│ └── Controller
│ │ └── LeapYearController.php
│ └── Model
│ └── LeapYear.php
├── vendor
└── web
└── front.php

Ça y est ! Notre application a maintenant 4 couches différentes, et chacune d'entre elles a un but bien défini :

  • web/front.php : Le contrôleur de façade; le seul code PHP exposé, qui fait l'interface avec le client. Il récupère la Request et envoie la Response, et fournit le code nécessaire à l'initialisation du framework et de notre application;
  • src/Simplex : Le code réutilisable du framework qui abstrait la gestion des requêtes entrantes (au passage, il rend votre controlleur/template facilement testable -- bientôt plus de détails à ce sujet);
  • src/Calendar : Le code spécifique de notre application (contrôleur et modèle);
  • src/app.php : La configuration de l'application/la personnalisation du framework.

Répondre

Unable to load the Are You a Human PlayThru™. Please contact the site owner to report the problem.