这个 Laravel 8 路由有什么问题?

What is the problem with this Laravel 8 routing?

我刚刚安装了 Laravel 8 并创建了一个全新的应用程序。除了 web.php 并添加了 IndexController.php 之外,我没有更改任何文件。在 web.php 中,我唯一的代码是:

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

/*
|--------------------------------------------------------------------------
| 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('/', [IndexController::class, 'index']);

在IndexController.php我有:

<?php

namespace Illuminate\Http\Controllers;

use Illuminate\Http\Request;

class IndexController extends Controller
{
    //
    public function index() 
    {
        return 'This is a controller';
    }
}

如果我转到 localhost:8000,它会抛出目标 class [IndexController] 不存在。我已经尝试了所有要尝试的方法:修改 RouteServiceProvider.php、清除缓存、删除 IndexController 并重新创建它。没有什么。我仍然收到相同的消息。

您应该将 IndexController 的命名空间更改为 namespace App\Http\Controllers;

如果您使用 php artisan make:controller 创建控制器,它会为您的控制器添加适当的命名空间。

你在尝试的时候清理了路由吗?

php artisan route:clear

您可能还需要其他人;

php artisan view:clear
php artisan cache:clear
php artisan config:clear

您需要更改 IndexController 文件上的名称空间,假设控制器位于 app/Http/Controllers/IndexController.php

Laravel框架使用Illuminate命名空间,相关文件在vendor/laravel目录

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class IndexController extends Controller
{
    //
    public function index() 
    {
        return 'This is a controller';
    }
}

下一步,因为 Laravel 8 RouteServiceProvider 中的默认命名空间未设置为 App\Http\Controllers,所以有 3 个选项:

  • 在web.php
  • 中导入use语句use App\Http\Controllers\IndexController
  • 在 RouteServiceProvider 中设置 protected $namespace = 'App\Http\Controllers; 以获得 v8 之前的行为。但是,不在 RouteServiceProvider 中设置默认名称空间是一个受欢迎的更改
  • 设置路由组的命名空间
Route::namespace('App\Http\Controllers')
    ->group(function(){
       //define the routes here for those corresponding to controllers
       //which are within App\Http\Controllers namespace
    });
use Illuminate\Support\Facades\Route;
//use Illuminate\Http\Controllers;
use App\Http\Controllers\IndexController;

/*
|--------------------------------------------------------------------------
| 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('/', [IndexController::class, 'index']);

进行这些更改后,最好 运行 composer dump-autoload

如果路由缓存开启,那么它需要被破坏 php artisan route:clear