La compatibilité ascendante a été maintenue pour la plupart, mais il y a quelques changements dont vous devez être conscient lors de la migration de v2 à v3.
Output buffering est le processus par lequel la sortie générée par un script PHP est stockée dans un tampon (interne à PHP) avant d'être envoyée au client. Cela vous permet de modifier la sortie avant qu'elle ne soit envoyée au client.
Dans une application MVC, le Contrôleur est le "gestionnaire" et il gère ce que fait la vue. Avoir une sortie générée en dehors du contrôleur (ou dans le cas de Flight parfois une fonction anonyme) casse le modèle MVC. Ce changement vise à être plus en phase avec le modèle MVC et à rendre le framework plus prévisible et plus facile à utiliser.
Dans v2, l'output buffering était géré d'une manière où il ne fermait pas de manière cohérente son propre tampon de sortie, ce qui rendait les tests unitaires et le streaming plus difficiles. Pour la majorité des utilisateurs, ce changement ne vous affectera peut-être pas réellement. Cependant, si vous affichez du contenu en dehors des callables et des contrôleurs (par exemple dans un hook), vous risquez probablement de rencontrer des problèmes. Afficher du contenu dans des hooks, et avant que le framework ne s'exécute réellement a pu fonctionner par le passé, mais cela ne fonctionnera plus à l'avenir.
// index.php require 'vendor/autoload.php'; // juste un exemple define('START_TIME', microtime(true)); function hello() { echo 'Bonjour le monde'; } Flight::map('hello', 'hello'); Flight::after('hello', function(){ // cela fonctionnera en réalité echo '<p>Cette phrase Bonjour le monde vous est offerte par la lettre "B"</p>'; }); Flight::before('start', function(){ // des choses comme celle-ci provoqueront une erreur echo '<html><head><title>Ma page</title></head><body>'; }); Flight::route('/', function(){ // tout va bien en réalité echo 'Bonjour le monde'; // Cela devrait également bien fonctionner Flight::hello(); }); Flight::after('start', function(){ // cela provoquera une erreur echo '<div>Votre page s'est chargée en '.(microtime(true) - START_TIME).' secondes</div></body></html>'; });
Pouvez-vous conserver votre ancien code tel qu'il est sans le réécrire pour le faire fonctionner avec v3 ? Oui, vous le pouvez ! Vous pouvez activer le comportement de rendu v2 en définissant l'option de configuration flight.v2.output_buffering sur true. Cela vous permettra de continuer à utiliser l'ancien comportement de rendu, mais il est recommandé de le corriger à l'avenir. Dans la v4 du framework, cela sera supprimé.
flight.v2.output_buffering
true
// index.php require 'vendor/autoload.php'; Flight::set('flight.v2.output_buffering', true); Flight::before('start', function(){ // Maintenant cela fonctionnera parfaitement echo '<html><head><title>Ma page</title></head><body>'; }); // plus de code
Si vous avez directement appelé des méthodes statiques pour Dispatcher telles que Dispatcher::invokeMethod(), Dispatcher::execute(), etc. vous devrez mettre à jour votre code pour ne pas appeler directement ces méthodes. Dispatcher a été converti pour être plus orienté objet afin que les conteneurs d'injection de dépendance puissent être utilisés plus facilement. Si vous devez invoquer une méthode similaire à ce que Dispatcher faisait, vous pouvez utiliser manuellement quelque chose comme $result = $class->$method(...$params); ou call_user_func_array() à la place.
Dispatcher
Dispatcher::invokeMethod()
Dispatcher::execute()
$result = $class->$method(...$params);
call_user_func_array()