我正在使用Laravel 6.0,我尝试用artisan route:list
列出我所有的路线,但它失败并返回:
Illuminate\Contracts\Container\BindingResolutionException : Target 类 [App\Http\Controllers\SessionsController] 不存在。
at/home/vagrant/code/vendor/laravel/framework/src/Illuminate/Container/Container.php:806 802| 803| 尝试 { 804| $reflector = new ReflectionClass($concrete); 805| } catch (ReflectionException $e) {> 806| 抛出新的 BindingResolutionException("目标类 [$concrete] 不存在", 0, $e); 807| } 808| 809| 如果类型不可实例化,则开发人员正在尝试解析 810| 抽象类型,如接口或抽象类
,并且有异常跟踪:
1 Illuminate\Foundation\Console\RouteListCommand::Illuminate\Foundation\Console{closure}(Object(Illuminate\Routing\Route)) [内部]:0
2 反射异常::("Class 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 routes 文件:
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');
知道我如何调试这个问题吗?
我正在从Laravel 7升级到Laravel 8(Laravel 8仍在开发中几天),也遇到了这个问题。
解决方案是在路由中使用控制器的类名表示形式:
所以在网络中.php而不是
Route::get('registration/create', 'RegistrationController@create')
现在是:
解决方案 1:类名表示形式
use AppHttpControllersRegistrationController;
Route::get('/', [RegistrationController::class, 'create']);
解决方案 2:字符串语法
或作为字符串语法(完整命名空间控制器名称):
Route::get('/', 'AppHttpControllersRegistrationController@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 = 'AppHttpControllers';
/**
* 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(搜索"路由")。
对于那些对IlluminateContractsContainerBindingResolutionException : Target class [<className>] does not exist.
消息有类似问题的人,这也可能会有所帮助:
composer dump-autoload
运行此命令
php artisan config:cache
在我的情况下,它是通过运行来解决的
php artisan optimize:clear
php artisan config:cache
optimize:clear
命令清除所有内容
就我而言,这是Linux文件名区分大小写的问题。对于名为IndexController
的文件,具有Indexcontroller
可以在 Windows 中使用,但在 Linux 中不起作用
>只需在app->Providers->RouteServiceProvider.php
中添加以下行
protected $namespace = 'App\Http\Controllers';
在我的情况下,由于正斜杠/
发生了相同的error
,但在定义路由时应该是反斜杠,
当您在folder
中具有控制器时会发生这种情况,就像我的情况控制器在api
文件夹中一样,因此在提及控制器名称时始终使用反斜杠。
请参阅示例:
容易出错的代码:
Route::apiResource('categories', 'api/CategoryController');
解决方案代码:
Route::apiResource('categories', 'apiCategoryController');
我认为这是完美的答案:
- 选项 1:
use AppHttpControllersHomepageController;
Route::get('/', [HomepageController::class, 'index']);
- 选项 2:
Route::get('/', 'AppHttpControllersHomepageController@index');
好吧,我遇到了类似的问题,我试图变得聪明,所以我在我的网站上写了这个.php
Route::group([
'middleware' => '', // Removing this made everything work
'as' => 'admin.',
'prefix' => 'admin',
'namespace' => 'Admin',
],function(){
});
我所要做的就是从组中删除所有不必要/未使用的选项。就这样。
尝试更正控制器名称
我的路线是
Route::get('/lien/{id}','liensControler@show');
我的控制器是
class liensController extends Controller
{
// all the methods of controller goes here.
}
我做了所有这些
1: PHP 工匠配置:缓存
2:检查控制器名称拼写。
3:作曲家转储自动加载
4:刚刚将前进/斜杠更改为后退\路由。
第四个为我工作。
现在您可以使用控制器文件夹外部的控制器
use AppHttpsubmit;
Route::get('/', [submit::class, 'index']);
现在我的控制器在 http 文件夹中兴奋
您必须在控制器文件中更改某些内容
<?php
namespace AppHttp;
use IlluminateHttpRequest;
use IlluminateHttpControllersController;
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 其次,我编写了一个简单的函数来返回一个包含"Hello World"的刀片文件,称为myFunction。 最后,我创建了一个路由: 路由::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']);
您必须指定类的完整路径
以前是
Route::get('/wel','Welcome@index');
现在它已更改为
use AppHttpControllersWelcome;
Route::get('wel',[Welcome::class,'index']);
我在错误地在我的中间件组中留下一个空的中间件类时遇到了这个问题:
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
MiddlewareEncryptCookies::class,
IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class,
IlluminateSessionMiddlewareStartSession::class,
IlluminateViewMiddlewareShareErrorsFromSession::class,
MiddlewareVerifyCsrfToken::class,
IlluminateRoutingMiddlewareSubstituteBindings::class,
],
'api' => [
'throttle:100,1',
'bindings',
'localization',
'' // Was empty by mistake
],
];
替换-
Route::resource('/admin/UserOff','admin/UsersController');
跟-
Route::resource('/admin/UserOff','adminUsersController');
前进/带 \
我遇到了同样的问题,但使用了中间件控制器。所以最后我在kerner.php文件中链接了那个中间件。它位于app\Http\Kernel.php
我在route middleware.
'authpostmanweb' => \App\Http\Middleware\AuthPostmanWeb::class
protected $routeMiddleware = [
'auth' => AppHttpMiddlewareAuthenticate::class,
'auth.basic' => IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class,
'bindings' => IlluminateRoutingMiddlewareSubstituteBindings::class,
'cache.headers' => IlluminateHttpMiddlewareSetCacheHeaders::class,
'can' => IlluminateAuthMiddlewareAuthorize::class,
'guest' => AppHttpMiddlewareRedirectIfAuthenticated::class,
'password.confirm' => IlluminateAuthMiddlewareRequirePassword::class,
'signed' => IlluminateRoutingMiddlewareValidateSignature::class,
'throttle' => IlluminateRoutingMiddlewareThrottleRequests::class,
'verified' => IlluminateAuthMiddlewareEnsureEmailIsVerified::class,
'authpostmanweb' => AppHttpMiddlewareAuthPostmanWeb::class
];
除了确保使用更新的路由语法之外:
Route::get('/', [RegistrationController::class, 'create']);
确保在路由/Web 的顶部.php控制器包含在命名空间中,如下所示:
use AppHttpControllersRegistrationController;
只需检查网络.php并查看小写和大写字母