نسخه:

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

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

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

ارتقا به 8.0 از 7.x

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

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

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

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

حداقل نسخه جدید PHP اکنون 7.3.0 است.

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

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

  • guzzlehttp/guzzle به ^7.0.1
  • facade/ignition به ^2.3.6
  • laravel/framework به ^8.0
  • laravel/ui به ^3.0
  • nunomaduro/collision به ^5.0
  • phpunit/phpunit به ^9.0

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

علاوه بر این، نصب کننده لاراول برای پشتیبانی composer create-project و لاراول جت استریم به روز شده است. نصب‌کننده‌های قدیمی‌تر از 4.0 پس از اکتبر 2020 دیگر کار نمی‌کنند. باید در ^4.0 اسرع وقت نصب‌کننده جهانی خود را ارتقا دهید.

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

مجموعه ها

روش isset _

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

برای سازگاری با رفتار معمولی PHP، offsetExists روش Illuminate\Support\Collection به روز رسانی شده است تا به isset جای استفاده از array_key_exists . این ممکن است در هنگام برخورد با موارد مجموعه ای که دارای ارزش زیر هستند، تغییری در رفتار ایجاد کند null :

$collection = collect([null]);
 
// Laravel 7.x - true
isset($collection[0]);
 
// Laravel 8.x - false
isset($collection[0]);

پایگاه داده

فضاهای نام کاشت و کارخانه

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

بذرپاشی ها و کارخانه ها اکنون دارای فضای نام هستند. برای تطبیق با این تغییرات، Database\Seeders فضای نام را به کلاس‌های seeder خود اضافه کنید. علاوه بر این، database/seeds دایرکتوری قبلی باید به زیر تغییر نام دهد database/seeders :

<?php
 
namespace Database\Seeders;
 
use App\Models\User;
use Illuminate\Database\Seeder;
 
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @return void
*/
public function run()
{
...
}
}

اگر می خواهید از laravel/legacy-factories بسته استفاده کنید، هیچ تغییری در کلاس های کارخانه شما لازم نیست. با این حال، اگر کارخانه های خود را ارتقا می دهید، باید Database\Factories فضای نام را به آن کلاس ها اضافه کنید.

composer.json در مرحله بعد، در فایل خود ، classmap بلوک را از autoload بخش حذف کنید و نگاشت های دایرکتوری کلاس با فضای نام جدید را اضافه کنید:

"autoload": {
"psr-4": {
"App\\": "app/",
"Database\\Factories\\": "database/factories/",
"Database\\Seeders\\": "database/seeders/"
}
},

شیوا

کارخانه های مدل

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

ویژگی کارخانه مدل لاراول برای پشتیبانی از کلاس ها کاملاً بازنویسی شده است و با کارخانه های سبک لاراول 7.x سازگار نیست. با این حال، برای سهولت در روند ارتقا، یک laravel/legacy-factories بسته جدید برای ادامه استفاده از کارخانه‌های موجود خود با Laravel 8.x ایجاد شده است. می توانید این بسته را از طریق Composer نصب کنید:

composer require laravel/legacy-factories

واسط Castable _

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

روش castUsing رابط Castable برای پذیرش آرایه ای از آرگومان ها به روز شده است. اگر این رابط را پیاده سازی می کنید، باید پیاده سازی خود را بر این اساس به روز کنید:

public static function castUsing(array $arguments);

رویدادهای افزایش/کاهش

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

رویدادهای مدل مرتبط «به‌روزرسانی» و «ذخیره» اکنون هنگام اجرای متدهای increment یا decrement در نمونه‌های مدل Eloquent ارسال می‌شوند.

مناسبت ها

کلاس EventServiceProvider _

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

اگر App\Providers\EventServiceProvider کلاس شما حاوی یک register تابع است، باید مطمئن شوید که parent::register در ابتدای این متد فراخوانی می کنید. در غیر این صورت رویدادهای اپلیکیشن شما ثبت نمی شود.

قرارداد Dispatcher _

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

روش listen قرارداد Illuminate\Contracts\Events\Dispatcher برای اختیاری شدن ملک به روز شده است $listener . این تغییر برای پشتیبانی از تشخیص خودکار انواع رویدادهای مدیریت شده از طریق بازتاب ایجاد شده است. اگر به صورت دستی این رابط را پیاده سازی می کنید، باید پیاده سازی خود را بر این اساس به روز کنید:

public function listen($events, $listener = null);

چارچوب

به روز رسانی حالت تعمیر و نگهداری

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

ویژگی حالت نگهداری لاراول در لاراول 8.x بهبود یافته است. پیش رندر کردن قالب حالت تعمیر و نگهداری اکنون پشتیبانی می شود و احتمال مواجه شدن کاربران نهایی با خطا در حالت تعمیر و نگهداری را از بین می برد. با این حال، برای پشتیبانی از این، خطوط زیر باید به public/index.php فایل شما اضافه شود. این خطوط باید مستقیماً تحت تعریف ثابت موجود قرار گیرند LARAVEL_START :

define('LARAVEL_START', microtime(true));
 
if (file_exists($maintenance = __DIR__.'/../storage/framework/maintenance.php')) {
require $maintenance;
}

گزینه php artisan down --message _

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

گزینه --message دستور php artisan down حذف شده است. به عنوان یک جایگزین، نماهای حالت تعمیر و نگهداری خود را از قبل با پیام انتخابی خود رندر کنید.

گزینه php artisan serve --no-reload _

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

یک --no-reload گزینه به دستور اضافه شده است php artisan serve . این به سرور داخلی دستور می دهد که در صورت شناسایی تغییرات فایل محیط، سرور را دوباره بارگیری نکند. این گزینه در درجه اول هنگام اجرای تست های Laravel Dusk در محیط CI مفید است.

$app مالکیت مدیر

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

$app ویژگی قبلاً منسوخ شده Illuminate\Support\Manager کلاس حذف شده است. اگر به این ویژگی متکی بودید، باید $container به جای آن از آن استفاده کنید.

یاور elixir _

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

کمکی که قبلاً منسوخ شده بود elixir حذف شده است. برنامه هایی که هنوز از این روش استفاده می کنند تشویق می شوند که به Laravel Mix ارتقاء دهند .

ایمیل

روش sendNow _

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

روش منسوخ شده قبلی sendNow حذف شده است. در عوض، لطفا از send روش استفاده کنید.

صفحه بندی

پیش فرض های صفحه بندی

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

صفحه‌بندی‌کننده اکنون از چارچوب Tailwind CSS برای استایل پیش‌فرض خود استفاده می‌کند. برای ادامه استفاده از بوت استرپ، باید متد فراخوانی زیر را به boot متد برنامه خود اضافه کنید AppServiceProvider :

use Illuminate\Pagination\Paginator;
 
Paginator::useBootstrap();

صف

روش retryAfter _

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

برای سازگاری با سایر ویژگی‌های لاراول، retryAfter روش و retryAfter ویژگی مشاغل در صف، ایمیل‌ها، اعلان‌ها و شنوندگان به backoff . شما باید نام این متد / ویژگی را در کلاس های مربوطه در برنامه خود به روز کنید.

ویژگی timeoutAt _

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

ویژگی timeoutAt مشاغل در صف، اعلان‌ها و شنوندگان به نام تغییر یافته است retryUntil . شما باید نام این ویژگی را در کلاس های مربوطه در برنامه خود به روز کنید.

allOnQueue() / روش allOnConnection() ها

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

برای سازگاری با سایر روش‌های اعزام، allOnQueue() و allOnConnection() روش‌های مورد استفاده در زنجیره شغلی حذف شده‌اند. می توانید به جای آن از روش onQueue() و استفاده کنید onConnection() . این متدها باید قبل از فراخوانی متد فراخوانی شوند dispatch :

ProcessPodcast::withChain([
new OptimizePodcast,
new ReleasePodcast
])->onConnection('redis')->onQueue('podcasts')->dispatch();

توجه داشته باشید که این تغییر فقط روی کد استفاده از withChain متد تأثیر می گذارد. و هنوز در هنگام استفاده از راهنمای جهانی در allOnQueue() دسترس allOnConnection() هستند dispatch() .

پشتیبانی دسته ای جدول مشاغل ناموفق

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

اگر قصد دارید از ویژگی های Job Batching Laravel 8.x استفاده کنید، failed_jobs جدول پایگاه داده شما باید به روز شود. ابتدا باید یک ستون جدید uuid به جدول شما اضافه شود:

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
 
Schema::table('failed_jobs', function (Blueprint $table) {
$table->string('uuid')->after('id')->nullable()->unique();
});

سپس، failed.driver گزینه پیکربندی در queue فایل پیکربندی شما باید به روز شود database-uuids .

علاوه بر این، ممکن است بخواهید برای کارهای ناموفق موجود خود UUID ایجاد کنید:

DB::table('failed_jobs')->whereNull('uuid')->cursor()->each(function ($job) {
DB::table('failed_jobs')
->where('id', $job->id)
->update(['uuid' => (string) Illuminate\Support\Str::uuid()]);
});

مسیریابی

پیشوند فضای نام کنترل کننده خودکار

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

در نسخه‌های قبلی لاراول، RouteServiceProvider کلاس حاوی $namespace ویژگی با مقدار App\Http\Controllers . مقدار این ویژگی برای پیشوند خودکار اعلان های مسیر کنترلر و تولید URL مسیر کنترلر مانند هنگام فراخوانی action کمک کننده استفاده شد.

در لاراول 8 این ویژگی null به صورت پیش فرض تنظیم شده است. این اجازه می‌دهد تا اعلان‌های مسیر کنترلر شما از سینتکس قابل فراخوانی استاندارد PHP استفاده کنند، که پشتیبانی بهتری برای پرش به کلاس کنترلر در بسیاری از IDE‌ها فراهم می‌کند:

use App\Http\Controllers\UserController;
 
// Using PHP callable syntax...
Route::get('/users', [UserController::class, 'index']);
 
// Using string syntax...
Route::get('/users', 'App\Http\Controllers\UserController@index');

در بیشتر موارد، این روی برنامه‌هایی که در حال ارتقا هستند، تأثیری نمی‌گذارد، زیرا شما RouteServiceProvider همچنان دارای $namespace ویژگی با مقدار قبلی است. با این حال، اگر برنامه خود را با ایجاد یک پروژه کاملاً جدید لاراول ارتقا دهید، ممکن است با این به عنوان یک تغییر اساسی مواجه شوید.

اگر می‌خواهید به استفاده از مسیریابی کنترل‌کننده با پیشوند خودکار اصلی ادامه دهید، می‌توانید به سادگی مقدار $namespace ویژگی را در داخل خود تنظیم کنید RouteServiceProvider و ثبت‌های مسیر را در boot متد برای استفاده از $namespace ویژگی به‌روزرسانی کنید:

class RouteServiceProvider extends ServiceProvider
{
/**
* The path to the "home" route for your application.
*
* This is used by Laravel authentication to redirect users after login.
*
* @var string
*/
public const HOME = '/home';
 
/**
* If specified, this namespace is automatically applied to your controller routes.
*
* In addition, it is set as the URL generator's root namespace.
*
* @var string
*/
protected $namespace = 'App\Http\Controllers';
 
/**
* Define your route model bindings, pattern filters, etc.
*
* @return void
*/
public function boot()
{
$this->configureRateLimiting();
 
$this->routes(function () {
Route::middleware('web')
->namespace($this->namespace)
->group(base_path('routes/web.php'));
 
Route::prefix('api')
->middleware('api')
->namespace($this->namespace)
->group(base_path('routes/api.php'));
});
}
 
/**
* Configure the rate limiters for the application.
*
* @return void
*/
protected function configureRateLimiting()
{
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by(optional($request->user())->id ?: $request->ip());
});
}
}

برنامه ریزی

کتابخانه cron-expression _

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

وابستگی لاراول به از dragonmantank/cron-expression به روز رسانی شده است . این نباید هیچ تغییری در برنامه شما ایجاد کند مگر اینکه مستقیماً با کتابخانه در تعامل باشید. اگر مستقیماً با این کتابخانه تعامل دارید، لطفاً گزارش تغییرات آن را مرور کنید . 2.x 3.x cron-expression

جلسه

قرارداد Session _

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

قرارداد روش Illuminate\Contracts\Session\Session جدیدی دریافت کرده است pull . اگر این قرارداد را به صورت دستی اجرا می کنید، باید پیاده سازی خود را بر این اساس به روز کنید:

/**
* Get the value of a given key and then forget it.
*
* @param string $key
* @param mixed $default
* @return mixed
*/
public function pull($key, $default = null);

آزمایش کردن

روش decodeResponseJson _

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

متدی decodeResponseJson که متعلق به Illuminate\Testing\TestResponse کلاس است دیگر هیچ آرگومانی را نمی پذیرد. لطفاً به json جای آن از روش استفاده کنید.

روش assertExactJson _

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

این assertExactJson روش اکنون به کلیدهای عددی آرایه های مقایسه شده نیاز دارد تا مطابقت داشته باشند و به ترتیب یکسان باشند. اگر می‌خواهید JSON را با یک آرایه مقایسه کنید، بدون اینکه نیازی به آرایه‌های دارای کلید عددی یکسان باشد، می‌توانید assertSimilarJson به جای آن از روش استفاده کنید.

اعتبار سنجی

اتصالات قوانین پایگاه داده

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

قوانین unique و exists اکنون به نام اتصال مشخص شده (که از طریق روش مدل قابل دسترسی است getConnectionName ) مدل های Eloquent هنگام انجام پرس و جوها احترام می گذارند.

متفرقه

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