راهنمای ارتقا
تغییرات با تاثیر زیاد
تغییرات تاثیر متوسط
ارتقاء به 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 دریافت کردهاند. در صورت وجود، باید راهنمای ارتقاء فردی آنها را قبل از ارتقا بخوانید:
- کانال اعلان Vonage (نسخه 3.0) (جایگزین Nexmo)
در نهایت، سایر بسته های شخص ثالث مصرف شده توسط برنامه شما را بررسی کنید و بررسی کنید که از نسخه مناسب برای پشتیبانی لاراول 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
مشاهده کنید و انتخاب کنید کدام به روز رسانی برای شما مهم است.