Laravel 6.0 php artisan route:list 返回“目标类 [App\Http\Controllers\SessionsController] 不存在。”
Posted
技术标签:
【中文标题】Laravel 6.0 php artisan route:list 返回“目标类 [App\\Http\\Controllers\\SessionsController] 不存在。”【英文标题】:Laravel 6.0 php artisan route:list returns “Target class [App\Http\Controllers\SessionsController] does not exist.”Laravel 6.0 php artisan route:list 返回“目标类 [App\Http\Controllers\SessionsController] 不存在。” 【发布时间】:2020-01-11 21:35:45 【问题描述】:我正在使用 Laravel 6.0,我尝试使用 artisan route:list
列出我的所有路由,但它失败并返回:
Illuminate\Contracts\Container\BindingResolutionException : 目标 类 [App\Http\Controllers\SessionsController] 不存在。
在 /home/vagrant/code/vendor/laravel/framework/src/Illuminate/Container/Container.php:806 802| 803|尝试 804| $reflector = new ReflectionClass($concrete); 805| 捕捉(反射异常 $e) > 806| throw new BindingResolutionException("目标类 [$concrete] 不存在。", 0, $e); 807| 808| 809| // 如果类型不可实例化,开发者正在尝试解析 810| // 一个抽象类型,例如接口或抽象类,并且有
异常跟踪:
1 Illuminate\Foundation\Console\RouteListCommand::Illuminate\Foundation\Consoleclosure(Object(Illuminate\Routing\Route)) [内部]:0
2 ReflectionException::("类 App\Http\Controllers\SessionsController 不存在") /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 了吗? 你有SessionsController吗? 真丢脸。我以为我创建了 SessionsController,但我没有。创建它并运行 php artisan config:cache 后它就可以工作了。非常感谢您的快速回复! 也可以是控制器顶部的命名空间 【参考方案1】:你必须指定类的完整路径
以前是
Route::get('/wel','Welcome@index');
现在变成了
use App\Http\Controllers\Welcome;
Route::get('wel',[Welcome::class,'index']);
【讨论】:
【参考方案2】:只需在app->Providers->RouteServiceProvider.php
中添加以下行
protected $namespace = 'App\\Http\\Controllers';
【讨论】:
【参考方案3】:只需检查 web.php 并查看大小写字母
【讨论】:
【参考方案4】:我认为这是完美的答案:
选项 1:use App\Http\Controllers\HomepageController;
Route::get('/', [HomepageController::class, 'index']);
选项 2:
Route::get('/', 'App\Http\Controllers\HomepageController@index');
【讨论】:
【参考方案5】:在 Larave 7 上我遇到了同样的问题。
我检查了控制器名称的拼写。
我意识到我在“AlbumContoller”中的拼写错误,我将其重命名为“AlbumController”。所以我忘记了“r”
我在web.php中重命名了文件和控制器名和控制器名之后
Route::resource('albums', 'AlbumsController');
一切正常
所以你不需要这两个:
1- 使用 App\Http\Controllers\IndexContoller;
2- Route::get('/', [MyModelController::class, 'myFunction']);
【讨论】:
这对我有用,我已将 'BannerController' 放在引号之间【参考方案6】:我正在从 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:返回之前的行为
因为只有当你通过创建一个全新的 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 或 https://laravel.com/docs/8.x/upgrade(搜索“路由”)。
【讨论】:
刚刚碰到这个!希望文档得到更新+他们不会改变这样的小事。烦人。 @Vincent 是的,删除一种语法支持会完全破坏整个项目,对吗?他们本可以将两者都集成在一起。 除此更改外,默认命名空间现在为空。添加命名空间,您不必使用 use 语句指定每个控制器:namespace App\Http\Controllers; 这样的东西适用于 Route::group(["namespace" => "App\Http\Controllers\Web"], function () Route::get('/', 'Website @home'); );【参考方案7】:我在我的电脑上运行 Laravel 8.x。 这个错误让我很头疼。要重新创建错误,这就是我所做的: 首先,我创建了一个名为 MyModelController.php 的控制器 其次,我编写了一个简单的函数来返回一个包含“Hello World”的刀片文件,称为 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']);
【讨论】:
该问题指定了 Laravel 版本 6,其中提供的语义正常工作。 实际上,我也在使用 Laravel 8,他的回答对我有用。并且他明确表示他的解决方案是针对 Laravel 8.x 我在使用 Laravel 8 时遇到了类似的问题。原来我没有在路由页面 (web.php) 的顶部包含控制器:use App\Http\Controllers\NameOfController;
【参考方案8】:
您可以像这样定义此控制器操作的路由:
使用 App\Http\Controllers\UserController;
Route::get('user/id', [UserController::class, 'show']);
【讨论】:
【参考方案9】:现在您可以在控制器文件夹外使用控制器
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;
【讨论】:
【参考方案10】:在我的情况下,它是通过运行解决的
php artisan optimize:clear
php artisan config:cache
optimize:clear
commands 清除所有内容
【讨论】:
这对我的错误消息不起作用,Illuminate\Contracts\Container\BindingResolutionException 目标类 [MessagesController] 不存在。无论如何谢谢你【参考方案11】:我遇到了同样的问题,但使用的是中间件控制器。所以最后我在 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
];
【讨论】:
【参考方案12】:替换-
Route::resource('/admin/UserOff','admin/UsersController');
与-
Route::resource('/admin/UserOff','admin\UsersController');
转发/用\
【讨论】:
【参考方案13】:我在中间件组中错误地留下了一个空的中间件类时遇到了这个问题:
/**
* 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
],
];
【讨论】:
【参考方案14】:这些都是我做的
1:php 工匠配置:缓存
2:检查控制器名称拼写。
3:作曲家转储自动加载
4: 只是将路径中的正/斜杠改为反向\。
第四个对我有用。
【讨论】:
此解决方案无法解决我的错误,感谢您的帮助。【参考方案15】:尝试更正您的控制器名称
我的路线是
Route::get('/lien/id','liensControler@show');
我的控制器是
class liensController extends Controller
// all the methods of controller goes here.
【讨论】:
【参考方案16】:就我而言,这是 Linux 文件名区分大小写的问题。对于名为IndexController
的文件,具有Indexcontroller
将在Windows 中有效,但在Linux 中无效
【讨论】:
【参考方案17】:好吧,我遇到了类似的问题,我想变得聪明,所以我在我的 web.php 中写了这个
Route::group([
'middleware' => '', // Removing this made everything work
'as' => 'admin.',
'prefix' => 'admin',
'namespace' => 'Admin',
],function()
);
我所要做的就是从组中删除所有不必要/未使用的选项。就这样。
【讨论】:
【参考方案18】:对于那些与Illuminate\Contracts\Container\BindingResolutionException : Target class [<className>] does not exist.
消息有类似问题的人,这也可能会有所帮助:
composer dump-autoload
【讨论】:
【参考方案19】:在我的情况下,由于正斜杠 /
而发生了相同的 error
,但在定义路由时它应该是反斜杠 \
,
当您在 folder
中有控制器时会发生这种情况,就像在我的情况下控制器在 api
文件夹中一样,因此在提及控制器名称时始终使用反斜杠 \
。
参见示例:
容易出错的代码:
Route::apiResource('categories', 'api/CategoryController');
解决方案代码:
Route::apiResource('categories', 'api\CategoryController');
【讨论】:
【参考方案20】:运行这个命令
php artisan config:cache
【讨论】:
以上是关于Laravel 6.0 php artisan route:list 返回“目标类 [App\Http\Controllers\SessionsController] 不存在。”的主要内容,如果未能解决你的问题,请参考以下文章
如何手动使用 composer, artisan ...(Laravel) php 命令
php Laravel Artisan Migrate创建领域