Миграция на v3

Обратная совместимость в целом была сохранена, но есть некоторые изменения, о которых вам следует знать при миграции с v2 на v3.

Поведение буферизации вывода (3.5.0)

Буферизация вывода - это процесс, при котором вывод, генерируемый сценарием 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>';
});

Включение поведения визуализации v2

Можно ли оставить ваш старый код таким, как он есть, без переписывания, чтобы он работал с v3? Да, вы можете! Вы можете включить поведение визуализации v2, установив параметр конфигурации flight.v2.output_buffering в true. Это позволит вам продолжать использовать старое поведение визуализации, но рекомендуется исправить это впредь. В v4 фреймворка это будет удалено.

// index.php
require 'vendor/autoload.php';

Flight::set('flight.v2.output_buffering', true);

Flight::before('start', function(){
    // Теперь это будет просто нормально
    echo '<html><head><title>Моя страница</title></head><body>';
});

// больше кода 

Изменения в диспетчере (3.7.0)

Если вы непосредственно вызывали статические методы для Dispatcher, такие как Dispatcher::invokeMethod(), Dispatcher::execute(), и т. д., вам нужно будет обновить свой код, чтобы не вызывать эти методы напрямую. Dispatcher был преобразован в более объектно-ориентированный для более удобного использования контейнеров внедрения зависимостей. Если вам нужно вызвать метод, аналогичный тому, как делал Dispatcher, вы можете вручную использовать что-то вроде $result = $class->$method(...$params); или call_user_func_array() вместо этого.