Atgriezeniskā saderība lielākoties ir saglabāta, bet ir dažas izmaiņas, par kurām jums jāņem vērā, migrējot no v2 uz v3.
Izvades buferēšana ir process, kurā PHP skripta ģenerētā izvade tiek saglabāta buferī (iekšējā PHP) pirms tā tiek nosūtīta klientam. Tas ļauj jums modificēt izvadi pirms tā tiek nosūtīta klientam.
MVC lietojumprogrammā Kļūdu izvadītājs ir "vadītājs" un tas vadīt to, ko skats dara. Izvade, kas tiek ģenerēta ārpus vadītāja (vai dažreiz Fly ietvars gadījumā anonīmā funkcija) pārkāpj MVC modeli. Šī izmaiņa ir veikta, lai iegūtu lielāku saderību ar MVC modeli un padarītu ietvaru paredzamāku un vieglāk lietojamu.
v2, izvades buferēšana tika apstrādāta tā, ka tā konsistenti neatvēra savu izvades buferi, kas padarīja mērvienību testēšanu un straumēšanu sarežģītāku. Lielākajai vairumu lietotāju šī izmaiņa varētu neietekmēt praktiski. Tomēr, ja jūs atgriežat saturu ārpusizsaucamajiem un vadītājiem (piemēram, āķī), iespējams, ka uz jums gaida problēmas. Uzskaitot saturu āķos un pirms ietvara faktiskā izpildes agrāk varēja darboties, bet nedarbosies turpmāk.
// index.php require 'vendor/autoload.php'; // tikai piemērs define('START_TIME', microtime(true)); function hello() { echo 'Sveika pasaule'; } Flight::map('hello', 'hello'); Flight::after('hello', function(){ // tas faktiski būs kārtībā echo '<p>Šo Sveika pasaule frazi jums sagādā burti "S"</p>'; }); Flight::before('sākums', function(){ // lietas, kas izskatās šādi, radīs kļūdu echo '<html><head><title>Mana lapa</title></head><body>'; }); Flight::route('/', function(){ // tas faktiski ir tikai labi echo 'Sveika pasaule'; // Tas arī būtu tikai labi Flight::hello(); }); Flight::after('sākums', function(){ // tas radīs kļūdu echo '<div>Jūsu lapa ielādējās '.(microtime(true) - START_TIME).' sekundes</div></body></html>'; });
Vai joprojām varat paturēt savu veco kodu tāpat kā tas ir, neveicot pārrakstīšanu, lai tas strādātu ar v3? Jā, jūs varat! Jūs varat ieslēgt v2 izvades buferēšanas uzvedību, iestatot konfigurācijas opciju flight.v2.output_buffering uz true. Tas ļaus jums turpināt izmantot veco renderēšanas uzvedību, bet ieteicams to labot turpmāk. v4 ietvarā tas tiks noņemts.
flight.v2.output_buffering
true
// index.php require 'vendor/autoload.php'; Flight::set('flight.v2.output_buffering', true); Flight::before('sākums', function(){ // Tagad tas būs tikai kārtībā echo '<html><head><title>Mana lapa</title></head><body>'; }); // vairāk koda
Ja jūs tieši esat izsaukdami statiskās metodes Dispatcher, piemēram, Dispatcher::invokeMetode(), Dispečera::execute(), utt., jums būs jāatjaunina savs kods, lai neizsauktu šīs metodes tieši. Dispatcher ir pārveidots, lai būtu vairāk objektu orientēts, tādējādi Atkarību ieviešanas konteineri var tikt izmantoti vieglāk. Ja jums ir nepieciešams izsaukt metodi, līdzīgu tam, kā to darīja Dispečers, jūs varat manuāli izmantot kaut ko līdzīgu $rezultāts = $klase->$metode(...$parametri); vai call_user_func_array() vietā.
Dispatcher
Dispatcher::invokeMetode()
Dispečera::execute()
$rezultāts = $klase->$metode(...$parametri);
call_user_func_array()