[php] 대상 클래스 컨트롤러가 없습니다-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');
    }
}

스크린 샷에서 볼 수 있듯이 클래스가 존재하고 올바른 위치에 있습니다.

여기에 이미지 설명 입력

api.php경로 :

Route::get('register', 'Api\RegisterController@register');

registerPostman을 사용하여 경로를 쳤을 때 다음과 같은 오류가 발생했습니다.

대상 클래스 [Api \ RegisterController]가 없습니다.


최신 정보:

답 덕분에 고칠 수있었습니다. 이 경로에 정규화 된 클래스 이름을 사용하기로 결정했지만 답변에 설명 된 다른 옵션이 있습니다.

Route::get('register', 'App\Http\Controllers\Api\RegisterController@register');



답변

Laravel 8을 사용하고 있습니다. Laravel 8을 새로 설치하면 경로가로드되는 경로 그룹에 적용되는 네임 스페이스 접두사가 없습니다.

“이전 Laravel 릴리스에서는에 속성이 RouteServiceProvider포함 $namespace되었습니다.이 속성의 값은 컨트롤러 경로 정의 및 action도우미 / URL::action메서드 호출에 자동으로 접두사로 추가 됩니다. Laravel 8.x에서이 속성은 null기본적으로 사용됩니다. 즉, 자동 네임 스페이스 접두사가 없습니다. 라 라벨이 할 것입니다. ” Laravel 8.x 문서-릴리스 노트

네임 스페이스 접두사를 사용하지 않을 때 경로에서 컨트롤러를 참조 할 때 컨트롤러에 대해 정규화 된 클래스 이름을 사용해야합니다.

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있고 여기에 주석을 달아도 RouteServiceProvider경로에 영향을 미치지 않습니다. 현재 작업에 URL을 생성하기위한 네임 스페이스 접두사를 추가하기위한 것입니다. 따라서이 변수를 설정할 수 있지만 그 자체로는 이러한 네임 스페이스 접두사를 추가하지 않습니다. 라우팅 그룹에 네임 스페이스를 추가 할 때이 변수를 사용하고 있는지 확인해야합니다.

이 정보는 현재 업그레이드 가이드에 있습니다.

Laravel 8.x 문서-업그레이드 가이드-라우팅

업그레이드 가이드가 보여주는 중요한 부분은 경로 그룹에 네임 스페이스를 정의한다는 것입니다. $namespace변수 설정하면 작업에 대한 URL을 생성하는 데 도움이됩니다.

다시 한 번 강조 할 수는 없습니다. 중요한 부분은 경로 그룹에 대한 네임 스페이스를 설정하는 것입니다.이 작업 $namespace은 예제에서 직접 멤버 변수를 참조하여 수행됩니다 .

최신 정보:

버전 8.0.2 이후 Laravel 8의 새 복사본을 설치 한 경우 laravel/laravel에서 protected $namespace멤버 변수의 주석 처리를 제거 RouteServiceProvider하여 이전 방식으로 돌아갈 수 있습니다. 라우트 그룹이 그룹의 네임 스페이스에이 멤버 변수를 사용하도록 설정되어 있기 때문입니다.

// protected $namespace = 'App\\Http\\Controllers';

유일한 경로 그룹이 설치 네임 스페이스로이 변수를 사용하기 때문에 경로에 할당 된 컨트롤러에 네임 스페이스 접두사를 추가 이유의 주석이다 :

...
->namespace($this->namespace)
...


답변

  • laravel 8에서는 이 오류가 발생합니다 ..
  • 많은 솔루션을 시도한 후 완벽한 솔루션을 얻었습니다.
  • 단계를 따르십시오 …

사례-1

우리는 변화 할 수 api.php와에 web.php.. 다음과 같은 파일을
현재의 방법은 우리의 쓰기 syntax입니다

Route::get('login', 'LoginController@login');

변경되어야합니다

Route::get('login', [LoginController::class, 'login']);

사례-2

  1. 먼저 파일로 이동하십시오. app > Providers > RouteServiceProvider.php
  2. 해당 파일에서 줄
    protected $namespace = null;protected $namespace = 'App\Http\Controllers'; 여기에 이미지 설명 입력
  3. 그런 다음 ->namespace($this->namespace)그림과 같이 줄 을 추가 한 후 ..
    여기에 이미지 설명 입력


답변

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은 RouteServiceProvider를 업데이트했으며 문자열 구문으로 경로에 영향을 미칩니다. 위와 같이 변경할 수 있지만 문자열 구문으로 경로를 사용하지 않고 작업 구문을 사용하는 것이 좋습니다.

Route::get('register', 'Api\RegisterController@register');

다음으로 변경해야합니다.

Route::get('register', [RegisterController::class, 'register']);


답변

laravel 8에서는 route \ 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';


답변

laravel 8을 사용하는 경우

내 코드를 복사하여 붙여 넣기 만하면됩니다.

use App\Http\Controllers\UserController;

Route::get('/user', [UserController::class, 'index']);


답변

laravel-8에서는 다음과 같이 사용할 수 있습니다.

 Route::group(['namespace'=>'App\Http\Controllers', 'prefix'=>'admin',
 'as'=>'admin.','middleware'=>['auth:sanctum', 'verified']], function()
{
    Route::resource('/dashboard', 'DashboardController')->only([
        'index'
    ]);
});

감사