Laravel - Tuyến :: resource vs Route :: bộ điều khiển


138

Tôi đã đọc các tài liệu trên trang web của Laravel, Stack Overflow và Google nhưng vẫn không hiểu sự khác biệt giữa Route::resourceRoute::controller.

Một trong những câu trả lời cho biết Route :: resource là dành cho crud. Tuy nhiên, với bộ điều khiển Route :: chúng ta có thể thực hiện điều tương tự như với tài nguyên Route :: và chúng ta chỉ có thể chỉ định các hành động cần thiết.

Họ có vẻ giống như anh em ruột thịt:

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

Làm thế nào chúng ta có thể chọn những gì để sử dụng? Thực hành tốt là gì?


12
Chỉ cần một lưu ý cho người dùng Laravel 5.2, trong khi đó bộ điều khiển ngầm bị phản đối.
Roy

Câu trả lời:


281

Bộ điều khiển tài nguyên RESTful

Bộ điều khiển tài nguyên RESTful thiết lập một số tuyến mặc định cho bạn và thậm chí đặt tên cho chúng.

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

Cung cấp cho bạn các tuyến đường được đặt tên này:

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

Và bạn sẽ thiết lập bộ điều khiển của mình một cái gì đó như thế này (hành động = phương thức)

class UsersController extends BaseController {

    public function index() {}

    public function show($id) {}

    public function store() {}

}

Bạn cũng có thể chọn những hành động được bao gồm hoặc loại trừ như thế này:

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

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

Tài liệu điều khiển tài nguyên RESTful


Bộ điều khiển ngầm

Một bộ điều khiển ngầm là linh hoạt hơn. Bạn được định tuyến đến các phương thức điều khiển của mình dựa trên tên và loại yêu cầu HTTP. Tuy nhiên, bạn không có tên tuyến đường được xác định cho bạn và nó sẽ bắt tất cả các thư mục con cho cùng một tuyến đường.

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

Sẽ dẫn bạn thiết lập bộ điều khiển với sơ đồ đặt tên 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'
    }

}

Tài liệu điều khiển ngầm


Đó là thực hành tốt để sử dụng những gì bạn cần, theo sở thích của bạn. Cá nhân tôi không thích các bộ điều khiển tiềm ẩn , vì chúng có thể lộn xộn, không cung cấp tên và có thể gây nhầm lẫn khi sử dụng php artisan routes. Tôi thường sử dụng bộ điều khiển RESTful Resource kết hợp với các tuyến rõ ràng.


1
Nếu chúng tôi sử dụng một số tuyến Tài nguyên (có thể là chỉ mục, hiển thị) tại sao không sử dụng các tuyến tĩnh Route :: get (...)? Tôi nghĩ không tốt hơn không tệ hơn là sử dụng mảng ('only' => mảng ('index', 'show'). Và phương thức nào được sử dụng cho bộ điều khiển RESTFull khi chúng tôi yêu cầu một cái gì đó như 'user / 123', getIndex () hoạt động cho 'user /' nhưng với user / 123 tôi gặp lỗi NotFoundHttpException (đã thử các tên khác nhau getView và các tên khác, chỉ hoạt động khi khai báo là Trình điều khiển @ getView)?
Sonique

Ai đó có thể làm rõ 'resource.edit' được dùng cho mục đích gì không? Đây là một phương thức GET, vì vậy tôi cho rằng nó được cho là có đầy đủ thông tin về một tài nguyên, thay vì chỉ là thông tin hạn chế thông qua 'resource.show'?
Anthony

1
@Anthony - resource.editlà để hiển thị Chế độ xem chỉnh sửa, về cơ bản, biểu mẫu để chỉnh sửa tài nguyên hiện có.
ryanwinchester

@fungku Điều đó thật thú vị .. vậy bạn có nói rằng resource.edit thực sự sẽ trả về HTML thay vì JSON không?
Anthony

2
@Anthony Nói chung, (và theo như tôi biết) có. resource.editresource.createthường dành cho UI ... hiển thị chế độ xem bằng các biểu mẫu HTML. Những hình thức sẽ PUT / POST đến resource.updateresource.storetương ứng. Nếu bạn không làm điều đó, thì bạn có thể bỏ qua chúng và loại bỏ các phương thức edit () và tạo () trong bộ điều khiển của bạn.
ryanwinchester

3

Đối với phương pháp điều khiển tuyến đường, chúng ta phải xác định chỉ một tuyến đường. Trong phương thức get hoặc post chúng ta phải xác định tuyến đường riêng.

Và phương thức tài nguyên được sử dụng để tạo nhiều tuyến để xử lý nhiều hành động Restful khác nhau.

Dưới đây là tài liệu của Laravel về điều này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.