Laravel에서 Route::resource를 사용할 때 조심하십시오.
소개
Laravel에서 라우팅 할 때 유용한 Route::resource
를 사용할 때주의 사항을 작성하십시오.
환경
Laravel 5.4
라우팅의 Route::resource 지정
Laravel에서는 다음과 같이 라우팅에 Route::resouce를 지정하여 CRUD 라우팅을 한 번에 수행할 수 있습니다. 다음이 공식 문서에 실려 있던 라우팅의 예와 대응표가 됩니다.
/routes/web.phpRoute::resource('photos', 'PhotoController');

또, 이하의 artisan 커멘드에 의해, 대응하는 콘트롤러와 메소드를 자동 생성해 줍니다.
$ php artisan make:controller PhotoController --resource
/app/Http/Controllers/PhotoController.php//コマンド入力で自動的に作成される
namespace App\Http\Controllers;
class PhotoController extends Controller
{
public function index()
{
//
}
public function create()
{
//
}
public function store(Request $request)
{
//
}
public function show($id)
{
//
}
public function edit($id)
{
//
}
public function update(Request $request, $id)
{
//
}
public function destroy($id)
{
//
}
}
모든 메소드는 사용하지 않는 경우
Route::resouce는 CRUD의 라우팅을 한 번에 할 수 있으므로 매우 편리합니다만, 이러한 메소드를 모두 사용하는 것은 별로 없다고 생각합니다. 빈 메소드를 준비해 두어도 좋지만, 가능하면 사용하지 않는 메소드는 지워 두고 싶은 것입니다. 예를 들어, 다음과 같은 라우팅을 했다고 가정합니다.
/routes/web.phpRoute::resource('hoge', 'HogeController');
이번 show, update 메소드를 사용하지 않는다고 해서, 이하와 같이 메소드 자체 지웠다고 합니다.
/app/Http/Controllers/HogeController.php//show、updateは削除する
namespace App\Http\Controllers;
class HogeController extends Controller
{
public function index()
{
//
}
public function create()
{
//
}
public function store(Request $request)
{
//
}
//showを削除
public function edit($id)
{
//
}
// updateを削除
public function destroy($id)
{
//
}
}
이 때 아래와 같이 브라우저의 URL 입력란에 직접 쓰면 예외가 나옵니다.


show 메소드가 없다고 합니다. show 메소드를 부른 기억은 없습니다만, 방금전의 resouces를 사용했을 때의 라우팅 일람표를 보면,/hoge/{임의의 캐릭터 라인} (을)를 직접 써(GET) 했을 경우는 show가 불려 버립니다.
라우팅 제한
따라서 show 라우팅을 삭제해야합니다. 리소스를 사용할 때 라우팅을 제한하는 방법에는 두 가지가 있습니다.
/routes/web.php// show、updateのルーティングを削除
// onlyを使う方法
Route::resource('hoge', 'HogeController', ['only' => ['index', 'create', 'edit', 'store', 'destroy']]);
// exceptを使う方法
Route::resource('hoge', 'HogeController', ['except' => ['show', 'update']]);
화이트리스트가 소스도 읽기 쉽다고 생각하기 때문에 개인적으로 only를 사용하는 것이 좋습니다.
이상으로, resouces를 사용했을 때에 URL을 직접 써졌을 경우에서도, 예외(Whoops)가 나오지 않게 되었습니다.
비고: 아무래도 Whoops를 내고 싶지 않은 경우
show 메소드를 부르지 않게 해, 이것으로 이제 괜찮을까 생각했고, 방금 전과는 다른 에러 화면이 발생했습니다.

이는 GET 요청(URL 직접 쓰기)을 허용하지 않는 URL에 GET으로 액세스하기 때문에 405 오류가 발생했습니다. 이 예외가 나오는 것은 의도하고 있는 움직임이므로, 주워하기로 했습니다.
Laravel의 예외는 아래와 같이/app/Exceptions/Handler.php에 기술해 주워 줍니다.
/app/Exceptions/Handler.php
use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
class Handler extends ExceptionHandler
{
public function render($request, Exception $excpetion)
{
if ($exceotion instanceof MethodNotAllowedHttpException) {
//ここに処理を書く
}
return parent::render($request, $exception);
}
}
이제 오류 화면이 더 이상 없습니다.
※이 방법은 코멘트에서도 받았듯이,MethodNotAllowedHttpException를 모두 잡아 잡기 때문에 주의해 주세요.
참고 URL
Laravel 5.4
라우팅의 Route::resource 지정
Laravel에서는 다음과 같이 라우팅에 Route::resouce를 지정하여 CRUD 라우팅을 한 번에 수행할 수 있습니다. 다음이 공식 문서에 실려 있던 라우팅의 예와 대응표가 됩니다.
/routes/web.phpRoute::resource('photos', 'PhotoController');

또, 이하의 artisan 커멘드에 의해, 대응하는 콘트롤러와 메소드를 자동 생성해 줍니다.
$ php artisan make:controller PhotoController --resource
/app/Http/Controllers/PhotoController.php//コマンド入力で自動的に作成される
namespace App\Http\Controllers;
class PhotoController extends Controller
{
public function index()
{
//
}
public function create()
{
//
}
public function store(Request $request)
{
//
}
public function show($id)
{
//
}
public function edit($id)
{
//
}
public function update(Request $request, $id)
{
//
}
public function destroy($id)
{
//
}
}
모든 메소드는 사용하지 않는 경우
Route::resouce는 CRUD의 라우팅을 한 번에 할 수 있으므로 매우 편리합니다만, 이러한 메소드를 모두 사용하는 것은 별로 없다고 생각합니다. 빈 메소드를 준비해 두어도 좋지만, 가능하면 사용하지 않는 메소드는 지워 두고 싶은 것입니다. 예를 들어, 다음과 같은 라우팅을 했다고 가정합니다.
/routes/web.phpRoute::resource('hoge', 'HogeController');
이번 show, update 메소드를 사용하지 않는다고 해서, 이하와 같이 메소드 자체 지웠다고 합니다.
/app/Http/Controllers/HogeController.php//show、updateは削除する
namespace App\Http\Controllers;
class HogeController extends Controller
{
public function index()
{
//
}
public function create()
{
//
}
public function store(Request $request)
{
//
}
//showを削除
public function edit($id)
{
//
}
// updateを削除
public function destroy($id)
{
//
}
}
이 때 아래와 같이 브라우저의 URL 입력란에 직접 쓰면 예외가 나옵니다.


show 메소드가 없다고 합니다. show 메소드를 부른 기억은 없습니다만, 방금전의 resouces를 사용했을 때의 라우팅 일람표를 보면,/hoge/{임의의 캐릭터 라인} (을)를 직접 써(GET) 했을 경우는 show가 불려 버립니다.
라우팅 제한
따라서 show 라우팅을 삭제해야합니다. 리소스를 사용할 때 라우팅을 제한하는 방법에는 두 가지가 있습니다.
/routes/web.php// show、updateのルーティングを削除
// onlyを使う方法
Route::resource('hoge', 'HogeController', ['only' => ['index', 'create', 'edit', 'store', 'destroy']]);
// exceptを使う方法
Route::resource('hoge', 'HogeController', ['except' => ['show', 'update']]);
화이트리스트가 소스도 읽기 쉽다고 생각하기 때문에 개인적으로 only를 사용하는 것이 좋습니다.
이상으로, resouces를 사용했을 때에 URL을 직접 써졌을 경우에서도, 예외(Whoops)가 나오지 않게 되었습니다.
비고: 아무래도 Whoops를 내고 싶지 않은 경우
show 메소드를 부르지 않게 해, 이것으로 이제 괜찮을까 생각했고, 방금 전과는 다른 에러 화면이 발생했습니다.

이는 GET 요청(URL 직접 쓰기)을 허용하지 않는 URL에 GET으로 액세스하기 때문에 405 오류가 발생했습니다. 이 예외가 나오는 것은 의도하고 있는 움직임이므로, 주워하기로 했습니다.
Laravel의 예외는 아래와 같이/app/Exceptions/Handler.php에 기술해 주워 줍니다.
/app/Exceptions/Handler.php
use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
class Handler extends ExceptionHandler
{
public function render($request, Exception $excpetion)
{
if ($exceotion instanceof MethodNotAllowedHttpException) {
//ここに処理を書く
}
return parent::render($request, $exception);
}
}
이제 오류 화면이 더 이상 없습니다.
※이 방법은 코멘트에서도 받았듯이,MethodNotAllowedHttpException를 모두 잡아 잡기 때문에 주의해 주세요.
참고 URL
Route::resource('photos', 'PhotoController');
$ php artisan make:controller PhotoController --resource
//コマンド入力で自動的に作成される
namespace App\Http\Controllers;
class PhotoController extends Controller
{
public function index()
{
//
}
public function create()
{
//
}
public function store(Request $request)
{
//
}
public function show($id)
{
//
}
public function edit($id)
{
//
}
public function update(Request $request, $id)
{
//
}
public function destroy($id)
{
//
}
}
Route::resouce는 CRUD의 라우팅을 한 번에 할 수 있으므로 매우 편리합니다만, 이러한 메소드를 모두 사용하는 것은 별로 없다고 생각합니다. 빈 메소드를 준비해 두어도 좋지만, 가능하면 사용하지 않는 메소드는 지워 두고 싶은 것입니다. 예를 들어, 다음과 같은 라우팅을 했다고 가정합니다.
/routes/web.php
Route::resource('hoge', 'HogeController');
이번 show, update 메소드를 사용하지 않는다고 해서, 이하와 같이 메소드 자체 지웠다고 합니다.
/app/Http/Controllers/HogeController.php
//show、updateは削除する
namespace App\Http\Controllers;
class HogeController extends Controller
{
public function index()
{
//
}
public function create()
{
//
}
public function store(Request $request)
{
//
}
//showを削除
public function edit($id)
{
//
}
// updateを削除
public function destroy($id)
{
//
}
}
이 때 아래와 같이 브라우저의 URL 입력란에 직접 쓰면 예외가 나옵니다.


show 메소드가 없다고 합니다. show 메소드를 부른 기억은 없습니다만, 방금전의 resouces를 사용했을 때의 라우팅 일람표를 보면,/hoge/{임의의 캐릭터 라인} (을)를 직접 써(GET) 했을 경우는 show가 불려 버립니다.
라우팅 제한
따라서 show 라우팅을 삭제해야합니다. 리소스를 사용할 때 라우팅을 제한하는 방법에는 두 가지가 있습니다.
/routes/web.php
// show、updateのルーティングを削除
// onlyを使う方法
Route::resource('hoge', 'HogeController', ['only' => ['index', 'create', 'edit', 'store', 'destroy']]);
// exceptを使う方法
Route::resource('hoge', 'HogeController', ['except' => ['show', 'update']]);
화이트리스트가 소스도 읽기 쉽다고 생각하기 때문에 개인적으로 only를 사용하는 것이 좋습니다.
이상으로, resouces를 사용했을 때에 URL을 직접 써졌을 경우에서도, 예외(Whoops)가 나오지 않게 되었습니다.
비고: 아무래도 Whoops를 내고 싶지 않은 경우
show 메소드를 부르지 않게 해, 이것으로 이제 괜찮을까 생각했고, 방금 전과는 다른 에러 화면이 발생했습니다.

이는 GET 요청(URL 직접 쓰기)을 허용하지 않는 URL에 GET으로 액세스하기 때문에 405 오류가 발생했습니다. 이 예외가 나오는 것은 의도하고 있는 움직임이므로, 주워하기로 했습니다.
Laravel의 예외는 아래와 같이/app/Exceptions/Handler.php에 기술해 주워 줍니다.
/app/Exceptions/Handler.php
use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
class Handler extends ExceptionHandler
{
public function render($request, Exception $excpetion)
{
if ($exceotion instanceof MethodNotAllowedHttpException) {
//ここに処理を書く
}
return parent::render($request, $exception);
}
}
이제 오류 화면이 더 이상 없습니다.
※이 방법은 코멘트에서도 받았듯이,MethodNotAllowedHttpException를 모두 잡아 잡기 때문에 주의해 주세요.
참고 URL
Reference
이 문제에 관하여(Laravel에서 Route::resource를 사용할 때 조심하십시오.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/sympe/items/9297f41d5f7a9d91aa11텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)