لاراول 8 روز گذشته با تعداد زیادی ویژگی و تغییرات جدید روانه بازار شد. یکی از این تغییرات حذف فضای نام پیش فرض مسیر بود.
اگرچه این تغییر با گذشته سازگار است ، به این معنی که پروژه های قدیمی که از لاراول 7.x استفاده می کردند می توانند به راحتی به لاراول 8.x مهاجرت کنند بدون اینکه نیازی به تغییر چیزی باشد ، اما پروژه های جدید ایجاد شده در لاراول 8 (از 8 سپتامبر) باید این را در نظر بگیرند .
بسیاری از توسعه دهندگان در برنامه های تازه ایجاد شده لاراول 8 با مشکلی روبرو شده اند ، جایی که سعی می کنند مسیرهای خود را بارگیری کنند و با یک استثنا مواجه می شوند که چیزی مانند این را می گوید:
مسئله این نیست که کد شکسته است ، بلکه 99.9٪ از آموزشهای Laravel اکنون در این بخش درست عمل نمی کنند زیرا بیشتر آنها به این فضای نام پیش فرض برای سینتکس رشته اعتماد می کنند.
تغییر
تا قبل از لاراول 7 ، پرونده RouteServiceProvider.php کد زیر را داشت:
کاری که ا انجام می دهد این است که به لاراول می گوید با استفاده از میان افزار وب و فضای نام App \ Http \ Controllers ، مسیرها را در مسیرها / web.php بارگیری کند. این ، به نوبه خود ، به این معنی است که هر زمان با استفاده از سینتکس رشته ، مسیری را اعلام کردید ، لاراول در پوشه App \ Http \ Controllers به دنبال آن کنترل کننده می گردد
در لاراول 8 ، متغیر $ namespace برداشته شد و فضای نام مسیر به زیر تغییر یافت:
اکنون ، لاراول مانند همیشه به دنبال مسیرهایی در داخل فایل web.php شما است. همچنین مانند همیشه ، از میان افزار وب استفاده می کند. اما توجه داشته باشید که دیگر از فضای نام قبلی استفاده نمی کند.
این بدان معناست که با شروع Laravel 8 ، وقتی مسیرهای خود را با استفاده ازسینتکس رشته ای اعلام می کنید ، Laravel قصد ندارد به دنبال کنترلر خود در داخل App \ Http \ Controllers باشد.
چکار باید کرد؟
با دو روش :
1- تعریف namespace در RouteServiceProvider (پشنهاد من)
ابتدا به مسیر App\Providers\RouteServiceProvider رفته و سپس خط زیر را در تابع boot اضافه کنید:
//ابتدا خط زیر را در این فایل از حالت کامنت خارج کنید
protected $namespace = 'App\\Http\\Controllers';
public function boot()
{
$this->configureRateLimiting();
$this->routes(function () {
Route::prefix('api')
->middleware('api')
->namespace($this->namespace)// این خط را اضافه کنید
->group(base_path('routes/api.php'));
Route::middleware('web')
->namespace($this->namespace)// این خط را اضافه کنید
->group(base_path('routes/web.php'));
});
}
این کار را می توانید برای تک به تک مسیردهی ها (مثلا web یا api انجام دهید)
۲) افزودن namespace به فایل route لاراول
به هنگام تعریف یک مسیر در فایل های web.php یا api.php و … می توانید مسیر کنترلرها را مشخص کنید:
use App\Http\Controllers\UserController; // این خط مسیر کنترلر را مشخص می کند
Route::get('/users', [UserController::class, 'index']);
// or
Route::get('/users', 'App\Http\Controllers\UserController@index');