这是我的控制人:
<?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');
当我使用邮差到达register
路线时,它给了我以下错误:
目标类[Api \ RegisterController]不存在。
更新:
多亏了答案,我才得以解决。我决定为此路线使用完全限定的类名称,但答案中还介绍了其他选项。
Route::get('register', 'App\Http\Controllers\Api\RegisterController@register');
答案 0 :(得分:184)
您正在使用Laravel8。在全新安装的Laravel 8中,没有将名称空间前缀应用于要加载到您的路由的路由组。
“在Laravel的早期版本中,
RouteServiceProvider
包含一个$namespace
属性。该属性的值将自动添加到控制器路由定义的前缀,并调用action
助手/ {{1 }}方法。在Laravel 8.x中,此属性默认为URL::action
。这意味着Laravel不会自动命名空间前缀。” Laravel 8.x Docs - Release Notes
在不使用命名空间前缀的情况下,在路由中引用控制器时,必须使用控制器的完全合格类名称。
null
use App\Http\Controllers\UserController;
Route::get('/users', [UserController::class, 'index']);
// or
Route::get('/users', 'App\Http\Controllers\UserController@index');
:
App\Providers\RouteServiceProvider
对您要为其声明名称空间的任何路由组执行此操作。
public function boot()
{
...
Route::prefix('api')
->middleware('api')
->namespace('App\Http\Controllers') // <---------
->group(base_path('routes/api.php'));
...
}
属性:
尽管在发行说明中提到要在$namespace
上设置$namespace
属性,并在RouteServiceProvider
中添加注释,但这对您的路线没有任何影响。当前仅用于添加名称空间前缀以生成操作的URL。因此,您可以设置此变量,但它本身不会添加这些名称空间前缀,仍然需要确保在将名称空间添加到路由组时使用此变量。
此信息现在在升级指南中
Laravel 8.x Docs - Upgrade Guide - Routing
升级指南显示的重要部分是,您在路由组上定义了名称空间。单独设置RouteServiceProvider
变量(仅仅)有助于生成操作的URL。
再次强调一下,重要部分是为路由组设置名称空间,它们只是通过引用成员变量$namespace
来完成的直接在示例中。
如果您从$namespace
的8.0.2版本开始安装了Laravel 8的新副本,则可以取消注释laravel/laravel
中的protected $namespace
成员变量,以恢复旧版本,因为设置了路由组,以便将此成员变量用于组的名称空间。
RouteServiceProvider
之所以取消注释,是将名称空间前缀添加到分配给路由的控制器上,这是唯一的原因,因为路由组已设置为将此变量用作名称空间:
// protected $namespace = 'App\\Http\\Controllers';
答案 1 :(得分:15)
案例-1
我们可以在 api.php
和 web.php
这样的文件中进行更改,例如以下。.
我们目前写syntex
的方式是
Route::get('login', 'LoginController@login');
应更改为
Route::get('login', [LoginController::class, 'login']);
案例-2
答案 2 :(得分:8)
在 laravel-8 中默认删除名称空间前缀,因此您可以在laravel-7中设置旧方法,例如:
在RouteServiceProvider.php
中添加此变量
protected $namespace = 'App\Http\Controllers';
并更新boot
方法
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'));
});
}
答案 3 :(得分:6)
laravel 8更新了RouteServiceProvider,它会影响字符串语法的路由,您可以像上面一样对其进行更改,但是建议的方法是使用操作语法而不是将路由语法与字符串语法一起使用:
nodetool flush
应更改为:
cqlsh> TRUNCATE ks_name.table_name
答案 4 :(得分:4)
Laravel 8 documentation 实际上比这里的任何答案都更简洁明了地回答了这个问题:
在以前的 Laravel 版本中,RouteServiceProvider
包含一个 $namespace
属性。此属性的值将自动添加到控制器路由定义和对 action
助手 / URL::action
方法的调用的前缀。在 Laravel 8.x 中,此属性默认为 null
。这意味着 Laravel 不会自动添加命名空间前缀。因此,在新的 Laravel 8.x 应用程序中,控制器路由定义应该使用标准的 PHP 可调用语法来定义:
use App\Http\Controllers\UserController;
Route::get('/users', [UserController::class, 'index']);
对 action
相关方法的调用应使用相同的可调用语法:
action([UserController::class, 'index']);
return Redirect::action([UserController::class, 'index']);
如果您更喜欢 Laravel 7.x 风格的控制器路由前缀,您可以简单地将 $namespace
属性添加到应用程序的 RouteServiceProvider
中。
没有解释为什么 Taylor Otwell 添加这个令人抓狂的陷阱,但我认为他有他的理由。
答案 5 :(得分:4)
use App\Http\Controllers\InvoiceController; // InvoiceController is controller name Route::get('invoice',[InvoiceController::class, 'index']);
protected $namespace = 'App\\Http\\Controllers';
答案 6 :(得分:2)
我在安装 Laravel 8.27.0 版时遇到了同样的错误: 错误如下:
但是当我看到我的 app/Providers/RouteServiceProvider.php
时,我的引导方法中有命名空间,然后我只是取消了注释 => protected $namespace = 'App\\Http\\Controllers';
现在我的项目正在运行:
希望对你有所帮助。
答案 7 :(得分:1)
如果您想继续使用原始的自动前缀控制器路由,只需在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'));
});
}
答案 8 :(得分:1)
在 app/Providers 文件夹中,RouteServiceProvider.php 更改受保护的 $namespace;变量到
protected $namespace = 'App\\Http\\Controllers';
这将在保存时自动注释变量。
答案 9 :(得分:1)
答案 10 :(得分:1)
在新安装的 Laravel 8 上,在 App/Providers/RouteServices.php 中
* The path to the "home" route for your application.
*
* This is used by Laravel authentication to redirect users after login.
*
* @var string
*/
public const HOME = '/home';
/**
* The controller namespace for the application.
*
* When present, controller route declarations will automatically be prefixed with this namespace.
*
* @var string|null
*/
// protected $namespace = 'App\\Http\\Controllers';
取消注释
受保护的 $namespace = 'App\Http\Controllers';
这应该可以帮助您以老式的方式运行 laravel。
如果您是从较低版本的 laravel 升级到 8,那么您可能必须隐式添加
受保护的 $namespace = 'App\Http\Controllers';
在 RouteServices.php 文件中使其以旧方式运行。
答案 11 :(得分:1)
在 laravel 8 中定义路由的方式是
// Using PHP callable syntax...
use App\Http\Controllers\HomeController;
Route::get('/', [HomeController::class, 'index']);
或
// 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 中,默认没有自动控制器声明前缀。
如果你想坚持旧的方式,那么你需要在
app\Providers\RouteServiceProvider.php
并在路由方法中激活。
按照以下图片说明进行操作:
答案 12 :(得分:1)
如果您使用的是laravel 8
只需复制并粘贴我的代码
use App\Http\Controllers\UserController;
Route::get('/user', [UserController::class, 'index']);
答案 13 :(得分:1)
在laravel-8中,您可以像这样使用
Route::group(['namespace'=>'App\Http\Controllers', 'prefix'=>'admin',
'as'=>'admin.','middleware'=>['auth:sanctum', 'verified']], function()
{
Route::resource('/dashboard', 'DashboardController')->only([
'index'
]);
});
谢谢
答案 14 :(得分:0)
如果您希望将此路线分组,可以按照以下步骤操作:
Route::group(['namespace' => 'App\Http\Controllers\Api'], function () {
Route::resource('user', 'UserController');
Route::resource('book', 'BookController');
});
答案 15 :(得分:-1)
我遇到了这个错误
(Illuminate \ Contracts \ Container \ BindingResolutionException 目标类[App \ Http \ Controllers \ ControllerFileName]不存在。
解决方案: 只需检查您的类名,它应该与您的文件名完全相同。
答案 16 :(得分:-1)
对于解决方案,只需取消第29行的注释:
**protected $namespace = 'App\\Http\\Controllers';**
在“ app \ Providers \ RouteServiceProvider.php ”文件中。
答案 17 :(得分:-1)
在Laravel 8中,指定路线的方式已更改:
Route::resource('homes', HomeController::class)->names('home.index');
答案 18 :(得分:-1)
只需取消RouteServiceProvider
行下面的注释(如果不存在,则添加)
protected $namespace = 'App\\Http\\Controllers';
答案 19 :(得分:-1)
当我将 null 传递给 middleware
函数时发生在我身上
Route::middleware(null)->group(function () {
Route::get('/some-path', [SomeController::class, 'search']);
});
如果没有中间件,则传递 []
有效,或者如果不使用中间件,则可能只是删除 middleware
调用 :D