这个 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
我刚刚安装了 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语句
- 在 RouteServiceProvider 中设置
protected $namespace = 'App\Http\Controllers;
以获得 v8 之前的行为。但是,不在 RouteServiceProvider 中设置默认名称空间是一个受欢迎的更改 - 设置路由组的命名空间
use App\Http\Controllers\IndexController
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