내 컨트롤러는 다음과 같습니다.
<?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
Postman을 사용하여 경로를 쳤을 때 다음과 같은 오류가 발생했습니다.
대상 클래스 [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을 생성하기위한 네임 스페이스 접두사를 추가하기위한 것입니다. 따라서이 변수를 설정할 수 있지만 그 자체로는 이러한 네임 스페이스 접두사를 추가하지 않습니다. 라우팅 그룹에 네임 스페이스를 추가 할 때이 변수를 사용하고 있는지 확인해야합니다.
이 정보는 현재 업그레이드 가이드에 있습니다.
업그레이드 가이드가 보여주는 중요한 부분은 경로 그룹에 네임 스페이스를 정의한다는 것입니다. $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
답변
에 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'
]);
});
감사