这是我的控制器:
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class RegisterController extends Controller
{
public function register(Request $request)
{
dd('aa');
}
}
如截图所示,类存在并且在正确的位置:
我的api.php路由:
Route::get('register', 'Api\RegisterController@register');
当我使用Postman命中我的寄存器路径时,它给了我以下错误:
目标类[Api\RegisterController]不存在。
我该怎么解决呢?
多亏了这些答案,我才得以修复它。我决定对这个路由使用完全限定类名,但是答案中描述了其他选项。
Route::get('register', 'App\Http\Controllers\Api\RegisterController@register');
Laravel 8文档实际上比这里的任何答案都更简洁和清楚地回答了这个问题:
路由命名空间更新
在Laravel之前的版本中,RouteServiceProvider包含一个$namespace属性。此属性的值将自动添加到控制器路由定义的前缀,并调用动作助手/ URL::action方法。在Laravel 8。X,此属性默认为空。这意味着Laravel不会自动添加名称空间前缀。因此,在新的Laravel 8。x应用程序,控制器路由定义应该使用标准的PHP可调用语法定义:
use App\Http\Controllers\UserController;
Route::get('/users', [UserController::class, 'index']);
对动作相关方法的调用应该使用相同的可调用语法:
action([UserController::class, 'index']);
return Redirect::action([UserController::class, 'index']);
如果你喜欢Laravel 7。x风格的控制器路由前缀,你可以简单地将$namespace属性添加到应用程序的RouteServiceProvider中。
在Laravel 8中定义路径的方法有两种
// Using PHP callable syntax...
use App\Http\Controllers\HomeController;
Route::get('/', [HomeController::class, 'index']);
Or
// Using string syntax...
Route::get('/', 'App\Http\Controllers\HomeController@index');
资源路由变为
// Using PHP callable syntax...
use App\Http\Controllers\HomeController;
Route::resource('/', HomeController::class);
这意味着在Laravel 8中,默认情况下没有任何自动控制器声明前缀。
方法中添加名称空间属性
并在routes方法中激活。
如果你想继续使用原来的自动前缀控制器路由,你可以简单地在RouteServiceProvider中设置$namespace属性的值,并在引导方法中更新路由注册以使用$namespace属性:
class RouteServiceProvider extends ServiceProvider
{
/**
* 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';
/**
* Define your route model bindings, pattern filters, etc.
*
* @return void
*/
public function boot()
{
$this->configureRateLimiting();
$this->routes(function () {
Route::middleware('web')
->namespace($this->namespace)
->group(base_path('routes/web.php'));
Route::prefix('api')
->middleware('api')
->namespace($this->namespace)
->group(base_path('routes/api.php'));
});
}
在Laravel 8中,只需在routes\web.php中添加控制器名称空间
use App\Http\Controllers\InvoiceController; // InvoiceController is controller name
Route::get('invoice',[InvoiceController::class, 'index']);
或者转到:app\Providers\RouteServiceProvider.php路径并删除注释:
protected $namespace = 'App\\Http\\Controllers';