Laravel 6.0 php artisan route:list返回“目标类[App \ Http \ Controllers \ SessionsController]不存在。”

时间:2019-09-10 06:57:17

标签: laravel artisan

我正在使用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');

有什么主意我可以调试这个问题吗?

非常感谢!

20 个答案:

答案 0 :(得分:46)

我正在从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-routinghttps://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)

我认为这是完美的答案:

  • 选项 1:
use App\Http\Controllers\HomepageController;
Route::get('/', [HomepageController::class, 'index']);
  • 选项 2:
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');