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:
- Canale di notifica Vonage (v3.0) (sostituisce Nexmo)
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.