라 라벨-Route :: resource vs Route :: controller


138

나는 Laravel 웹 사이트, 스택 오버플로에 문서를 읽고, 구글하지만 여전히 차이 이해가 안 Route::resourceRoute::controller.

답변 중 하나는 Route :: resource가 crud를위한 것이라고 말했습니다. 그러나 Route :: controller를 사용하면 Route :: resource와 동일한 작업을 수행 할 수 있으며 필요한 작업 만 지정할 수 있습니다.

그들은 형제처럼 보입니다.

Route::controller('post','PostController');
Route::resource('post','PostController');

사용할 것을 어떻게 선택할 수 있습니까? 좋은 습관은 무엇입니까?


12
Laravel 5.2 사용자를위한 참고 사항으로, 암시 적 컨트롤러는 더 이상 사용되지 않습니다.
Roy

답변:


283

RESTful 리소스 컨트롤러

편안하고 자원 컨트롤러 하면, 심지어 이름 그들에 대한 몇 가지 기본 경로 설정합니다.

Route::resource('users', 'UsersController');

다음과 같은 명명 된 경로를 제공합니다.

Verb          Path                        Action  Route Name
GET           /users                      index   users.index
GET           /users/create               create  users.create
POST          /users                      store   users.store
GET           /users/{user}               show    users.show
GET           /users/{user}/edit          edit    users.edit
PUT|PATCH     /users/{user}               update  users.update
DELETE        /users/{user}               destroy users.destroy

그리고 당신은 이런 식으로 컨트롤러를 설정할 것입니다 (actions = methods)

class UsersController extends BaseController {

    public function index() {}

    public function show($id) {}

    public function store() {}

}

다음과 같이 포함하거나 제외 할 작업을 선택할 수도 있습니다.

Route::resource('users', 'UsersController', [
    'only' => ['index', 'show']
]);

Route::resource('monkeys', 'MonkeysController', [
    'except' => ['edit', 'create']
]);

RESTful 리소스 컨트롤러 설명서


암시 적 컨트롤러

암시 제어기는 더 유연하다. HTTP 요청 유형 및 이름을 기반으로 컨트롤러 메소드로 라우팅됩니다. 그러나 경로 이름이 정의되어 있지 않으며 동일한 경로에 대한 모든 하위 폴더를 잡습니다.

Route::controller('users', 'UserController');

일종의 RESTful 명명 체계를 사용하여 컨트롤러를 설정하도록 안내합니다.

class UserController extends BaseController {

    public function getIndex()
    {
        // GET request to index
    }

    public function getShow($id)
    {
        // get request to 'users/show/{id}'
    }

    public function postStore()
    {
        // POST request to 'users/store'
    }

}

암시 적 컨트롤러 설명서


선호도에 따라 필요한 것을 사용하는 것이 좋습니다. 나는 개인적으로 암시 적 컨트롤러를 좋아하지 않습니다 . 왜냐하면 컨트롤러 가 지저분하고 이름을 제공하지 않으며 사용할 때 혼란 스러울 수 있기 때문 php artisan routes입니다. 일반적으로 RESTful 리소스 컨트롤러 를 명시 적 라우트와 함께 사용 합니다.


1
우리가 여러 개의 리소스 라우트 (인덱스, 쇼)를 사용한다면 왜 static route Route :: get (...)을 사용하지 않습니까? array ( 'only'=> array ( 'index', 'show')를 사용하는 것보다 나쁘지 않다고 생각합니다 .'user / 123 '과 같은 것을 요청할 때 RESTFull 컨트롤러에 사용 된 메소드는 getIndex () 작동합니다. 'user /'이지만 user / 123에서는 NotFoundHttpException 오류가 발생합니다 (getView 및 다른 이름을 시도했지만 Controller @ getView로 선언 할 때만 작동 함)
Sonique

누군가 'resource.edit'의 용도를 명확히 할 수 있습니까? GET 방법이므로 'resource.show'를 통한 제한된 정보가 아니라 리소스에 대한 전체 정보가 있어야한다고 가정합니다.
Anthony

1
@Anthony- resource.edit기본적으로 기존 리소스를 편집하기위한 양식 인 편집보기를 표시합니다.
ryanwinchester

@ fungku 흥미 롭습니다. resource.edit가 실제로 JSON 대신 HTML을 반환한다고 말하는 것입니까?
Anthony

2
@Anthony 일반적으로 (그리고 내가 아는 한) 그렇습니다. resource.editresource.createHTML 양식과 뷰를 렌더링 ... UI를 위해 일반적이다. 그 형태는 / POST에 둘 것입니다 resource.updateresource.store각각. 그렇게하지 않으면 무시하고 컨트롤러에서 edit () 및 create () 메소드를 제거하십시오.
ryanwinchester

3

경로 컨트롤러 방법의 경우 하나의 경로 만 정의하면됩니다. get 또는 post 메소드에서 경로를 별도로 정의해야합니다.

그리고 resources 메소드는 다양한 쉼표 작업을 처리하기 위해 여러 경로를 만드는 데 사용됩니다.

여기에 대한 라 라벨 문서 .

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