대상 클래스 컨트롤러가 없습니다-Laravel 8


111

내 컨트롤러는 다음과 같습니다.

<?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');

SO에 오신 것을 환영합니다 .. Api폴더 안에 컨트롤러가 있습니다 .?
Kamlesh Paul

당신은 클래스를 생성해야 composer dump-autoload하거나에서 RegisterController누락 된 네임 스페이스.
sta


다음 시도composer dump-autoload
Kamlesh 폴

터미널에 입력 만하나요?
Nguyễn Việt Dũng

답변:


210

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)
...

2
이것은 정말로 나를 미치게 만들었다. $ namespace 변수 위의 주석은 "지정된 경우이 네임 스페이스가 컨트롤러 경로에 자동으로 적용됩니다."라고 말합니다. 글쎄요. 지적한대로-> namespace ( 'App \ Http \ Controllers')를 추가해야합니다. 그들은 정말 ... 소스 코드에서 주석을 변경해야합니다
shock_gone_wild

@shock_gone_wild 그 댓글과 속성은 약 25 분 전에 Provider에서 제거되었으므로 다음 패치 버전에서는 laravel/laravel사라질 것입니다.
lagbox

1
수정 사항이 변경된 이유는 무엇입니까? 성능 향상을 위해?
CodeGuru

이 답변의 비디오 버전 (5 분) youtu.be/MfE1tnMG6fE
Wibisono Indrawan

1
@WesleySmith 현재 8.0.2에서 laravel/laravel원하는 경우 주석을 제거하고 사용할 수 있습니다.
lagbox

18
  • 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)그림과 같이 줄 을 추가 한 후 ..
    여기에 이미지 설명 입력

1
그것은 나를 위해 일하고 있습니다.
Shrikant Pardhi

@ShrikantPardhi 감사합니다. 정말이 대답 : 당신을 도움이 있다면 찬성 투표하십시오
Rohit Tagadiya

9

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'));
        });
}

6

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

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

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

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

5

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';


2

laravel 8을 사용하는 경우

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

use App\Http\Controllers\UserController;

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

1

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

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

감사


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'));
    });
}


0

이 경로를 그룹화하려는 경우 다음과 같이 할 수 있습니다.

Route::group(['namespace' => 'App\Http\Controllers\Api'], function () {
    Route::resource('user', 'UserController');
    Route::resource('book', 'BookController');
});


0

laravel 8에서 경로를 정의하는 방법은 다음 중 하나입니다.

use App\Http\Controllers\HomeController;

// Using PHP callable syntax...
Route::get('/', [HomeController::class, 'index']);

또는

// Using string syntax...
Route::get('/', 'App\Http\Controllers\HomeController@index');

리소스 경로는

Route::resource('/', HomeController::class);

즉, laravel 8에는 기본적으로 자동 컨트롤러 선언 접두사가 없습니다.

이전 방식을 고수하려면 app\Providers\RouteServiceProvider.php(이 속성은 이전 버전에 있음)에 네임 스페이스 속성을 추가 하고 route 메서드에서 활성화해야합니다. 아래 이미지 지침을 따르십시오. 여기에 이미지 설명 입력


-1

RouteServiceProvider(존재하지 않는 경우 추가) 에서 줄 아래의 주석을 제거하십시오.

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

-1

Laravel 8에서는 경로 지정 방식이 변경되었습니다.

Route::resource('homes', HomeController::class)->names('home.index');

-1

이 오류가 발생했습니다

(Illuminate \ Contracts \ Container \ BindingResolutionException 대상 클래스 [App \ Http \ Controllers \ ControllerFileName]이 존재하지 않습니다.

해결책 : 클래스 이름을 확인하십시오. 파일 이름과 정확히 일치해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.