目标类不存在。Laravel 8中的问题。

22

在使用Laravel 8创建新项目时,我遇到了这个错误:

Illuminate\Contracts\Container\BindingResolutionException 目标类[SayhelloController]不存在。 http://127.0.0.1:8000/users/john

<?php
    
use Illuminate\Support\Facades\Route;
     
Route::get('/', function () {
    return view('welcome');
});  
    
Route::get('/users/{name?}' , [SayhelloController::class,'index']);

在 Laravel 文档中,路由控制器类必须像这样定义

 // Using PHP callable syntax...
Route::get('/users', [UserController::class, 'index']);

// Using string syntax...
Route::get('/users', 'App\Http\Controllers\UserController@index');

目标类别

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class SayhelloController extends Controller
{
    public function index($name = null)
    {
        return 'Hello '.$name;
    }
}

所以我就照着做了。


你能分享更多细节吗,比如那个目标类的定义? - Nico Haase
目标类已添加。 - user14258897
你在两分钟内回答了自己的问题,既然已经知道答案,为什么还要问呢? - kewlashu
2
@Orhan,这是一个不错的想法,但这不是SO的工作方式。你应该首先查看你正在解决的问题/解决方案是否已经得到解决。如果你想回答,你应该添加一些更多的细节,就像kamlesh-paul所做的那样。干杯 :) - kewlashu
composer dump-autoload - mercury
显示剩余2条评论
1个回答

61

Laravel 8更新了编写路由的方式

参考链接:https://laravel.com/docs/8.x/upgrade

Laravel 8中你需要使用如下方式:

use App\Http\Controllers\SayhelloController;
Route::get('/users/{name?}' , [SayhelloController::class,'index']);
或者
Route::get('/users', 'App\Http\Controllers\UserController@index');

如果你想使用旧的方式

那么在 RouteServiceProvider.php 文件中

添加这行代码

 /**
     * This namespace is applied to your controller routes.
     *
     * In addition, it is set as the URL generator's root namespace.
     *
     * @var string
     */
    protected $namespace = 'App\Http\Controllers'; // need to add in Laravel 8
    

public function boot()
{
    $this->configureRateLimiting();

    $this->routes(function () {
        Route::prefix('api')
            ->middleware('api')
            ->namespace($this->namespace) // need to add in Laravel 8
            ->group(base_path('routes/api.php'));

        Route::middleware('web')
            ->namespace($this->namespace) // need to add in Laravel 8
            ->group(base_path('routes/web.php'));
    });
}

然后你可以使用如下方式

Route::get('/users/{name?}' , [SayhelloController::class,'index']);
Route::resource('/users' , SayhelloController::class);
或者
Route::get('/users', 'UserController@index');

你好,我无法打开一个新的线程。我找到了这个解决方案,正是我需要的,但是我正在使用资源控制器,我该怎么办? - Mau España
@MauEspaña 我也添加了 resource 的示例。 - Kamlesh Paul
今天,与此线程相比,几个月后我面临着同样的问题。在我的情况下,RouteServiceProvider.php 的引用并不是必要的/不是我的情况,因为它已经存在了!所以,我将我的类StudentControllerApp\Http\Controller目录更改为子目录:App\Http\Controller\Student\StudentController。然后再次运行artisan route:list。同样的问题再次发生,但是引用的路径引起了我的注意:App\Http\Controller\App\Http\Controller\Student\StudentController。这意味着某种缓存路由。我把类放回去就可以了! - Bitart
1
对于未接触过此内容的人,您可能需要在答案顶部提醒他们需要在路由文件的顶部包含控制器。 - burf
我认为最好的方法是使用旧方式打开RouteServiceProvider.php,并在public function boot()之前添加protected $namespace = 'App\\Http\\Controllers';,这样就不需要进行太多更改。 - Fauzi Ferdiansyah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接