Attraverso questa super guida LaraMind ecco che come di consueto cerchiamo di documentare ogni possibile cambiamento radicale che ha coinvolto Laravel nel passaggio di versione, dalla 8 alla 9.0. attenzione perché solo una parte di queste modifiche può effettivamente influire sull’applicazione.

Ricordate che Laravel 9 è una versione LTS, pertanto, nel bene e nel male è destinata, per la sua portata, a passare alla storia del framework e a condizionarne in maniera anche piuttosto incisiva alcune funzioni. 

Aggiornamento delle dipendenze

Probabilità di impatto sull approccio all’apprendimento al framework:  ALTA 

PHP 8.0.2 Richiesto

Laravel ora richiede PHP 8.0.2 o versioni successive.

Dipendenze Composer. È necessario aggiornare le seguenti dipendenze nel composer.json file dell’applicazione:

  • laravel/frameworka^9.0
  • nunomaduro/collisiona^6.1

A questo punto sostituisci facade/ignitioncon “spatie/laravel-ignition”: “^1.0”nel file della tua domanda composer.json.

I seguenti pacchetti proprietari hanno ricevuto nuove major release per supportare Laravel 9.x. Se applicabile, dovresti leggere le rispettive guide prima di eseguire l’aggiornamento:

Dovrai poi esaminare tutti gli altri pacchetti di terze parti consumati dalla tua applicazione oltre a verificare di utilizzare la versione corretta per il supporto di Laravel 9.

Tipi di ritorno PHP

PHP sta iniziando a passare alla richiesta di definizioni dei tipi di ritorno su metodi PHP come offsetGet, offsetSet, ecc. Alla luce di ciò, Laravel 9 ha implementato questi tipi di ritorno nella sua base del codice. In genere, ciò non dovrebbe influire sul codice scritto dall’utente; bisogna comunque considerare che se stai sovrascrivendo uno di questi metodi estendendo le classi principali di Laravel, dovrai sempre aggiungere questi tipi di ritorno alla tua applicazione o al codice del pacchetto:

  • count(): int
  • getIterator(): Traversable
  • getSize(): int
  • jsonSerialize(): array
  • offsetExists($key): bool
  • offsetGet($key): mixed
  • offsetSet($key, $value): void
  • offsetUnset($key): void

Inoltre, sono stati aggiunti tipi restituiti ai metodi che implementano i SessionHandlerInterface. Ancora una volta, è improbabile che questa modifica influisca sulla tua applicazione o sul codice del pacchetto:

  • open($savePath, $sessionName): bool
  • close(): bool
  • read($sessionId): string|false
  • write($sessionId, $data): bool
  • destroy($sessionId): bool
  • gc($lifetime): int

Applicazione

Funzione Application

Probabilità di impatto sull approccio all’apprendimento al framework:  BASSA

Il storagePathmetodo Illuminate\Contracts\Foundation\Applicationdell’interfaccia è stato aggiornato per accettare un $path. Se stai implementando questa interfaccia, dovresti aggiornare la tua implementazione di conseguenza:

public function storagePath($path = ”);

Allo stesso modo, il langPath metodo della Illuminate\Foundation\Application è stato aggiornato per accettare un $path:

public function langPath($path = ”);

 

Metodo di gestione delle eccezioni ignore 

Probabilità di impatto sull approccio all’apprendimento al framework:  BASSA

Il metodo ignore del gestore delle eccezioni ora è public invece di protected. Questo metodo non è incluso nello scheletro dell’applicazione predefinito; tuttavia, se hai definito manualmente questo metodo, dovresti aggiornarne la visibilità a public:

public function ignore(string $class);

Lama

Collezioni pigre e la $loopvariabile  

Probabilità di impatto sull approccio all’apprendimento al framework:  BASSA 

Quando si esegue l’iterazione su LazyCollection un’istanza all’interno di un modello Blade, la $loop variabile non è più disponibile, poiché l’accesso a questa variabile provoca il LazyCollection che viene caricato in memoria, rendendo così inutile l’utilizzo di lazy collections  in questo scenario.

Collezioni

Funzione Enumerable

Probabilità di impatto sull approccio all’apprendimento al framework:  BASSA 

Il Illuminate\Support\Enumerable  ora definisce un sole metodo. Se stai implementando manualmente questa interfaccia, dovresti aggiornare la tua implementazione per riflettere questo nuovo metodo:

public function sole($key = null, $operator = null, $value = null);

 

Il reduceWithKeys metodo è stato rimosso poiché il metodo reduce fornisce la stessa funzionalità. Puoi semplicemente aggiornare il tuo codice per chiamare reduce invece di reduceWithKeys, inoltre il metodo reduceMany è stato rinominato reduceSpread per la coerenza dei nomi con altri metodi simili.

Contenitore

Funzione Container 

Probabilità di impatto sull approccio all’apprendimento al framework:  BASSA 

Il Illuminate\Contracts\Container\Container ha ricevuto due definizioni di metodo: scoped e scopedIf. Se stai implementando manualmente questa funzuone, dovresti aggiornare la tua implementazione per riflettere questi nuovi metodi.

Funzione ContextualBindingBuilder

Probabilità di impatto sull approccio all’apprendimento al framework:  BASSA 

Il Illuminate\Contracts\Container\ContextualBindingBuilder ora definisce un metodo giveConfig. Se stai implementando manualmente questa interfaccia, dovresti aggiornare la tua implementazione per riflettere questo nuovo metodo:

public function giveConfig($key, $default = null);

Banca dati

Configurazione “Schema” Postgres

Probabilità di impatto sull approccio all’apprendimento al framework:  MEDIA

L’ opzione schema di configurazione utilizzata per configurare i percorsi di ricerca della connessione Postgres nel config/database.php  nel file di configurazione della tua applicazione dovrebbe essere rinominata in search_path.

Metodo di creazione dello schema registerCustomDoctrineType

Probabilità di impatto sull approccio all’apprendimento al framework:  BASSA

Il metodo registerCustomDoctrineType è stato rimosso dalla classe Illuminate\Database\Schema\Builder. Puoi invece utilizzare il  metodo registerDoctrineType sulla DB o registrare tipi di Doctrine personalizzati nel file di configurazione config/database.php.

Eloquent

Cast personalizzati e null

Probabilità di impatto sull approccio all’apprendimento al framework:  MEDIA

Nelle versioni precedenti di Laravel, il metodo set delle classi cast personalizzate non veniva invocato se l’attributo cast era impostato su null, tuttavia, questo comportamento non era coerente con la documentazione di Laravel. In Laravel 9.x, il metodo set della classe cast verrà invocato con null come $value fornito. Dovresti pertanto assicurarti che i tuoi cast personalizzati siano in grado di gestire sufficientemente questo scenario:

/**

* Prepare the given value for storage.

*

* @param  \Illuminate\Database\Eloquent\Model  $model

* @param  string  $key

* @param  AddressModel  $value

* @param  array  $attributes

* @return array

*/

public function set($model, $key, $value, $attributes)

{

   if (! $value instanceof AddressModel) {

       throw new InvalidArgumentException(The given value is not an Address instance.);

   }

 

   return [

       address_line_one => $value->lineOne,

       address_line_two => $value->lineTwo,

   ];

}

Metodi  firstOrNew, firstOrCreate e updateOrCreate

Probabilità di impatto sull approccio all’apprendimento al framework:  MEDIA

I metodi  belongsToMany della relazione accettano tutti una matrice di attributi come primo argomento. Nelle versioni precedenti di Laravel, questa matrice di attributi è stata confrontata con la tabella “pivot”/intermedio per i record esistenti .firstOrNewfirstOrCreateupdateOrCreate

Questo comportamento era imprevisto e in genere indesiderato. Con Laravel 9 questi metodi oggi confrontano l’array di attributi con la tabella del modello correlato:

$user->roles()->updateOrCreate([

   name => Administrator,

]);

Il metodo firstOrCreate ora accetta una  $value smatrice come secondo argomento. Questo array verrà unito a $attributes durante la creazione del modello correlato, se non ne esiste già uno. Questa modifica rende questo metodo coerente con i metodi firstOrCreate offerti da altri tipi di relazione:

$user->roles()->firstOrCreate([

   name => Administrator,

], [

   created_by => $user->id,

]);

Il  metodo touch

Probabilità di impatto sull approccio all’apprendimento al framework:  BASSA

Il metodo touch ora accetta un attributo da toccare. Se in precedenza stavi sovrascrivendo questo metodo, dovresti aggiornare la firma del tuo metodo:

public function touch($attribute = null);

Crittografia

Funzione Crittografia

Probabilità di impatto sull approccio all’apprendimento al framework:  BASSA

La funzione Illuminate\Contracts\Encryption\Encrypter ora definisce un metodo getKey. Se stai implementando manualmente questa interfaccia, dovresti aggiornare la tua implementazione di conseguenza:

public function getKey();

facciate

Il metodo getFacadeAccessor

Probabilità di impatto sull approccio all’apprendimento al framework:  BASSA

Il metodo getFacadeAccessor deve sempre restituire una chiave di associazione del contenitore. Nelle versioni precedenti di Laravel, questo metodo poteva restituire un’istanza dell’oggetto; tuttavia, questo comportamento non è più supportato. Ti dovresti comunque assicurare che questo metodo restituisca una stringa di associazione del contenitore:

/**

* Get the registered name of the component.

*

* @return string

*/

protected static function getFacadeAccessor()

{

   return Example::class;

}

File system

La variabile FILESYSTEM_DRIVER d’ambiente

Probabilità di impatto sull approccio all’apprendimento al framework:  BASSA 

La variabile FILESYSTEM_DRIVER  di ambiente è stata rinominata per riflettere  FILESYSTEM_DISK in modo più accurato in relazione al suo utilizzo. Questa modifica riguarda solo lo scheletro dell’applicazione; tuttavia, puoi aggiornare le variabili di ambiente della tua applicazione per riflettere questa modifica, se lo desideri.

Il disco “Nuvola”.

Probabilità di impatto sull approccio all’apprendimento al framework:  BASSA 

L’ opzione cloud di configurazione del disco è stata rimossa dallo scheletro dell’applicazione predefinito nel Novembre del 2020; attenzione perché questa modifica riguarda solo lo scheletro dell’applicazione. Se stai utilizzando il cloud all’interno della tua applicazione, dovresti lasciare questo valore di configurazione nello scheletro della tua applicazione.

Sistema Fly 3.x

Probabilità di impatto sull approccio all’apprendimento al framework:  ALTA 

Laravel 9.x è migrato da Flysystem 1.x a 3.x.  Flysystem alimenta tutti i metodi di manipolazione dei file forniti dallo Storage. Alla luce di ciò, potrebbero essere necessarie alcune modifiche all’interno dell’applicazione; tuttavia, abbiamo cercato di rendere questa transizione il più agevole possibile.

Prerequisiti del conducente

Prima di utilizzare i driver S3, FTP o SFTP, dovrai installare il pacchetto appropriato tramite il gestore pacchetti Composer:

  • Amazon S3:composer require -W league/flysystem-aws-s3-v3 “^3.0”
  • FTP:composer require league/flysystem-ftp “^3.0”
  • SFTP:composer require league/flysystem-sftp-v3 “^3.0”

Sovrascrittura di file esistenti

Operazioni di scrittura come put, write, writeStream ora sovrascrivono i file esistenti per impostazione predefinita. Se non si desidera sovrascrivere i file esistenti, è necessario verificare manualmente l’esistenza del file prima di eseguire l’operazione di scrittura.

Lettura di file mancanti

Il tentativo di leggere da un file che non esiste ora ritorna null. Nelle versioni precedenti di Laravel non accadeva.

Eliminazione di file mancanti

Il tentativo di delete di un file che non esiste ora restituisce true.

Adattatori memorizzati nella cache

Flysystem non supporta più gli “adattatori memorizzati nella cache”. Pertanto, sono stati rimossi da Laravel e qualsiasi configurazione rilevante (come la cache all’interno delle configurazioni del disco) può essere rimossa.

Filesystem personalizzati

Sono state apportate lievi modifiche ai passaggi necessari per registrare i driver del filesystem personalizzati. Pertanto, se stavi definendo i tuoi driver di filesystem personalizzati o se stavi usando pacchetti che definiscono driver personalizzati, dovresti aggiornare il tuo codice e le dipendenze.

Ad esempio, in Laravel 8.x, un driver di filesystem personalizzato potrebbe essere registrato in questo modo:

use Illuminate\Support\Facades\Storage;

use League\Flysystem\Filesystem;

use Spatie\Dropbox\Client as DropboxClient;

use Spatie\FlysystemDropbox\DropboxAdapter;

 

Storage::extend(dropbox, function ($app, $config) {

   $client = new DropboxClient(

       $config[authorization_token]

   );

 

   return new Filesystem(new DropboxAdapter($client));

});

Tuttavia, in Laravel 9.x, il callback dato al metodo Storage::extend dovrebbe restituire direttamente un’istanza di Illuminate\Filesystem\FilesystemAdapter:

use Illuminate\Filesystem\FilesystemAdapter;

use Illuminate\Support\Facades\Storage;

use League\Flysystem\Filesystem;

use Spatie\Dropbox\Client as DropboxClient;

use Spatie\FlysystemDropbox\DropboxAdapter;

 

Storage::extend(dropbox, function ($app, $config) {

   $adapter = new DropboxAdapter(new DropboxClient(

       $config[authorization_token]

   ););

 

   return new FilesystemAdapter(

       new Filesystem($adapter, $config),

       $adapter,

       $config

   );

});

Aiutanti

data_get helper e gli oggetti iterabili

Probabilità di impatto sull approccio all’apprendimento al framework:  BASSA 

In precedenza, il data_get helper poteva essere utilizzato per recuperare dati nidificati su array e istanze Collection; tuttavia, questo helper ora può recuperare i dati nidificati su tutti gli oggetti iterabili.

L’ aiutante str

Probabilità di impatto sull approccio all’apprendimento al framework:  BASSA 

Laravel 9.x ora include una str funzione di supporto global . Se stai definendo un str helper globale nella tua applicazione, dovresti rinominarlo o rimuoverlo in modo che non sia in conflitto con l’helper di Laravel str.

I metodi when/unless

Probabilità di impatto sull approccio all’apprendimento al framework:  MEDIA

Come forse saprai, i metodi  when e unless sono offerti da varie classi in tutto il framework. Questi metodi possono essere utilizzati per eseguire condizionalmente un’azione se il valore booleano del metodo restituisce true o false:

$collection->when(true, function ($collection) {

   $collection->merge([1, 2, 3]);

});

Pertanto, nelle versioni precedenti di Laravel, passare una chiusura ai metodi when o unless significava che l’operazione condizionale veniva sempre eseguita, poiché un confronto libero con un oggetto chiusura (o qualsiasi altro oggetto) restituisce sempre true. Ciò ha spesso portato a risultati imprevisti proprio perché gli sviluppatori si aspettano che il risultato della chiusura venga utilizzato come valore booleano che determina se l’azione condizionale viene eseguita.

Quindi, in Laravel 9.x, tutte le chiusure passate ai metodi when o unless verranno eseguite e il valore restituito dalla chiusura sarà considerato il valore booleano utilizzato dai metodi when e :unless

$collection->when(function ($collection) {

   // This closure is executed…

   return false;

}, function ($collection) {

   // Not executed since first closure returned “false”…

   $collection->merge([1, 2, 3]);

});

Client HTTP

Timeout predefinito

 

Il client HTTP ha ora un timeout predefinito di 30 secondi. In altre parole, se il server non risponde entro 30 secondi, verrà generata un’eccezione. In precedenza, sul client HTTP non era configurata alcuna lunghezza di timeout predefinita, causando talvolta il “blocco” delle richieste indefinitamente.

Se desideri specificare un timeout più lungo per una determinata richiesta, puoi farlo utilizzando il timeoutmetodo:

$response = Http::timeout(120)->get();

HTTP falso e middleware

Probabilità di impatto sull approccio all’apprendimento al framework:  BASSA 

In precedenza, Laravel non eseguiva alcun middleware HTTP Guzzle fornito quando il client HTTP era “falso”. Tuttavia, in Laravel 9.x, il middleware HTTP Guzzle verrà eseguito anche quando il client HTTP è falso.

Iniezione di falsi e dipendenze HTTP

Probabilità di impatto sull approccio all’apprendimento al framework:  BASSA 

Nelle versioni precedenti di Laravel, invocare il metodo  Http::fake()non avrebbe influenzato le istanze di Illuminate\Http\Client\Factory che erano state iniettate nei costruttori di classi. Tuttavia, in Laravel 9.x, Http:,:fake()garantirà che le risposte false vengano restituite dai client HTTP inseriti in altri servizi tramite l’iniezione delle dipendenze. 

Mailer Symfony

Probabilità di impatto sull approccio all’apprendimento al framework:  ALTA

Uno dei più grandi cambiamenti in Laravel 9.x è la transizione da SwiftMailer – che non è più mantenuto a partire da dicembre 2021 –  a Symfony Mailer. Tuttavia,  si è cercato di rendere questa transizione il più semplice possibile per le tue applicazioni. Dovrai esaminare attentamente l’elenco delle modifiche per assicurarti che la tua applicazione sia completamente compatibile.

Prerequisiti del conducente

Per continuare a utilizzare il trasporto Mailgun, la tua applicazione dovrebbe richiedere i pacchetti symfony/mailgun-mailere symfony/http-client Composer:

composer require symfony/mailgun-mailer symfony/http-client

Il pacchetto Composer wildbit/swiftmailer-postmark dovrebbe essere rimosso dall’applicazione. Invece, la tua applicazione dovrebbe richiedere i pacchetti symfony/postmark-mailere symfony/http-clientComposer:

composer require symfony/postmark-mailer symfony/http-client

Tipi di reso aggiornati

I metodi send, html, text e plain non restituiscono più il numero di destinatari che hanno ricevuto il messaggio, viene invece restituita un’istanza  Illuminate\Mail\SentMessage

A sua volta questo oggetto contiene un’istanza Symfony\Component\Mailer\SentMessage accessibile tramite il metodo getSymfonySentMessage oppure richiamando dinamicamente metodi sull’oggetto.

Metodi “Swift” rinominati

Vari metodi relativi a SwiftMailer, alcuni dei quali non documentati, sono stati rinominati nelle loro controparti di Symfony Mailer. Ad esempio, il metodo withSwiftMessage  è stato rinominato in withSymfonyMessage:

// Laravel 8.x…

$this->withSwiftMessage(function ($message) {

   $message->getHeaders()->addTextHeader(

       Custom-Header, Header Value

   );

});

 

// Laravel 9.x…

use Symfony\Component\Mime\Email;

 

$this->withSymfonyMessage(function (Email $message) {

   $message->getHeaders()->addTextHeader(

       Custom-Header, Header Value

   );

});

 

Si prega di rivedere accuratamente la documentazione di Symfony Mailer per tutte le possibili interazioni con l’oggetto Symfony\Component\Mime\Email.

L’elenco seguente contiene una panoramica più approfondita dei metodi rinominati. Molti di questi metodi sono metodi di basso livello utilizzati per interagire direttamente con SwiftMailer/Symfony Mailer, quindi potrebbero non essere comunemente usati nella maggior parte delle applicazioni Laravel:

Message::getSwiftMessage();

Message::getSymfonyMessage();

 

Mailable::withSwiftMessage($callback);

Mailable::withSymfonyMessage($callback);

 

MailMessage::withSwiftMessage($callback);

MailMessage::withSymfonyMessage($callback);

 

Mailer::getSwiftMailer();

Mailer::getSymfonyTransport();

 

Mailer::setSwiftMailer($swift);

Mailer::setSymfonyTransport(TransportInterface $transport);

 

MailManager::createTransport($config);

MailManager::createSymfonyTransport($config);

Illuminate\Mail\Message Metodi proxy

I metodi Illuminate\Mail\Message mancanti in genere venivano inviati tramite proxy Swift_Message all’istanza sottostante. Tuttavia, i metodi mancanti ora vengono invece  inviati tramite proxy a un’istanza di Symfony\Component\Mime\Email. Quindi, qualsiasi codice che in precedenza si basava su metodi mancanti per essere inviato tramite proxy a SwiftMailer dovrebbe essere aggiornato alle corrispondenti controparti di Symfony Mailer.

Ancora una volta, molte applicazioni potrebbero non interagire con questi metodi, poiché non sono documentati nella documentazione di Laravel:

// Laravel 8.x…

$message

   ->setFrom(taylor@laravel.com)

   ->setTo(example@example.org)

   ->setSubject(Order Shipped)

   ->setBody(<h1>HTML</h1>, text/html)

   ->addPart(Plain Text, text/plain);

 

// Laravel 9.x…

$message

   ->from(taylor@laravel.com)

   ->to(example@example.org)

   ->subject(Order Shipped)

   ->html(<h1>HTML</h1>)

   ->text(Plain Text);

ID messaggi generati

SwiftMailer ha offerto la possibilità di definire un dominio personalizzato da includere negli ID messaggio generati tramite l’opzione  mime.idgenerator.idright di configurazione; questo non è supportato da Symfony Mailer. Symfony Mailer genererà automaticamente un ID messaggio basato sul mittente.

Riconnessioni Forzate

Non è più possibile forzare una riconnessione  (ad esempio quando il mailer è in esecuzione tramite un processo daemon). Symfony Mailer tenterà di riconnettersi automaticamente generando un’eccezione se la riconnessione fallisce.

Opzioni del flusso SMTP

La definizione delle opzioni di flusso per il trasporto SMTP non è più supportata. È invece necessario definire le opzioni pertinenti direttamente all’interno della configurazione se sono supportate. Ad esempio, per disabilitare la verifica peer TLS:

smtp => [

   // Laravel 8.x…

   stream => [

       ssl => [

           verify_peer => false,

       ],

   ],

 

   // Laravel 9.x…

   verify_peer => false,

],

Per saperne di più sulle opzioni di configurazione disponibili, avrete comunque modo di consultare la documentazione di Symfony Mailer .

 

Nonostante l’esempio sopra, non è consigliato disabilitare la verifica SSL poiché introduce la possibilità di attacchi “man-in-the-middle”.

SMTP auth_mode

Non è più necessario definire l’SMTP auth_mode nel file di configurazione  mail.

La modalità di autenticazione verrà automaticamente negoziata tra Symfony Mailer e il server SMTP.

Destinatari falliti

Non è più possibile recuperare un elenco di destinatari non riusciti dopo l’invio di un messaggio. Al contrario,  con Symfony\Component\Mailer\Exception\TransportExceptionInterface verrà generata un’eccezione se un messaggio non viene inviato; invece di fare affidamento sul recupero di indirizzi e-mail non validi dopo l’invio di un messaggio, ti consigliamo di convalidare gli indirizzi e-mail prima di inviare il messaggio.

Pacchi

Il lang Direttorio

Probabilità di impatto sull approccio all’apprendimento al framework:  MEDIA

Nelle nuove applicazioni Laravel, la resources/lang directory si trova ora nella directory principale del progetto ( lang). Se il tuo pacchetto sta pubblicando file di lingua in questa directory, dovresti assicurarti che il tuo pacchetto stia pubblicando app()->langPath() invece che in un percorso hardcoded.

Fare la fila

La opis/closureBiblioteca

Probabilità di impatto sull approccio all’apprendimento al framework:  BASSA

La dipendenza di Laravel da opis/closure è stata sostituita da laravel/serializable-closure. Ciò non dovrebbe causare modifiche sostanziali nell’applicazione a meno che non si interagisca opis/closure direttamente con la libreria. Inoltre, le classi Illuminate\Queue\SerializableClosureFactorye le classi Illuminate\Queue\SerializableClosure precedentemente deprecate sono state rimosse. Se stai interagendo opis/closure direttamente con la libreria o utilizzando una delle classi rimosse, puoi invece utilizzare Laravel Serializable Closure .

Il metodo flush del fornitore di lavori non riuscito

Probabilità di impatto sull approccio all’apprendimento al framework:  BASSA 

Il metodo flush  definito dall’interfaccia Illuminate\Queue\Failed\FailedJobProviderInterface ora accetta una variabile $hourche determina quanti anni deve avere un lavoro non riuscito (in ore) prima che venga cancellato dal comando queue:flush. Se stai implementando manualmente FailedJobProviderInterface, dovresti assicurarti che la tua implementazione sia aggiornata per riflettere questo nuovo argomento:

public function flush($hours = null);

Sessione

Il metodo getSession

Probabilità di impatto sull approccio all’apprendimento al framework:  BASSA 

La classe Symfony\Component\HttpFoundaton\Requestestesa dalla classe di Laravel Illuminate\Http\Request offre un metodo getSession per ottenere il gestore di archiviazione della sessione corrente. Questo metodo non è documentato da Laravel poiché la maggior parte delle applicazioni Laravel interagiscono con la sessione tramite il metodo di Laravel session.

Il metodo getSession in precedenza ha restituito un’istanza di Illuminate\Session\Store o null; tuttavia, a causa del rilascio di Symfony 6.x che impone Symfony\Component\HttpFoundation\Session\SessionInterface, getSession ecco che ora restituisce correttamente un’implementazione SessionInterface o genera un’eccezione \Symfony\Component\HttpFoundation\Exception\SessionNotFoundException quando non è disponibile alcuna sessione.

Test

Il assertDeleted metodo

Probabilità di impatto sull approccio all’apprendimento al framework:  MEDIA

Tutte le chiamate al metodo assertDeleted devono essere aggiornate a assertModelMissing.

Proxy affidabili

Probabilità di impatto sull approccio all’apprendimento al framework:  BASSA

Se stai aggiornando il tuo progetto Laravel 8 a Laravel 9 importando il codice dell’applicazione esistente in uno scheletro di applicazione Laravel 9 completamente nuovo, ecco che potrebbe essere necessario aggiornare il middleware “proxy affidabile” della tua applicazione.

All’interno del tuo file app/Http/Middleware/TrustProxies.php, aggiorna use Fideloper\Proxy\TrustProxies as Middleware a use Illuminate\Http\Middleware\TrustProxies as Middleware.

Successivamente, all’interno di app/Http/Middleware/TrustProxies.php dovresti aggiornare la definizione $headers della proprietà:

// Before…

protected $headers = Request::HEADER_X_FORWARDED_ALL;

 

// After…

protected $headers =

   Request::HEADER_X_FORWARDED_FOR |

   Request::HEADER_X_FORWARDED_HOST |

   Request::HEADER_X_FORWARDED_PORT |

   Request::HEADER_X_FORWARDED_PROTO |

   Request::HEADER_X_FORWARDED_AWS_ELB;

Infine, puoi rimuovere la dipendenza fideloper/proxy Composer dalla tua applicazione:

composer remove fideloper/proxy

Convalida

validatedMetodo di richiesta del modulo

Probabilità di impatto sull approccio all’apprendimento al framework:  BASSA

Il metodo validated metodo offerto dalle richieste di modulo ora accetta $key e la variabile $default. Se stai sovrascrivendo manualmente la definizione di questo metodo, dovresti aggiornare la firma del tuo metodo:

public function validated($key = null, $default = null)

Regola password 

Probabilità di impatto sull approccio all’apprendimento al framework:  MEDIA

La regole password che stabilisce che il valore di input specificato corrisponda alla password corrente dell’utente autenticato è stata rinominata in current_password.

Chiavi di matrice non convalidate

Probabilità di impatto sull approccio all’apprendimento al framework:  MEDIA

Nelle versioni precedenti di Laravel, ti veniva richiesto di istruire manualmente il validatore di Laravel per escludere le chiavi dell’array non convalidate dai dati “convalidati” che restituisce, specialmente in combinazione con una regola array che non specifica un elenco di chiavi consentite.

Tuttavia, in Laravel 9.x, le chiavi dell’array non convalidate sono sempre escluse dai dati “convalidati” anche quando non sono state specificate chiavi consentite tramite la regola array. In genere, questo comportamento è il comportamento più frequente, d’altronde il metodo excludeUnvalidatedArrayKeys precedente è stato aggiunto solo a Laravel 8.x come misura temporanea per preservare la compatibilità con le versioni precedenti.

Sebbene non sia raccomandato, puoi sempre accettare il precedente comportamento di Laravel 8.x invocando un nuovo metodo includeUnvalidatedArrayKeys all’interno del metodo boot di uno dei fornitori di servizi della tua applicazione:

use Illuminate\Support\Facades\Validator;

 

/**

* Register any application services.

*

* @return void

*/

public function boot()

{

   Validator::includeUnvalidatedArrayKeys();

}

Varie

Ti invitiamo inoltre a visualizzare le modifiche nel laravel/laravel repository GitHub . Sebbene molte di queste modifiche non siano necessarie, potresti voler mantenere questi file sincronizzati con la tua applicazione. Alcune di queste modifiche saranno trattate in questa guida all’aggiornamento, ma altre, come le modifiche ai file di configurazione o ai commenti, non lo saranno. Puoi facilmente visualizzare le modifiche con lo strumento di confronto GitHub e scegliere quali aggiornamenti sono importanti per te.