Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 目标类控制器不存在-Laravel 8_Php_Laravel_Laravel 8 - Fatal编程技术网

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中,确实会发生此错误
  • 在尝试了许多解决方案后,我得到了这些完美的解决方案。
  • 只需按照步骤操作
案例-1

我们可以在
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']);
    
    调用
    操作
    相关方法