ارور Target class does not exist در لاراول 8

لاراول 8 روز گذشته با تعداد زیادی ویژگی و تغییرات جدید روانه بازار شد. یکی از این تغییرات حذف فضای نام پیش فرض مسیر بود.
اگرچه این تغییر با گذشته سازگار است ، به این معنی که پروژه های قدیمی که از لاراول 7.x استفاده می کردند می توانند به راحتی به لاراول 8.x مهاجرت کنند بدون اینکه نیازی به تغییر چیزی باشد ، اما پروژه های جدید ایجاد شده در لاراول 8 (از 8 سپتامبر) باید این را در نظر بگیرند .
بسیاری از توسعه دهندگان در برنامه های تازه ایجاد شده لاراول 8 با مشکلی روبرو شده اند ، جایی که سعی می کنند مسیرهای خود را بارگیری کنند و با یک استثنا مواجه می شوند که چیزی مانند این را می گوید:

ارور arget class does not exist

مسئله این نیست که کد شکسته است ، بلکه 99.9٪ از آموزشهای Laravel اکنون در این بخش درست عمل نمی کنند  زیرا بیشتر آنها به این فضای نام پیش فرض برای سینتکس رشته اعتماد می کنند.

تغییر
تا قبل از لاراول 7 ، پرونده RouteServiceProvider.php کد زیر را داشت:

2ارور arget class does not exist

کاری که ا انجام می دهد این است که به لاراول می گوید با استفاده از میان افزار وب و فضای نام App \ Http \ Controllers ، مسیرها را در مسیرها / web.php بارگیری کند. این ، به نوبه خود ، به این معنی است که هر زمان با استفاده از سینتکس رشته ، مسیری را اعلام کردید ، لاراول در پوشه App \ Http \ Controllers به دنبال آن کنترل کننده می گردد

در لاراول 8 ، متغیر $ namespace برداشته شد و فضای نام مسیر به زیر تغییر یافت:

ارور 3arget class does not exist

اکنون ، لاراول مانند همیشه به دنبال مسیرهایی در داخل فایل 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');

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *