在 Laravel 8 中,目标类 [PagesController] 不存在。

3
即使我尝试了几种解决方法,但该错误仍然在浏览器中不断出现。
以下是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'));
    }
}

在我看来,一切似乎都工作得很好。我已经在web.php中添加了use语句,但仍然显示PagesController,并且RouteServiceProvider.php文件中的默认命名空间是'App\Http\Controllers'。文件结构也是正确的,PagesController.php位于Controllers文件夹下。我还尝试使用命令修复它,如php artisan config:cachecomposer dump-autoload,但没有起作用。有人能发现我在这里犯的错误吗?提前致谢。


检查当前是否适用于Laravel 7.x。如果是的话,版本8可能会有一些不同,并且如果是测试版,可能也存在一些错误。 - undefined
7个回答

3
在新版本的 Laravel 中,它的代码工作方式如下: 添加以下代码。
use App\Http\Controllers\PagesController;

并将该路由用作

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

1

首先检查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上给我发送消息,我会帮助你。

0

我遇到了类似的问题,以下是我解决的方法。 我在PagesController中包含了以下代码:

use App\Http\Controllers\Controller;

然后在路由(web.php)中包含以下代码。
use App\Http\Controllers\PagesController;
Route::get('/', [PagesController::class,'index']);

0

Laravel 8不是您的路由组的命名空间前缀,其中加载了您的路由。

“在Laravel的先前版本中,RouteServiceProvider包含一个$namespace属性。此属性的值将自动添加到控制器路由定义和对action助手/URL :: action方法的调用中。在Laravel 8.x中,默认情况下,此属性为null。这意味着Laravel不会自动添加命名空间前缀。”

当未使用命名空间前缀时,必须在引用控制器时使用完全限定的类名。

use App\Http\Controllers\UserController;

Route::get('/users', [UserController::class, 'index']); // or Route::get('/users', 'App\Http\Controllers\UserController@index'); If you prefer the old way: App\Providers\RouteServiceProvider:

public function boot() { ...

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

... }

对于任何您想要声明命名空间的路由组,请执行以下操作。

$namespace 属性:

发布说明中提到在 RouteServiceProvider 中设置 $namespace 属性,并在 RouteServiceProvider 中进行注释,但这不会影响您的路由。它目前仅用于为生成操作的 URL 添加命名空间前缀。因此,您可以设置此变量,但它不会添加这些命名空间前缀,您需要确保在添加命名空间时使用此变量的方式。

现在,信息是更新指南

Laravel 8.x 文档 - 升级指南 - 路由

根据升级指南所示的内容,重要的部分是在您的路由组上定义命名空间。仅设置 $namespace 变量本身有助于生成操作的 URL。

再次强调一下,重要的部分是为路由组设置命名空间,他们只是通过直接引用成员变量 $namespace 在示例中完成了这一点。

取消注释: 您可以取消注释 RouteServiceProvider 中的 protected $namespace 成员变量,以返回旧方式,因为路由组设置为使用此成员变量作为组的命名空间。

// 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());
        });
    }
}

0
如果一切都在正确的文件夹中,我认为你的路由文件可能有问题。使用以下语句检查你的控制器是否能被找到:
```php Route::get('/', 'PagesController@index'); ```
如果还是不起作用,尝试使用以下语句:
```php Route::get('/', 'App\Http\Controllers\PagesController@index'); ```

我很感谢你的努力,但是它们两个都没有很好地运行。 - undefined
Route::resource('/', 'PagesController'); 路由::资源('/', '页面控制器'); - undefined

0

我很感谢你的努力,但是还是没有起作用。 - undefined
我建议从头开始安装 Laravel 8,并创建一个新的 PagesController,然后设置路由,看看是否有效。 - undefined

0

很不错的尝试,但还是没有成功,它显示了相同的错误。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接