Міграція на 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 'Привіт Світ';
}
Flight::map('hello', 'hello');
Flight::after('hello', function(){
// це насправді буде добре
echo '<p>Цю фразу Привіт Світ вам приніс лист "H"</p>';
});
Flight::before('start', function(){
// такі речі викличуть помилку
echo '<html><head><title>Моя Сторінка</title></head><body>';
});
Flight::route('/', function(){
// це насправді просто добре
echo 'Привіт Світ';
// Це також має бути добре
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()
замість цього.
Зміни halt() stop() redirect() та error() (3.10.0)
За замовчуванням поведінка до 3.10.0 полягала в очищенні як заголовків, так і тіла відповіді. Це було змінено на очищення лише тіла відповіді.
Якщо вам потрібно очистити також заголовки, ви можете використовувати Flight::response()->clear()
.