Php 目标类控制器不存在-Laravel 8
这是我的控制器:Php 目标类控制器不存在-Laravel 8,php,laravel,laravel-8,Php,Laravel,Laravel 8,这是我的控制器: <?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'); } } R
<?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');
}
}
Route::get('register', 'Api\RegisterController@register');
当我使用邮递员点击我的注册
路线时,它给了我以下错误:
目标类[Api\RegisterController]不存在
更新:
<?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');
}
}
Route::get('register', 'Api\RegisterController@register');
多亏了这个答案,我才把它修好了。我决定对这个路由使用完全限定的类名,但是还有其他选项,如答案中所述
Route::get('register', 'App\Http\Controllers\Api\RegisterController@register');
您正在使用Laravel 8。在新安装的Laravel 8中,没有将名称空间前缀应用于路由加载到的路由组 “在Laravel的早期版本中,
RouteServiceProvider
包含一个$namespace
属性。此属性的值将自动作为前缀添加到控制器路由定义和对action
helper/URL::action
方法的调用中。在Laravel8.x中,此属性默认为null
。这意味着Laravel不会自动进行名称空间前缀。”
在路由中引用控制器时,如果不使用名称空间前缀,则必须使用控制器的完全限定类名
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($this->namespace)
...
如果要继续使用原始的自动前缀控制器路由,只需在RouteServiceProvider中设置$namespace属性的值,并在boot方法中更新路由注册以使用$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中,默认删除名称空间前缀,以便可以在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'));
});
}
- 是的,在laravel 8中,确实会发生此错误
- 在尝试了许多解决方案后,我得到了这些完美的解决方案。
- 只需按照步骤操作
api.php
和web.php
文件中进行更改,如下所示。当前我们编写
语法的方式是
Route::get('login', 'LoginController@login');
应改为:
Route::get('login', [LoginController::class, 'login']);
Route::get('register', [RegisterController::class, 'register']);
案例-2
首先转到文件:app>Providers>RouteServiceProvider.php
在该文件中,替换行
受保护的$namespace=null;
带有受保护的$namespace='App\Http\Controllers';
然后添加行->namespace($this->namespace)
,如图所示。
laravel 8更新了RouteServiceProvider,它会使用字符串语法影响路由,您可以如上所述进行更改,但建议使用操作语法,而不是使用字符串语法路由:
Route::get('register', 'Api\RegisterController@register');
应改为:
Route::get('login', [LoginController::class, 'login']);
Route::get('register', [RegisterController::class, 'register']);
在laravel-8中,您可以这样使用
Route::group(['namespace'=>'App\Http\Controllers', 'prefix'=>'admin',
'as'=>'admin.','middleware'=>['auth:sanctum', 'verified']], function()
{
Route::resource('/dashboard', 'DashboardController')->only([
'index'
]);
});
谢谢只需取消对RouteServiceProvider
行下的注释(如果不存在,则添加)
如果您使用的是laravel 8
只需复制并粘贴我的代码
use App\Http\Controllers\UserController;
Route::get('/user', [UserController::class, 'index']);
在Laravel 8中,指定路线的方式发生了变化:
Route::resource('homes', HomeController::class)->names('home.index');
对于解决方案,只需取消注释第29行:
**protected $namespace = 'App\\Http\\Controllers';**
在“app\Providers\RouteServiceProvider.php”文件中
我犯了这个错误
(Illumb\Contracts\Container\BindingResolutionException
目标类[App\Http\Controllers\ControllerFileName]不存在
解决方案:
只需检查您的类名,它应该与您的文件名完全相同。如果您喜欢将此路由分组,您可以执行以下操作:
Route::group(['namespace' => 'App\Http\Controllers\Api'], function () {
Route::resource('user', 'UserController');
Route::resource('book', 'BookController');
});
在Laravel8中,您只需在routes\web.php中添加控制器名称空间
使用App\Http\Controllers\InvoiceController;//InvoiceController是控制器名Route::get('invoice',[InvoiceController::class,'index']);
或
转到`app\Providers\RouteServiceProvider.php`路径并删除注释
protected$namespace='App\\Http\\Controllers';
在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
并在routes方法中激活。
按照以下图像说明操作:
在新安装的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升级到8,则可能需要隐式添加
受保护的$namespace='App\Http\Controllers'
在RouteServices.php文件中,它将以旧的方式运行。在本期中,
我只是像下面那样添加名称空间
它是有效的
事实上,这个问题的答案比这里的任何答案都要简洁明了:
路由命名空间更新
在Laravel的早期版本中,RouteServiceProvider
包含一个$namespace
属性。此属性的值将自动作为前缀添加到控制器路由定义和对操作
helper/URL::action
方法的调用中。在Laravel 8.x中,此属性默认为null
。这意味着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']);
调用操作
相关方法