Laravel 6.0 php artisan route:list returns “目标 class [App\Http\Controllers\SessionsController] 不存在。”
Laravel 6.0 php artisan route:list returns “Target class [App\Http\Controllers\SessionsController] does not exist.”
我正在使用 Laravel 6.0 并尝试使用 artisan route:list
列出我的所有路线,但它失败了 returns:
Illuminate\Contracts\Container\BindingResolutionException : Target
class [App\Http\Controllers\SessionsController] does not exist.
at /home/vagrant/code/vendor/laravel/framework/src/Illuminate/Container/Container.php:806
802|
803| try {
804| $reflector = new ReflectionClass($concrete);
805| } catch (ReflectionException $e) {
> 806| throw new BindingResolutionException("Target class [$concrete] does not exist.", 0, $e);
807| }
808|
809| // If the type is not instantiable, the developer is attempting to resolve
810| // an abstract type such as an Interface or Abstract Class and there is
Exception trace:
1 Illuminate\Foundation\Console\RouteListCommand::Illuminate\Foundation\Console{closure}(Object(Illuminate\Routing\Route))
[internal]:0
2 ReflectionException::("Class App\Http\Controllers\SessionsController does not exist")
/home/vagrant/code/vendor/laravel/framework/src/Illuminate/Container/Container.php:804
3 ReflectionClass::__construct("App\Http\Controllers\SessionsController")
/home/vagrant/code/vendor/laravel/framework/src/Illuminate/Container/Container.php:804
到目前为止,我只有一个非常简单的 web.php 路由文件:
Route::get('/', function () {
return view('index');
});
Route::prefix('app')->group(function () {
// Registration routes
Route::get('registration/create', 'RegistrationController@create')->name('app-registration-form');
});
// Templates
Route::get('templates/ubold/{any}', 'UboldController@index');
知道如何调试这个问题吗?
运行 这个命令
php artisan config:cache
在我的例子中,由于正斜杠 /
而发生相同的 error
但在定义路由时它应该是反斜杠 \
,
当你在 folder
中有控制器时会发生这种情况,就像在我的情况下控制器在 api
文件夹中,所以在提到控制器名称时总是使用反斜杠 \
。
参见示例:
易错代码:
Route::apiResource('categories', 'api/CategoryController');
解决方案代码:
Route::apiResource('categories', 'api\CategoryController');
对于那些对 Illuminate\Contracts\Container\BindingResolutionException : Target class [<className>] does not exist.
消息有类似问题的人,这也可能会有所帮助:
composer dump-autoload
好吧,我遇到了类似的问题,我想变得聪明,所以我在 web.php
中写了这个
Route::group([
'middleware' => '', // Removing this made everything work
'as' => 'admin.',
'prefix' => 'admin',
'namespace' => 'Admin',
],function(){
});
我所要做的只是从组中删除所有 unnecessary/unused 选项。就这样。
尝试更正您的控制器名称
我的路线是
Route::get('/lien/{id}','liensControler@show');
我的控制器是
class liensController extends Controller
{
// all the methods of controller goes here.
}
在我的例子中,这是 Linux 文件名区分大小写的问题。对于名为 IndexController
的文件,具有 Indexcontroller
的文件在 windows 中有效,但在 Linux
中无效
这些我都做了
1: php artisan config:cache
2:检查控制器名称拼写。
3:作曲家dump-autoload
4: 刚把路由中的正斜杠改成了反斜杠。
第 4 个对我有用。
我在我的中间件组中错误地留下了一个空的中间件 class 时遇到了这个问题:
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:100,1',
'bindings',
'localization',
'' // Was empty by mistake
],
];
替换-
Route::resource('/admin/UserOff','admin/UsersController');
与-
Route::resource('/admin/UserOff','admin\UsersController');
转发/与\
我有同样的问题,但有一个中间件控制器。所以最后我在 kerner.php 文件中链接了那个中间件。它位于 app\Http\Kernel.php
我在路由中间件中添加了这一行。
'authpostmanweb' => \App\Http\Middleware\AuthPostmanWeb::class
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
'authpostmanweb' => \App\Http\Middleware\AuthPostmanWeb::class
];
在我的案例中,运行
解决了这个问题
php artisan optimize:clear
php artisan config:cache
optimize:clear
命令清除一切
我正在从 Laravel 7 升级到 Laravel 8(Laravel 8 仍在开发中几天)并且也遇到了这个问题。
解决方案是在路由中使用控制器的类名表示:
所以在 web.php 而不是
Route::get('registration/create', 'RegistrationController@create')
现在是:
解决方案 1:类名表示法
use App\Http\Controllers\RegistrationController;
Route::get('/', [RegistrationController::class, 'create']);
解决方案 2:字符串语法
或作为字符串语法(完整命名空间控制器名称):
Route::get('/', 'App\Http\Controllers\RegistrationController@create');
解决方案 3:Return 以前的行为
因为只有当您通过创建一个全新的 laravel 项目来升级您的应用程序时才会出现这个问题,您也可以 将默认名称空间添加到 RouteServiceProvider:
app/Providers/RouteServiceProvider.php
class RouteServiceProvider extends ServiceProvider
{
/* ... */
/** ADD THIS PROPERTY
* If specified, this namespace is automatically applied to your controller routes.
*
* In addition, it is set as the URL generator's root namespace.
*
* @var string
*/
protected $namespace = 'App\Http\Controllers';
/**
* Define your route model bindings, pattern filters, etc.
*
* @return void
*/
public function boot()
{
$this->configureRateLimiting();
$this->routes(function () {
Route::middleware('web')
->namespace($this->namespace) // <-- ADD THIS
->group(base_path('routes/web.php'));
Route::prefix('api')
->middleware('api')
->namespace($this->namespace) // <-- ADD THIS
->group(base_path('routes/api.php'));
});
}
/* ... /*
}
另请参阅 https://laravel.com/docs/8.x/routing#basic-routing or https://laravel.com/docs/8.x/upgrade(搜索“路由”)。
现在您可以在控制器文件夹外使用控制器
use App\Http\submit;
Route::get('/', [submit::class, 'index']);
现在我的控制器在 http 文件夹中很兴奋
你必须在控制器文件中改变一些东西
<?php
namespace App\Http;
use Illuminate\Http\Request;
use Illuminate\Http\Controllers\Controller;
class submit extends Controller {
public function index(Request $req) {
return $req;
}
}
您可以像这样定义到此控制器操作的路由:
使用App\Http\Controllers\UserController;
Route::get('user/{id}', [UserController::class, 'show']);
我在电脑上 运行 Laravel 8.x。
这个错误让我很头疼。要重新创建错误,这就是我所做的:
首先,我创建了一个名为 MyModelController.php 的控制器
其次,我为 return 一个包含 'Hello World' 的 blade 文件编写了一个简单的函数,称为 myFunction。
最后,我创建了一条路线:
Route::get('/','MyModelController@myFunction');
这没有用。
我就是这样解决的。
首先,您必须阅读以下文档:
(https://laravel.com/docs/8.x/releases#laravel-8)
在 'web.php' 文件中,这是我为使其工作而编写的路由:
使用App\Http\Controllers\MyModelController;
Route::get('/', [MyModelController::class, 'myFunction']);
在 Larave 7 上我遇到了同样的问题。
我检查了控制器名称的拼写。
我发现“AlbumContoller”拼写错误,我将其重命名为“AlbumController”。所以我忘了“r”
我在 web.php
中重命名文件和控制器名称和控制器名称后
Route::resource('albums', 'AlbumsController');
一切正常
所以你不需要这两个:
1- 使用 App\Http\Controllers\IndexContoller;
2- Route::get('/', [MyModelController::class, 'myFunction']);
这是我认为的完美答案:
- 选项 1:
use App\Http\Controllers\HomepageController;
Route::get('/', [HomepageController::class, 'index']);
- 选项 2:
Route::get('/', 'App\Http\Controllers\HomepageController@index');
只需检查 web.php 即可查看大小写字母
只需在 app->Providers->RouteServiceProvider.php
中添加以下行
protected $namespace = 'App\Http\Controllers';
您必须指定 class
的完整路径
之前是
Route::get('/wel','Welcome@index');
现在改成了
use App\Http\Controllers\Welcome;
Route::get('wel',[Welcome::class,'index']);
我正在使用 Laravel 6.0 并尝试使用 artisan route:list
列出我的所有路线,但它失败了 returns:
Illuminate\Contracts\Container\BindingResolutionException : Target class [App\Http\Controllers\SessionsController] does not exist.
at /home/vagrant/code/vendor/laravel/framework/src/Illuminate/Container/Container.php:806 802| 803| try { 804| $reflector = new ReflectionClass($concrete); 805| } catch (ReflectionException $e) { > 806| throw new BindingResolutionException("Target class [$concrete] does not exist.", 0, $e); 807| } 808| 809| // If the type is not instantiable, the developer is attempting to resolve 810| // an abstract type such as an Interface or Abstract Class and there is
Exception trace:
1 Illuminate\Foundation\Console\RouteListCommand::Illuminate\Foundation\Console{closure}(Object(Illuminate\Routing\Route)) [internal]:0
2 ReflectionException::("Class App\Http\Controllers\SessionsController does not exist") /home/vagrant/code/vendor/laravel/framework/src/Illuminate/Container/Container.php:804
3 ReflectionClass::__construct("App\Http\Controllers\SessionsController") /home/vagrant/code/vendor/laravel/framework/src/Illuminate/Container/Container.php:804
到目前为止,我只有一个非常简单的 web.php 路由文件:
Route::get('/', function () {
return view('index');
});
Route::prefix('app')->group(function () {
// Registration routes
Route::get('registration/create', 'RegistrationController@create')->name('app-registration-form');
});
// Templates
Route::get('templates/ubold/{any}', 'UboldController@index');
知道如何调试这个问题吗?
运行 这个命令
php artisan config:cache
在我的例子中,由于正斜杠 /
而发生相同的 error
但在定义路由时它应该是反斜杠 \
,
当你在 folder
中有控制器时会发生这种情况,就像在我的情况下控制器在 api
文件夹中,所以在提到控制器名称时总是使用反斜杠 \
。
参见示例:
易错代码:
Route::apiResource('categories', 'api/CategoryController');
解决方案代码:
Route::apiResource('categories', 'api\CategoryController');
对于那些对 Illuminate\Contracts\Container\BindingResolutionException : Target class [<className>] does not exist.
消息有类似问题的人,这也可能会有所帮助:
composer dump-autoload
好吧,我遇到了类似的问题,我想变得聪明,所以我在 web.php
中写了这个Route::group([
'middleware' => '', // Removing this made everything work
'as' => 'admin.',
'prefix' => 'admin',
'namespace' => 'Admin',
],function(){
});
我所要做的只是从组中删除所有 unnecessary/unused 选项。就这样。
尝试更正您的控制器名称
我的路线是
Route::get('/lien/{id}','liensControler@show');
我的控制器是
class liensController extends Controller
{
// all the methods of controller goes here.
}
在我的例子中,这是 Linux 文件名区分大小写的问题。对于名为 IndexController
的文件,具有 Indexcontroller
的文件在 windows 中有效,但在 Linux
这些我都做了
1: php artisan config:cache
2:检查控制器名称拼写。
3:作曲家dump-autoload
4: 刚把路由中的正斜杠改成了反斜杠。
第 4 个对我有用。
我在我的中间件组中错误地留下了一个空的中间件 class 时遇到了这个问题:
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:100,1',
'bindings',
'localization',
'' // Was empty by mistake
],
];
替换-
Route::resource('/admin/UserOff','admin/UsersController');
与-
Route::resource('/admin/UserOff','admin\UsersController');
转发/与\
我有同样的问题,但有一个中间件控制器。所以最后我在 kerner.php 文件中链接了那个中间件。它位于 app\Http\Kernel.php
我在路由中间件中添加了这一行。
'authpostmanweb' => \App\Http\Middleware\AuthPostmanWeb::class
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
'authpostmanweb' => \App\Http\Middleware\AuthPostmanWeb::class
];
在我的案例中,运行
解决了这个问题php artisan optimize:clear
php artisan config:cache
optimize:clear
命令清除一切
我正在从 Laravel 7 升级到 Laravel 8(Laravel 8 仍在开发中几天)并且也遇到了这个问题。
解决方案是在路由中使用控制器的类名表示:
所以在 web.php 而不是
Route::get('registration/create', 'RegistrationController@create')
现在是:
解决方案 1:类名表示法
use App\Http\Controllers\RegistrationController;
Route::get('/', [RegistrationController::class, 'create']);
解决方案 2:字符串语法
或作为字符串语法(完整命名空间控制器名称):
Route::get('/', 'App\Http\Controllers\RegistrationController@create');
解决方案 3:Return 以前的行为
因为只有当您通过创建一个全新的 laravel 项目来升级您的应用程序时才会出现这个问题,您也可以 将默认名称空间添加到 RouteServiceProvider:
app/Providers/RouteServiceProvider.php
class RouteServiceProvider extends ServiceProvider
{
/* ... */
/** ADD THIS PROPERTY
* If specified, this namespace is automatically applied to your controller routes.
*
* In addition, it is set as the URL generator's root namespace.
*
* @var string
*/
protected $namespace = 'App\Http\Controllers';
/**
* Define your route model bindings, pattern filters, etc.
*
* @return void
*/
public function boot()
{
$this->configureRateLimiting();
$this->routes(function () {
Route::middleware('web')
->namespace($this->namespace) // <-- ADD THIS
->group(base_path('routes/web.php'));
Route::prefix('api')
->middleware('api')
->namespace($this->namespace) // <-- ADD THIS
->group(base_path('routes/api.php'));
});
}
/* ... /*
}
另请参阅 https://laravel.com/docs/8.x/routing#basic-routing or https://laravel.com/docs/8.x/upgrade(搜索“路由”)。
现在您可以在控制器文件夹外使用控制器
use App\Http\submit;
Route::get('/', [submit::class, 'index']);
现在我的控制器在 http 文件夹中很兴奋
你必须在控制器文件中改变一些东西
<?php
namespace App\Http;
use Illuminate\Http\Request;
use Illuminate\Http\Controllers\Controller;
class submit extends Controller {
public function index(Request $req) {
return $req;
}
}
您可以像这样定义到此控制器操作的路由:
使用App\Http\Controllers\UserController;
Route::get('user/{id}', [UserController::class, 'show']);
我在电脑上 运行 Laravel 8.x。 这个错误让我很头疼。要重新创建错误,这就是我所做的: 首先,我创建了一个名为 MyModelController.php 的控制器 其次,我为 return 一个包含 'Hello World' 的 blade 文件编写了一个简单的函数,称为 myFunction。 最后,我创建了一条路线: Route::get('/','MyModelController@myFunction'); 这没有用。
我就是这样解决的。 首先,您必须阅读以下文档: (https://laravel.com/docs/8.x/releases#laravel-8)
在 'web.php' 文件中,这是我为使其工作而编写的路由:
使用App\Http\Controllers\MyModelController;
Route::get('/', [MyModelController::class, 'myFunction']);
在 Larave 7 上我遇到了同样的问题。
我检查了控制器名称的拼写。
我发现“AlbumContoller”拼写错误,我将其重命名为“AlbumController”。所以我忘了“r”
我在 web.php
中重命名文件和控制器名称和控制器名称后Route::resource('albums', 'AlbumsController');
一切正常
所以你不需要这两个:
1- 使用 App\Http\Controllers\IndexContoller;
2- Route::get('/', [MyModelController::class, 'myFunction']);
这是我认为的完美答案:
- 选项 1:
use App\Http\Controllers\HomepageController;
Route::get('/', [HomepageController::class, 'index']);
- 选项 2:
Route::get('/', 'App\Http\Controllers\HomepageController@index');
只需检查 web.php 即可查看大小写字母
只需在 app->Providers->RouteServiceProvider.php
protected $namespace = 'App\Http\Controllers';
您必须指定 class
的完整路径之前是
Route::get('/wel','Welcome@index');
现在改成了
use App\Http\Controllers\Welcome;
Route::get('wel',[Welcome::class,'index']);