Обратная совместимость в целом была сохранена, но есть некоторые изменения, о которых вам следует знать при миграции с v2 на v3.
Буферизация вывода - это процесс, при котором вывод, генерируемый сценарием PHP, сохраняется в буфере (внутри PHP), прежде чем быть отправленным клиенту. Это позволяет вам изменять вывод перед его отправкой клиенту.
В приложении MVC контроллер является "менеджером" и управляет тем, что делает представление. Генерация вывода за пределами контроллера (или в случае Flight иногда анонимной функции) нарушает шаблон MVC. Это изменение призвано быть более соответствующим шаблону MVC и делать работу с фреймворком более предсказуемой и простой.
В v2 буферизация вывода обрабатывалась таким образом, что не всегда закрывала свой собственный буфер вывода, что осложняло юнит-тестирование и потоковую передачу данных. Для большинства пользователей это изменение может на самом деле вас не затронуть. Однако, если вы выводите контент за пределами вызываемых функций и контроллеров (например, в хуке), у вас могут возникнуть проблемы. Вывод контента в хуках и перед выполнением фреймворка на самом деле мог сработать в прошлом, но не сработает в будущем.
// index.php require 'vendor/autoload.php'; // просто пример define('START_TIME', microtime(true)); function hello() { echo 'Hello World'; } Flight::map('hello', 'hello'); Flight::after('hello', function(){ // это фактически будет нормально echo '<p>Эта фраза Hello World была принесена вам буквой "H"</p>'; }); Flight::before('start', function(){ // такие вещи вызовут ошибку echo '<html><head><title>Моя страница</title></head><body>'; }); Flight::route('/', function(){ // это на самом деле просто нормально echo 'Hello World'; // Это тоже должно быть хорошо Flight::hello(); }); Flight::after('start', function(){ // это вызовет ошибку echo '<div>Ваша страница загружена за '.(microtime(true) - START_TIME).' секунд</div></body></html>'; });
Можно ли оставить ваш старый код таким, как он есть, без переписывания, чтобы он работал с v3? Да, вы можете! Вы можете включить поведение визуализации v2, установив параметр конфигурации flight.v2.output_buffering в true. Это позволит вам продолжать использовать старое поведение визуализации, но рекомендуется исправить это впредь. В v4 фреймворка это будет удалено.
flight.v2.output_buffering
true
// index.php require 'vendor/autoload.php'; Flight::set('flight.v2.output_buffering', true); Flight::before('start', function(){ // Теперь это будет просто нормально echo '<html><head><title>Моя страница</title></head><body>'; }); // больше кода
Если вы непосредственно вызывали статические методы для Dispatcher, такие как Dispatcher::invokeMethod(), Dispatcher::execute(), и т. д., вам нужно будет обновить свой код, чтобы не вызывать эти методы напрямую. Dispatcher был преобразован в более объектно-ориентированный для более удобного использования контейнеров внедрения зависимостей. Если вам нужно вызвать метод, аналогичный тому, как делал Dispatcher, вы можете вручную использовать что-то вроде $result = $class->$method(...$params); или call_user_func_array() вместо этого.
Dispatcher
Dispatcher::invokeMethod()
Dispatcher::execute()
$result = $class->$method(...$params);
call_user_func_array()