نسخه:

راهنمای ارتقا

تغییرات با تاثیر زیاد

تغییرات تاثیر متوسط

ارتقاء به 9.0 از 8.x

زمان تخمینی ارتقا: 30 دقیقه

ما سعی می کنیم هر تغییر احتمالی را مستند کنیم. از آنجایی که برخی از این تغییرات شکسته در بخش‌های مبهم فریمورک هستند، تنها بخشی از این تغییرات ممکن است بر برنامه شما تأثیر بگذارد. می خواهید در زمان صرفه جویی کنید؟ می توانید از Laravel Shift برای کمک به ارتقاء خودکار برنامه خود استفاده کنید.

به روز رسانی وابستگی ها

احتمال تاثیر: زیاد

PHP 8.0.2 مورد نیاز است

لاراول اکنون به PHP 8.0.2 یا بالاتر نیاز دارد.

وابستگی های composer

شما باید وابستگی های زیر را در فایل برنامه خود به روز کنید composer.json :

  • laravel/framework به ^9.0
  • nunomaduro/collision به ^6.1

علاوه بر این، لطفاً facade/ignition با "spatie/laravel-ignition": "^1.0" و pusher/pusher-php-server (در صورت وجود) "pusher/pusher-php-server": "^5.0" در فایل درخواست خود جایگزین کنید composer.json .

علاوه بر این، بسته‌های شخص اول زیر، نسخه‌های اصلی جدیدی را برای پشتیبانی از Laravel 9.x دریافت کرده‌اند. در صورت وجود، باید راهنمای ارتقاء فردی آنها را قبل از ارتقا بخوانید:

در نهایت، سایر بسته های شخص ثالث مصرف شده توسط برنامه شما را بررسی کنید و بررسی کنید که از نسخه مناسب برای پشتیبانی لاراول 9 استفاده می کنید.

انواع بازگشت PHP

PHP در حال تبدیل شدن به نیاز به تعاریف نوع بازگشتی در متدهای PHP مانند offsetGet ، offsetSet و غیره است. با توجه به این موضوع، لاراول 9 این انواع بازگشتی را در پایه کد خود پیاده سازی کرده است. به طور معمول، این نباید بر روی کد نوشته شده کاربر تأثیر بگذارد. با این حال، اگر یکی از این روش‌ها را با گسترش کلاس‌های اصلی لاراول نادیده می‌گیرید، باید این انواع بازگشتی را به برنامه یا کد بسته خود اضافه کنید:

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

علاوه بر این، انواع بازگشت به روش‌های پیاده‌سازی PHP اضافه شد SessionHandlerInterface . باز هم، بعید است که این تغییر روی برنامه یا کد بسته شما تأثیر بگذارد:

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

کاربرد

قرارداد Application _

احتمال تاثیر: کم

روش storagePath رابط Illuminate\Contracts\Foundation\Application برای پذیرش یک آرگومان به روز شده است $path . اگر این رابط را پیاده سازی می کنید، باید پیاده سازی خود را بر این اساس به روز کنید:

public function storagePath($path = '');

به طور مشابه، langPath متد کلاس برای پذیرش یک آرگومان Illuminate\Foundation\Application به روز شده است : $path

public function langPath($path = '');

ignore روش کنترل استثنایی

احتمال تاثیر: کم

روش کنترل کننده استثنا ignore اکنون public به جای protected . این روش در اسکلت برنامه پیش فرض گنجانده نشده است. با این حال، اگر این روش را به صورت دستی تعریف کرده اید، باید قابلیت مشاهده آن را به public :

public function ignore(string $class);

Exception Handler Contract Binding

احتمال تاثیر: بسیار کم

پیش از این، برای لغو پیش‌فرض کنترل‌کننده استثنای لاراول، پیاده‌سازی‌های سفارشی با استفاده از \App\Exceptions\Handler::class نوع به کانتینر سرویس متصل می‌شدند. با این حال، اکنون باید پیاده سازی های سفارشی را با استفاده از \Illuminate\Contracts\Debug\ExceptionHandler::class نوع متصل کنید.

تیغه

Lazy Collections & The $loop Variable

احتمال تاثیر: کم

هنگام تکرار روی یک LazyCollection نمونه در قالب Blade، $loop متغیر دیگر در دسترس نیست، زیرا دسترسی به این متغیر باعث می‌شود کل LazyCollection در حافظه بارگذاری شود، بنابراین استفاده از مجموعه‌های تنبل در این سناریو بی‌معنی می‌شود.

دستورالعمل های تیغه بررسی / غیرفعال / انتخاب شده

احتمال تاثیر: کم

دستورالعمل های جدید @checked ، @disabled و @selected Blade ممکن است با رویدادهای Vue به همین نام مغایرت داشته باشد. می توانید @@ برای فرار از دستورالعمل ها و جلوگیری از این تضاد از: @@selected .

مجموعه ها

قرارداد Enumerable _

احتمال تاثیر: کم

Illuminate\Support\Enumerable اکنون قرارداد یک روش را تعریف می کند sole . اگر به صورت دستی این رابط را پیاده سازی می کنید، باید پیاده سازی خود را به روز کنید تا این روش جدید را منعکس کند:

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

روش reduceWithKeys _

این reduceWithKeys روش حذف شده است زیرا reduce روش همان عملکرد را ارائه می دهد. می توانید به سادگی کد خود را برای تماس به reduce جای reduceWithKeys .

روش reduceMany _

این reduceMany روش به دلیل سازگاری نام با سایر روش های مشابه به نام تغییر نام یافته است reduceSpread .

ظرف

قرارداد Container _

احتمال تاثیر: بسیار کم

قرارداد Illuminate\Contracts\Container\Container دو تعریف روش دریافت کرده است: scoped و scopedIf . اگر به صورت دستی این قرارداد را اجرا می کنید، باید اجرای خود را به روز کنید تا این روش های جدید را منعکس کنید.

قرارداد ContextualBindingBuilder _

احتمال تاثیر: بسیار کم

Illuminate\Contracts\Container\ContextualBindingBuilder اکنون قرارداد یک روش را تعریف می کند giveConfig . اگر به صورت دستی این رابط را پیاده سازی می کنید، باید پیاده سازی خود را به روز کنید تا این روش جدید را منعکس کند:

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

پایگاه داده

پیکربندی Postgres "Schema".

احتمال تاثیر: متوسط

گزینه schema پیکربندی مورد استفاده برای پیکربندی مسیرهای جستجوی اتصال Postgres در فایل پیکربندی برنامه شما config/database.php باید به تغییر نام داده شود search_path .

registerCustomDoctrineType روش طرحواره ساز

احتمال تاثیر: کم

متد registerCustomDoctrineType از کلاس حذف شده است Illuminate\Database\Schema\Builder . می‌توانید به جای آن از registerDoctrineType روش روی DB نما استفاده کنید یا انواع Doctrine سفارشی را در config/database.php فایل پیکربندی ثبت کنید.

شیوا

بازیگران سفارشی و null

احتمال تاثیر: متوسط

در نسخه‌های قبلی لاراول، set اگر ویژگی cast روی cast تنظیم شده بود، از روش کلاس‌های Cast سفارشی استفاده نمی‌شد null . با این حال، این رفتار با اسناد لاراول ناسازگار بود. در لاراول 9.x، set متد کلاس cast null به عنوان آرگومان ارائه شده فراخوانی می شود $value . بنابراین، باید اطمینان حاصل کنید که بازیگران سفارشی شما به اندازه کافی قادر به مدیریت این سناریو هستند:

/**
* 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,
];
}

متعلق به بسیاری از firstOrNew ، firstOrCreate و updateOrCreate روش ها است

احتمال تاثیر: متوسط

متدهای belongsToMany رابطه firstOrNew ، firstOrCreate و updateOrCreate همگی آرایه ای از صفات را به عنوان اولین آرگومان خود می پذیرند. در نسخه های قبلی لاراول، این آرایه از ویژگی ها با جدول محوری / میانی برای رکوردهای موجود مقایسه شد.

با این حال، این رفتار غیرمنتظره و معمولاً ناخواسته بود. در عوض، این روش‌ها اکنون آرایه ویژگی‌ها را با جدول مدل مرتبط مقایسه می‌کنند:

$user->roles()->updateOrCreate([
'name' => 'Administrator',
]);

علاوه بر این، firstOrCreate روش اکنون یک $values آرایه را به عنوان آرگومان دوم خود می پذیرد. این آرایه با اولین آرگومان متد ( $attributes ) ادغام می شود که مدل مربوطه را ایجاد می کند، اگر یکی از قبل وجود نداشته باشد. این تغییر این روش را با firstOrCreate روش های ارائه شده توسط سایر انواع روابط سازگار می کند:

$user->roles()->firstOrCreate([
'name' => 'Administrator',
], [
'created_by' => $user->id,
]);

روش touch _

احتمال تاثیر: کم

روش touch اکنون یک ویژگی را برای لمس می پذیرد. اگر قبلاً این روش را بازنویسی می‌کردید، باید امضای متد خود را به‌روزرسانی کنید تا این آرگومان جدید را منعکس کند:

public function touch($attribute = null);

رمزگذاری

قرارداد رمزگذار

احتمال تاثیر: کم

Illuminate\Contracts\Encryption\Encrypter اکنون قرارداد یک روش را تعریف می کند getKey . اگر به صورت دستی این رابط را پیاده سازی می کنید، باید پیاده سازی خود را بر این اساس به روز کنید:

public function getKey();

نماها

روش getFacadeAccessor _

احتمال تاثیر: کم

این getFacadeAccessor روش باید همیشه یک کلید اتصال کانتینری را برگرداند. در نسخه های قبلی لاراول، این روش می تواند یک نمونه شی را برگرداند. با این حال، این رفتار دیگر پشتیبانی نمی شود. اگر نماهای خود را نوشته اید، باید مطمئن شوید که این روش یک رشته اتصال کانتینر را برمی گرداند:

/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor()
{
return Example::class;
}

سیستم فایل

FILESYSTEM_DRIVER متغیر محیطی

احتمال تاثیر: کم

متغیر FILESYSTEM_DRIVER محیطی به تغییر نام داده شده است FILESYSTEM_DISK تا کاربرد آن را با دقت بیشتری منعکس کند. این تغییر فقط روی اسکلت برنامه تاثیر می گذارد. با این حال، می‌توانید در صورت تمایل، متغیرهای محیط برنامه خود را به‌روزرسانی کنید تا این تغییر را منعکس کنید.

دیسک "ابر".

احتمال تاثیر: کم

گزینه cloud پیکربندی دیسک در نوامبر 2020 از اسکلت برنامه پیش‌فرض حذف شد. این تغییر فقط روی اسکلت برنامه تأثیر می‌گذارد. اگر از دیسک در برنامه خود استفاده می کنید cloud ، باید این مقدار پیکربندی را در اسکلت برنامه خود بگذارید.

Flysystem 3.x

احتمال تاثیر: زیاد

لاراول 9.x از Flysystem 1.x به 3.x مهاجرت کرده است. زیر کاپوت، Flysystem تمام روش های دستکاری فایل ارائه شده توسط Storage نما را تامین می کند. در پرتو این، ممکن است برخی تغییرات در برنامه شما مورد نیاز باشد. با این حال، ما سعی کرده ایم این انتقال را تا حد امکان بدون درز انجام دهیم.

پیش نیاز راننده

قبل از استفاده از درایورهای S3، FTP یا SFTP، باید بسته مناسب را از طریق مدیر بسته Composer نصب کنید:

  • آمازون 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"

رونویسی فایل های موجود

عملیاتی مانند put ، را بنویسید write و writeStream اکنون فایل های موجود را به طور پیش فرض بازنویسی کنید. اگر نمی خواهید فایل های موجود را بازنویسی کنید، باید قبل از انجام عملیات نوشتن، وجود فایل را به صورت دستی بررسی کنید.

استثناها را بنویسید

عملیاتی مانند put ، را بنویسید write و writeStream در صورت شکست عملیات نوشتن، دیگر استثناء ایجاد نکنید. در عوض، false برگردانده می شود. اگر می‌خواهید رفتار قبلی که استثناها را ایجاد می‌کرد حفظ کنید، می‌توانید این throw گزینه را در آرایه پیکربندی دیسک فایل سیستم تعریف کنید:

'public' => [
'driver' => 'local',
// ...
'throw' => true,
],

خواندن فایل های گم شده

تلاش برای خواندن از فایلی که اکنون وجود ندارد برمی گردد null . در نسخه‌های قبلی لاراول، یک مورد Illuminate\Contracts\Filesystem\FileNotFoundException پرتاب می‌شد.

حذف فایل های از دست رفته

تلاش برای delete فایلی که اکنون وجود ندارد برمی گردد true .

آداپتورهای ذخیره شده در حافظه پنهان

Flysystem دیگر از "آداپتورهای کش" پشتیبانی نمی کند. بنابراین، آنها از لاراول حذف شده اند و هر گونه پیکربندی مربوطه (مانند cache کلید در تنظیمات دیسک) را می توان حذف کرد.

فایل سیستم های سفارشی

تغییرات جزئی در مراحل مورد نیاز برای ثبت درایورهای سیستم فایل سفارشی ایجاد شده است. بنابراین، اگر درایورهای سیستم فایل سفارشی خود را تعریف می‌کنید، یا از بسته‌هایی استفاده می‌کنید که درایورهای سفارشی را تعریف می‌کنند، باید کد و وابستگی‌های خود را به‌روزرسانی کنید.

برای مثال، در لاراول 8.x، یک درایور سیستم فایل سفارشی ممکن است به این صورت ثبت شود:

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));
});

با این حال، در لاراول 9.x، فراخوانی داده شده به متد باید یک نمونه از مستقیماً Storage::extend برگرداند : 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
);
});

رمز عبور کلید عمومی-خصوصی SFTP

اگر برنامه شما از آداپتور SFTP Flysystem و احراز هویت کلید خصوصی-عمومی استفاده می کند، password آیتم پیکربندی که برای رمزگشایی کلید خصوصی استفاده می شود باید به تغییر نام داده شود passphrase .

یاوران

کمک data_get کننده و اشیاء تکرار شونده

احتمال تاثیر: بسیار کم

پیش از این، data_get کمک کننده می توانست برای بازیابی داده های تو در تو در آرایه ها و Collection نمونه ها استفاده شود. با این حال، این کمک کننده اکنون می تواند داده های تو در تو را روی همه اشیاء تکرار شونده بازیابی کند.

یاور str _

احتمال تاثیر: بسیار کم

Laravel 9.x اکنون دارای یک str تابع کمکی جهانی است . اگر در برنامه خود یک Helper جهانی تعریف می کنید str ، باید نام آن را تغییر دهید یا حذف کنید تا با کمک کننده خود لاراول در تضاد نباشد str .

when / روش unless ها

احتمال تاثیر: متوسط

همانطور که می دانید، when و unless متدها توسط کلاس های مختلف در سراسر چارچوب ارائه می شوند. اگر مقدار بولی اولین آرگومان متد به true یا false :

$collection->when(true, function ($collection) {
$collection->merge([1, 2, 3]);
});

بنابراین، در نسخه‌های قبلی لاراول، انتقال یک بسته به متدهای when یا unless به این معنی بود که عملیات شرطی همیشه اجرا می‌شود، زیرا یک مقایسه ضعیف در برابر یک شی بسته (یا هر شی دیگری) همیشه به true . این اغلب منجر به نتایج غیرمنتظره می‌شود، زیرا توسعه‌دهندگان انتظار دارند که نتیجه بسته شدن به‌عنوان مقدار بولی که تعیین‌کننده اجرای عمل شرطی است استفاده شود.

بنابراین، در لاراول 9.x، هر بسته‌ای که به متدهای when یا ارسال می‌شود unless ، اجرا می‌شود و مقدار بازگردانده شده توسط بسته، مقدار بولی استفاده شده توسط متدهای when و در نظر گرفته می‌شود 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]);
});

سرویس گیرنده HTTP

مهلت زمانی پیش‌فرض

احتمال تاثیر: متوسط

کلاینت HTTP اکنون دارای مهلت زمانی پیش‌فرض 30 ثانیه است. به عبارت دیگر، اگر سرور ظرف 30 ثانیه پاسخ ندهد، یک استثنا ایجاد می شود. پیش از این، هیچ طول وقفه پیش‌فرضی روی کلاینت HTTP پیکربندی نشده بود، که باعث می‌شد درخواست‌ها گاهی اوقات به‌طور نامحدود «هنگ کنند».

اگر می‌خواهید برای یک درخواست معین بازه زمانی طولانی‌تری تعیین کنید، می‌توانید این کار را با استفاده از timeout روش زیر انجام دهید:

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

HTTP Fake & Middleware

احتمال تاثیر: کم

پیش از این، لاراول هیچ یک از میان افزارهای ارائه شده Guzzle HTTP را زمانی که کلاینت HTTP «جعلی» می شد، اجرا نمی کرد . با این حال، در لاراول 9.x، میان افزار Guzzle HTTP حتی زمانی که کلاینت HTTP جعلی باشد، اجرا می شود.

HTTP Fake & Dependency Injection

احتمال تاثیر: کم

در نسخه‌های قبلی لاراول، فراخوانی این روش بر نمونه‌هایی از روش‌هایی که به سازنده‌های کلاس تزریق شده‌اند، Http::fake() تأثیر نمی‌گذارد . Illuminate\Http\Client\Factory با این حال، در لاراول 9.x، Http::fake() اطمینان حاصل می‌کند که پاسخ‌های جعلی توسط کلاینت‌های HTTP که از طریق تزریق وابستگی به سرویس‌های دیگر تزریق می‌شوند، بازگردانده می‌شوند. این رفتار با رفتار سایر نماها و فیک ها سازگارتر است.

سیمفونی میلر

احتمال تاثیر: زیاد

یکی از بزرگترین تغییرات لاراول 9.x انتقال از SwiftMailer است که از دسامبر 2021 دیگر حفظ نشده است، به Symfony Mailer. با این حال، ما سعی کرده‌ایم این انتقال را تا حد امکان بدون درز برای برنامه‌های شما انجام دهیم. همانطور که گفته شد، لطفاً لیست تغییرات زیر را به طور کامل بررسی کنید تا مطمئن شوید که برنامه شما کاملاً سازگار است.

پیش نیاز راننده

برای ادامه استفاده از حمل و نقل Mailgun، برنامه شما باید به بسته‌های Composer symfony/mailgun-mailer و symfony/http-client Composer نیاز داشته باشد:

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

بسته Composer wildbit/swiftmailer-postmark باید از برنامه شما حذف شود. در عوض، برنامه شما باید به بسته‌های Composer symfony/postmark-mailer و symfony/http-client Composer نیاز داشته باشد:

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

انواع بازگشت به روز شده

متدهای send , html , raw , و plain on Illuminate\Mail\Mailer دیگر برنمی گردند void . در عوض، یک نمونه از Illuminate\Mail\SentMessage بازگشت داده می شود. این شی شامل نمونه ای از آن است که از طریق متد یا با فراخوانی متدهای پویا روی شی Symfony\Component\Mailer\SentMessage قابل دسترسی است . getSymfonySentMessage

روش های "سوئیفت" تغییر نام داد

روش‌های مختلف مرتبط با SwiftMailer، که برخی از آنها غیرمستند بودند، به همتایان Symfony Mailer خود تغییر نام داده‌اند. به عنوان مثال، withSwiftMessage نام متد به 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'
);
});

لطفاً اسناد Symfony Mailer را برای همه تعاملات احتمالی با Symfony\Component\Mime\Email شی به طور کامل بررسی کنید.

فهرست زیر شامل نمای کلی تری از روش های تغییر نام یافته است. بسیاری از این روش‌ها روش‌های سطح پایینی هستند که برای تعامل مستقیم با SwiftMailer / Symfony Mailer استفاده می‌شوند، بنابراین ممکن است معمولاً در اکثر برنامه‌های لاراول استفاده نشوند:

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 روش های پروکسی

معمولاً Illuminate\Mail\Message روش‌های گمشده را به نمونه زیربنایی پروکسی می‌کنند Swift_Message . با این حال، روش‌های گمشده اکنون به یک نمونه از پروکسی می‌شوند Symfony\Component\Mime\Email . بنابراین، هر کدی که قبلاً به روش‌های گمشده برای پروکسی شدن به SwiftMailer متکی بود، باید به همتایان Symfony Mailer مربوطه خود به‌روزرسانی شود.

باز هم، بسیاری از برنامه‌ها ممکن است با این روش‌ها تعامل نداشته باشند، زیرا در اسناد لاراول مستند نشده‌اند:

// 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');

شناسه پیام های تولید شده

SwiftMailer امکان تعریف یک دامنه سفارشی را برای گنجاندن در شناسه های پیام ایجاد شده از طریق mime.idgenerator.idright گزینه پیکربندی ارائه می دهد. این توسط Symfony Mailer پشتیبانی نمی شود. در عوض، Symfony Mailer به طور خودکار یک شناسه پیام را بر اساس فرستنده ایجاد می کند.

MessageSent تغییرات رویداد

ویژگی message رویداد Illuminate\Mail\Events\MessageSent اکنون شامل یک نمونه از Symfony\Component\Mime\Email به جای یک نمونه از Swift_Message . این پیام نشان دهنده ایمیل قبل از ارسال است.

علاوه بر این، یک ویژگی جدید sent به رویداد اضافه شده است MessageSent . این ویژگی حاوی نمونه ای از Illuminate\Mail\SentMessage ایمیل ارسال شده و حاوی اطلاعاتی مانند شناسه پیام است.

اتصالات مجدد اجباری

دیگر امکان اتصال مجدد اجباری حمل و نقل وجود ندارد (مثلاً زمانی که ایمیل از طریق یک فرآیند شبح اجرا می شود). در عوض، Symfony Mailer سعی خواهد کرد به طور خودکار به حمل و نقل متصل شود و در صورت عدم موفقیت در اتصال مجدد، یک استثنا ایجاد کند.

گزینه های جریان SMTP

تعریف گزینه های جریان برای انتقال SMTP دیگر پشتیبانی نمی شود. در عوض، در صورت پشتیبانی، باید گزینه های مربوطه را مستقیماً در پیکربندی تعریف کنید. به عنوان مثال، برای غیرفعال کردن تأیید اعتبار TLS:

'smtp' => [
// Laravel 8.x...
'stream' => [
'ssl' => [
'verify_peer' => false,
],
],
 
// Laravel 9.x...
'verify_peer' => false,
],

برای کسب اطلاعات بیشتر در مورد گزینه های پیکربندی موجود، لطفاً اسناد Symfony Mailer را بررسی کنید .

علی‌رغم مثال بالا، معمولاً به شما توصیه نمی‌شود که تأیید SSL را غیرفعال کنید، زیرا امکان حملات «man-in-the-middle» را معرفی می‌کند.

SMTP auth_mode

دیگر نیازی به تعریف SMTP auth_mode در mail فایل پیکربندی نیست. حالت احراز هویت به طور خودکار بین Symfony Mailer و سرور SMTP مورد مذاکره قرار می گیرد.

گیرندگان ناموفق

پس از ارسال پیام، دیگر امکان بازیابی لیستی از گیرندگان ناموفق وجود ندارد. در عوض، Symfony\Component\Mailer\Exception\TransportExceptionInterface در صورت عدم ارسال پیام، یک استثنا ایجاد می شود. به‌جای تکیه بر بازیابی آدرس‌های ایمیل نامعتبر پس از ارسال پیام، توصیه می‌کنیم قبل از ارسال پیام، آدرس‌های ایمیل را تأیید کنید.

بسته ها

دایرکتوری lang _

احتمال تاثیر: متوسط

در برنامه های جدید لاراول، resources/lang دایرکتوری اکنون در پوشه اصلی پروژه ( lang ) قرار دارد. اگر بسته شما در حال انتشار فایل های زبان در این دایرکتوری است، باید اطمینان حاصل کنید که بسته شما app()->langPath() به جای یک مسیر سخت کد شده در حال انتشار است.

صف

کتابخانه opis/closure _

احتمال تاثیر: کم

وابستگی لاراول opis/closure به جایگزین شده است laravel/serializable-closure . این نباید هیچ تغییری در برنامه شما ایجاد کند مگر اینکه opis/closure مستقیماً با کتابخانه در تعامل باشید. علاوه بر این، کلاس ها Illuminate\Queue\SerializableClosureFactory و Illuminate\Queue\SerializableClosure کلاس های قبلی منسوخ شده حذف شده اند. اگر مستقیماً با کتابخانه در حال تعامل هستید opis/closure یا از هر یک از کلاس های حذف شده استفاده می کنید، می توانید به جای آن از Laravel Serializable Closure استفاده کنید .

flush روش ارائه دهنده شغل ناموفق

احتمال تاثیر: کم

روش flush تعریف شده توسط Illuminate\Queue\Failed\FailedJobProviderInterface اینترفیس اکنون $hours آرگومانی را می پذیرد که تعیین می کند یک کار ناموفق باید چند ساله باشد (بر حسب ساعت) قبل از اینکه توسط دستور flush شود queue:flush . اگر به صورت دستی پیاده‌سازی می‌کنید، FailedJobProviderInterface باید مطمئن شوید که پیاده‌سازی شما برای منعکس‌کننده این استدلال جدید به‌روزرسانی شده است:

public function flush($hours = null);

جلسه

روش getSession _

احتمال تاثیر: کم

کلاسی که توسط کلاس Symfony\Component\HttpFoundaton\Request خود لاراول گسترش می‌یابد، روشی را برای دریافت کنترلر ذخیره‌سازی جلسه فعلی ارائه می‌دهد. این روش توسط لاراول مستند نشده است زیرا اکثر برنامه های لاراول با جلسه از طریق متد خود لاراول تعامل دارند. Illuminate\Http\Request getSession session

متد getSession قبلاً نمونه ای از Illuminate\Session\Store یا را برمی گرداند null . با این حال، با توجه به اینکه نسخه Symfony 6.x نوع بازگشتی را اعمال می کند Symfony\Component\HttpFoundation\Session\SessionInterface ، getSession now یک SessionInterface پیاده سازی را به درستی برمی گرداند یا \Symfony\Component\HttpFoundation\Exception\SessionNotFoundException زمانی که هیچ جلسه ای در دسترس نیست، استثنا ایجاد می کند.

آزمایش کردن

روش assertDeleted _

احتمال تاثیر: متوسط

همه فراخوانی های assertDeleted متد باید به روز شوند assertModelMissing .

پروکسی های مورد اعتماد

احتمال تاثیر: کم

اگر پروژه لاراول 8 خود را با وارد کردن کد برنامه موجود خود در اسکلت برنامه کاملاً جدید لاراول 9 به لاراول 9 به لاراول 9 ارتقا می دهید، ممکن است لازم باشد میان افزار "پراکسی مورد اعتماد" برنامه خود را به روز کنید.

app/Http/Middleware/TrustProxies.php در فایل خود ، use Fideloper\Proxy\TrustProxies as Middleware به روز رسانی کنید use Illuminate\Http\Middleware\TrustProxies as Middleware .

بعد، در داخل app/Http/Middleware/TrustProxies.php ، باید $headers تعریف ویژگی را به روز کنید:

// 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;

در نهایت، می توانید fideloper/proxy وابستگی Composer را از برنامه خود حذف کنید:

composer remove fideloper/proxy

اعتبار سنجی

validated روش درخواست فرم

احتمال تاثیر: کم

روش validated ارائه شده توسط درخواست های فرم اکنون می پذیرد $key و $default استدلال می کند. اگر به صورت دستی تعریف این روش را بازنویسی می کنید، باید امضای روش خود را به روز کنید تا این آرگومان های جدید را منعکس کند:

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

قانون password _

احتمال تاثیر: متوسط

قاعده ای password که تأیید می کند که مقدار ورودی داده شده با رمز عبور فعلی کاربر تأیید شده مطابقت دارد، به تغییر نام داده شده است current_password .

کلیدهای آرایه نامعتبر

احتمال تاثیر: متوسط

در نسخه‌های قبلی لاراول، از شما خواسته می‌شد که به اعتبارساز لاراول دستور دهید تا کلیدهای آرایه نامعتبر را از داده‌های «تأیید شده» که برمی‌گرداند، حذف کند، به‌ویژه در ترکیب با قاعده‌ای array که فهرستی از کلیدهای مجاز را مشخص نمی‌کند.

با این حال، در لاراول 9.x، کلیدهای آرایه نامعتبر همیشه از داده های "تایید شده" حذف می شوند، حتی زمانی که هیچ کلید مجاز از طریق قانون مشخص نشده باشد array . به طور معمول، این رفتار مورد انتظارترین رفتار است و excludeUnvalidatedArrayKeys روش قبلی فقط به عنوان یک اقدام موقت به منظور حفظ سازگاری با عقب به لاراول 8.x اضافه شده است.

includeUnvalidatedArrayKeys اگرچه توصیه نمی‌شود، اما می‌توانید رفتار قبلی Laravel 8.x را با فراخوانی یک روش جدید در boot روش یکی از ارائه‌دهندگان خدمات برنامه خود انتخاب کنید :

use Illuminate\Support\Facades\Validator;
 
/**
* Register any application services.
*
* @return void
*/
public function boot()
{
Validator::includeUnvalidatedArrayKeys();
}

متفرقه

ما همچنین شما را تشویق می کنیم که تغییرات موجود در laravel/laravel مخزن GitHub را مشاهده کنید . در حالی که بسیاری از این تغییرات مورد نیاز نیستند، ممکن است بخواهید این فایل ها را با برنامه خود هماهنگ نگه دارید. برخی از این تغییرات در این راهنمای ارتقا پوشش داده خواهد شد، اما برخی دیگر، مانند تغییرات در فایل‌های پیکربندی یا نظرات، چنین نیستند. می توانید به راحتی تغییرات را با ابزار مقایسه GitHub مشاهده کنید و انتخاب کنید کدام به روز رسانی برای شما مهم است.