我正在使用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 | } 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 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');
有什么主意我可以调试这个问题吗?
非常感谢!
答案 0 :(得分:46)
我正在从Laravel 7升级到 Laravel 8 (Laravel 8仍在开发中几天),并且也遇到了这个问题。
解决方案是在路由中使用控制器的类名表示形式:
因此在 web.php 中而不是
Route::get('registration/create', 'RegistrationController@create')
现在是:
use App\Http\Controllers\RegistrationController;
Route::get('/', [RegistrationController::class, 'create']);
或作为字符串语法(完整的名称空间控制器名称):
Route::get('/', 'App\Http\Controllers\RegistrationController@create');
仅当您通过创建全新的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(搜索“路由”)。
答案 1 :(得分:9)
运行此命令
php artisan config:cache
答案 2 :(得分:5)
对于与Illuminate\Contracts\Container\BindingResolutionException : Target class [<className>] does not exist.
消息有类似问题的用户,这也可能会有所帮助:
composer dump-autoload
答案 3 :(得分:2)
只需在 app->Providers->RouteServiceProvider.php
中添加以下行
protected $namespace = 'App\\Http\\Controllers';
答案 4 :(得分:2)
我认为这是完美的答案:
use App\Http\Controllers\HomepageController;
Route::get('/', [HomepageController::class, 'index']);
Route::get('/', 'App\Http\Controllers\HomepageController@index');
答案 5 :(得分:2)
就我而言,这是Linux文件名区分大小写的问题。对于名为public class CustomHtmlHelper : HtmlHelper, IHtmlHelper
{
public CustomHtmlHelper(IHtmlGenerator htmlGenerator, ICompositeViewEngine viewEngine, IModelMetadataProvider metadataProvider, IViewBufferScope bufferScope, HtmlEncoder htmlEncoder, UrlEncoder urlEncoder) : base(htmlGenerator, viewEngine, metadataProvider, bufferScope, htmlEncoder, urlEncoder) { }
public IHtmlContent CustomGenerateEditor(ModelExplorer modelExplorer, string htmlFieldName, string templateName, object additionalViewData)
{
return GenerateEditor(modelExplorer, htmlFieldName, templateName, additionalViewData);
}
protected override IHtmlContent GenerateEditor(ModelExplorer modelExplorer, string htmlFieldName, string templateName, object additionalViewData)
{
return base.GenerateEditor(modelExplorer, htmlFieldName, templateName, additionalViewData);
}
}
的文件,具有public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
if (context == null)
throw new ArgumentNullException(nameof(context));
if (output == null)
throw new ArgumentNullException(nameof(output));
if (!output.Attributes.ContainsName(nameof(Template)))
{
output.Attributes.Add(nameof(Template), Template);
}
output.SuppressOutput();
(_htmlHelper as IViewContextAware).Contextualize(ViewContext);
var customHtmlHelper = _htmlHelper as CustomHtmlHelper;
var content = customHtmlHelper.CustomGenerateEditor(For.ModelExplorer, For.Metadata.DisplayName ?? For.Metadata.PropertyName, Template, null);
output.Content.SetHtmlContent(content);
await Task.CompletedTask;
}
的文件将在Windows中工作,但在Linux中不工作
答案 6 :(得分:2)
现在您可以在控制器文件夹之外使用控制器了
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;
}
}
答案 7 :(得分:1)
就我而言,它是通过运行解决的
php artisan optimize:clear
php artisan config:cache
optimize:clear
命令清除所有内容
答案 8 :(得分:1)
你必须指定类的完整路径
以前是
Route::get('/wel','Welcome@index');
现在变成了
use App\Http\Controllers\Welcome;
Route::get('wel',[Welcome::class,'index']);
答案 9 :(得分:1)
我正在PC上运行Laravel8.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']))
答案 10 :(得分:0)
我遇到了同样的问题,但是使用了中间件控制器。所以最后我将中间件链接到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
];
答案 11 :(得分:0)
替换-
Route::resource('/admin/UserOff','admin/UsersController');
with-
Route::resource('/admin/UserOff','admin\UsersController');
前进/带有\
答案 12 :(得分:0)
在将一个空的中间件类错误地留在中间件组中时,我遇到了这个问题:
/**
* 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
],
];
答案 13 :(得分:0)
您可以像这样定义此控制器操作的路由:
使用App \ Http \ Controllers \ UserController;
Route :: get('user / {id}',[UserController :: class,'show']))
答案 14 :(得分:0)
我做了所有这些
1:php artisan config:cache
2:检查了控制器名称的拼写。
3:作曲家转储自动加载
4:只需将路径中的正斜杠更改为后退\。
第四个为我工作。
答案 15 :(得分:0)
在Larave 7上,我遇到了同样的问题。
我检查了控制器名称的拼写。
我认识到“ AlbumContoller”中的拼写有误,并将其重命名为“ AlbumController”。所以我忘记了“ r”
在重命名web.php中的文件和控制器名称以及控制器名称后
Route::resource('albums', 'AlbumsController');
一切正常
所以您不需要这两个:
1-使用App \ Http \ Controllers \ IndexContoller;
2- Route :: get('/',[MyModelController :: class,'myFunction']);
答案 16 :(得分:0)
尝试更正您的控制器名称
我的路线是
Route::get('/lien/{id}','liensControler@show');
和控制器是 liensController类扩展Controller {
}
答案 17 :(得分:0)
只需检查 web.php 并查看大小写字母
答案 18 :(得分:0)
好吧,我遇到了类似的问题,我试图变得聪明,所以我在web.php中写了这个
Route::group([
'middleware' => '', // Removing this made everything work
'as' => 'admin.',
'prefix' => 'admin',
'namespace' => 'Admin',
],function(){
});
我要做的就是从组中删除所有不必要/未使用的选项。就这样。
答案 19 :(得分:0)
在我的情况下,同样的error
是由于正斜杠/
而出现的,但在定义路径时应该是反斜杠\
当您在folder
中有控制器时会发生这种情况,就像我在api
文件夹中有控制器一样,因此在提及控制器名称时,请始终使用反斜杠\
。
请参阅示例:
容易出错的代码:
Route::apiResource('categories', 'api/CategoryController');
Route::apiResource('categories', 'api\CategoryController');