Целевой класс [PagesController] не существует в laravel 8

Эта ошибка продолжает появляться в браузере, несмотря на то, что я попробовал несколько решений, чтобы исправить ее.

Это код для PagesController.php:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class PagesController extends Controller
{
    //
    public function index()
    {
        return view("pages.index");
    }
}

Код для routes / web.php:

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\PagesController;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

// Route::get('/', function () {
//     return view('welcome');
// });

Route::get("/", [PagesController::class, 'index']);

Код для RouteServiceProvider.php:

<?php

namespace App\Providers;

use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Route;

class RouteServiceProvider extends ServiceProvider
{
    /**
     * This namespace is applied to your controller routes.
     *
     * In addition, it is set as the URL generator's root namespace.
     *
     * @var string
     */
    protected $namespace = 'App\Http\Controllers';

    /**
     * The path to the "home" route for your application.
     *
     * @var string
     */
    public const HOME = '/home';

    /**
     * Define your route model bindings, pattern filters, etc.
     *
     * @return void
     */
    public function boot()
    {
        //

        parent::boot();
    }

    /**
     * Define the routes for the application.
     *
     * @return void
     */
    public function map()
    {
        $this->mapApiRoutes();

        $this->mapWebRoutes();

        //
    }

    /**
     * Define the "web" routes for the application.
     *
     * These routes all receive session state, CSRF protection, etc.
     *
     * @return void
     */
    protected function mapWebRoutes()
    {
        Route::middleware('web')
             ->namespace($this->namespace)
             ->group(base_path('routes/web.php'));
    }

    /**
     * Define the "API" routes for the application.
     *
     * These routes are typically stateless.
     *
     * @return void
     */
    protected function mapApiRoutes()
    {
        Route::prefix('api')
             ->middleware('api')
             ->namespace($this->namespace)
             ->group(base_path('routes/api.php'));
    }
}

Мне кажется, что все работает нормально, я добавил оператор use в свой web.php, но он по-прежнему показывает PagesController, а пространство имен по умолчанию в моем RouteServiceProvider.php - «App \ Http \ Controllers». Структура файла также правильная: PagesController.php находится в папке Controllers. Я также пытался использовать команды, чтобы исправить это, например php artisan config:cache и composer dump-autoload, но это не сработало. Кто-нибудь обнаруживает ошибку, которую я здесь делаю? Заранее спасибо.


person Kenny    schedule 10.10.2020    source источник
comment
Проверьте, работает ли текущий в Laravel 7.x. если это так, версия 8 может немного отличаться, и, возможно, также есть ошибки, если она находится в бета-версии.   -  person nice_dev    schedule 10.10.2020


Ответы (7)


Если все находится в правильной папке, я думаю, что с вашим файлом маршрута возникла проблема. Используйте этот оператор и проверьте, можно ли найти ваш контроллер:

Route::get('/', 'PagesController@index');

И если это не сработает, воспользуйтесь этим:

Route::get('/', 'App\Http\Controllers\PagesController@index');

person ineptant    schedule 10.10.2020
comment
Я ценю ваши усилия, но они оба тоже не работают. - person Kenny; 10.10.2020

кажется, вы обновляетесь с предыдущей версии Laravel, не так ли?

Проверьте RouteServiceProvider.php из источника:

https://github.com/laravel/laravel/blob/master/app/Providers/RouteServiceProvider.php

И обязательно сравните весь свой каталог с:

https://github.com/laravel/laravel/compare/7.x...master

person Roman    schedule 10.10.2020
comment
Я ценю ваши усилия, но это все равно не сработало - person Kenny; 11.10.2020
comment
Я бы предложил установить Laravel 8 с нуля и создать новый PagesController с маршрутом и посмотреть, работает ли это. - person Roman; 12.10.2020

Вы можете попробовать поставить:

use App\Http\Controllers\Controller;

В вашем PagesController.php, поскольку он теперь необходим в Laravel 8 (https://laravel.com/docs/8.x/controllers#defining-controllers)

person Isaac Underwood    schedule 11.10.2020
comment
Хорошая попытка, но все равно не сработало, отображается та же ошибка - person Kenny; 11.10.2020

В новой версии laravel это работает так: Добавить этот код

use App\Http\Controllers\PagesController;

и используйте маршрут как

Route::get('/', [PagesController::class,'index']);
person user12142218    schedule 02.02.2021

У меня была аналогичная проблема, и вот как я ее решил. Я включил в PagesController следующий код:

use App\Http\Controllers\Controller;

Затем включил следующий код в маршруты (web.php)

use App\Http\Controllers\PagesController;
Route::get('/', [PagesController::class,'index']);
person Edmond    schedule 06.02.2021

Laravel 8 не является префиксом пространства имен для ваших групп маршрутов, в которые загружаются ваши маршруты.

В предыдущих выпусках Laravel RouteServiceProvider содержал свойство $ namespace. Значение этого свойства будет автоматически добавлено к определениям маршрута контроллера и вызовам вспомогательного метода действия / URL :: метода действия. В Laravel 8.x это свойство по умолчанию равно null. Это означает, что Laravel не будет выполнять автоматическое префиксы пространства имен.

Когда префикс пространства имен не используется, вы должны использовать полное имя класса для своих контроллеров, когда обращаетесь к ним по-своему.

используйте App \ Http \ Controllers \ UserController;

Route :: get ('/ users', [UserController :: class, 'index']); // или Route :: get ('/ users', 'App \ Http \ Controllers \ UserController @ index'); Если вы предпочитаете старый способ: App \ Providers \ RouteServiceProvider:

публичная функция boot () {...

Route::prefix('api')
    ->middleware('api')
    ->namespace('App\Http\Controllers') // <---------
    ->group(base_path('routes/api.php'));

... }

Сделайте это для любых групп маршрутов, для которых вы хотите объявить пространство имен.

Свойство $ namespace:

Примечания к выпуску относятся к свойству $ namespace, которое должно быть установлено для вашего RouteServiceProvider в примечаниях к выпуску, и прокомментировано в вашем RouteServiceProvider, это не влияет на ваши маршруты. В настоящее время он предназначен только для добавления префикса пространства имен для создания URL-адресов для действий. Таким образом, вы можете установить эту переменную, но она не добавляет эти префиксы пространства имен, вам необходимо убедиться, что вы используете эту переменную при добавлении пространства имен в группы способом.

информация теперь руководство по обновлению

Документы Laravel 8.x - Руководство по обновлению - Маршрутизация

Важная часть руководства по обновлению заключается в том, что вы определяете пространство имен в своих группах маршрутов. Установка переменной $ namespace сама по себе помогает только генерировать URL-адреса для действий.

Опять же, и я не могу это подчеркнуть, важная часть - это установка пространства имен для групп маршрутов, что они просто делают, ссылаясь на переменную-член $ namespace непосредственно в примере.

раскомментируйте: вы можете раскомментировать защищенную переменную-член $ namespace в RouteServiceProvider, чтобы вернуться к старому способу, поскольку группы маршрутов настроены на использование этой переменной-члена в качестве пространства имен для групп.

// protected $namespace = 'App\\Http\\Controllers';

Единственная причина, по которой раскомментирование добавит префикс пространства имен к контроллерам, назначенным маршрутам, заключается в том, что группы маршрутов настроены на использование этой переменной в качестве пространства имен:

   <?php

namespace App\Providers;

use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Facades\Route;

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

    /**
     * The controller namespace for the application.
     *
     * When present, controller route declarations will automatically be prefixed with this namespace.
     *
     * @var string|null
     */
     **protected $namespace = 'App\\Http\\Controllers';**

    /**
     * Define your route model bindings, pattern filters, etc.
     *
     * @return void
     */
    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'));
        });
    }

    /**
     * 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());
        });
    }
}
person Community    schedule 04.05.2021

Сначала проверьте, что PagesController не является контроллером ресурсов. если PagesController является контроллером ресурсов, поэтому вы можете добавить следующий код.

php artisan route:list

<?php

use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

// Route::get('/', function () {
//     return view('welcome');
// });

// And use resource route
Route::resource('/', PagesController::class);

использовать ресурсный маршрут, не добавляя контроллер PagesController вверху. и если не решить, отправьте мне сообщение на https://devnote.in, я помогу вам.

person Fefar Ravi    schedule 07.07.2021