2013-08-23 25 views
15

Vì vậy, tôi mới làm quen với khung công tác Laravel như của v4 và tự hỏi cách tạo và sử dụng các bộ điều khiển RESTful là gì. Đọc qua tài liệu, tôi hơi bối rối về sự khác biệt giữa các bộ điều khiển RESTful và bộ điều khiển tài nguyên.Laravel 4 định nghĩa các bộ điều khiển RESTful

Khi xác định một bộ điều khiển RESTful, theo các tài liệu, nó gợi ý cách làm như sau trong routes.php:

Route::controller('posts', 'PostController'); 

Trong PostController, làm chúng ta định nghĩa các phương thức lớp bằng cách đặt trước tên của phương pháp này với HTTP động từ chúng ta nên sử dụng? Ví dụ:

class PostController extends \BaseController { 
    public function getIndex() 
    { 
     // 
    } 
} 

Tuy nhiên, nó cũng vạch ra một cách để tạo ra bộ điều khiển tài nguyên trong file routes.php như vậy: Route :: nguồn ('bài', 'PostController');

Và trong PostController.php, chúng tôi xác định các phương thức mà không cần thêm tiền tố bằng động từ HTTP.

class PostController extends \BaseController { 
    public function index() 
    { 
     // 
    } 
} 

Sự khác biệt giữa hai loại là gì? Và khi nào chúng ta sử dụng cái thay vì cái kia, và tại sao?

Ngoài ra, chúng ta nên sử dụng Route::controller('posts', 'PostController'); hoặc Route::resource('posts', 'PostController'); để vượt qua định tuyến với bộ điều khiển hoặc chúng ta nên xác định từng tuyến đường bằng tay, như dưới đây:

Route::get('/users', '[email protected]'); 
Route::get('/users/create', '[email protected]'); 
Route::post('/users', '[email protected]'); 
Route::get('/users/{id}', '[email protected]'); 
Route::get('/users{id}/edit', '[email protected]'); 
Route::put('/users', '[email protected]'); 
Route::delete('/users', '[email protected]'); 
+0

Sau này, Định tuyến :: tài nguyên, theo tài liệu - trừ khi bạn cần kiểm soát nhiều hơn. :) –

+0

Vì vậy, bằng cách sử dụng 'Route :: controller ('posts', 'PostController');' không nên được sử dụng để tạo các bộ điều khiển RESTful? Chúng ta không nên tiền tố các phương thức điều khiển với động từ HTTP thích hợp? Tôi nhận ra câu hỏi cuối cùng có lẽ không phù hợp với định dạng này vì nó là chủ quan. – Iain

Trả lời

34

Hãy điều khiển này làm ví dụ:

<?php 

class TestController extends BaseController { 

    public function getIndex() 
    { 
     echo "a"; 
    } 

    public function postSecond($a) 
    { 
     echo "b"; 
    } 

} 

Trong tuyến đường của bạn, nếu bạn có

Route::controller('tests', 'TestController'); 

Và thực thi e

php artisan routes 

Bạn sẽ có:

+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+ 
| Domain | URI          | Name     | Action       | Before Filters | After Filters | 
+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+ 
|  | GET /tests/index/{v1}/{v2}/{v3}/{v4}/{v5} |      | [email protected]   |    |    | 
|  | GET /tests         |      | [email protected]   |    |    | 
|  | POST /tests        | tests.store   | [email protected]    |    |    | 
|  | GET /tests/{_missing}      |      | [email protected]  |    |    | 
+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+ 

Laravel kiểm tra bộ điều khiển và tạo đường khác dựa trên những gì các phương pháp mà nó tìm thấy, tự động.

Nhưng nếu bạn làm

Route::resource('tests', 'TestController'); 

Bạn sẽ nhận được danh sách tuyến đường này:

+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+ 
| Domain | URI          | Name     | Action       | Before Filters | After Filters | 
+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+ 
|  | GET /tests         |      | Closure       |    |    | 
|  | GET /tests         | tests.index   | [email protected]    |    |    | 
|  | GET /tests/create       | tests.create   | [email protected]    |    |    | 
|  | POST /tests        | tests.store   | [email protected]    |    |    | 
|  | GET /tests/{tests}       | tests.show    | [email protected]    |    |    | 
|  | GET /tests/{tests}/edit     | tests.edit    | [email protected]    |    |    | 
|  | PUT /tests/{tests}       | tests.update   | [email protected]    |    |    | 
|  | PATCH /tests/{tests}      |      | [email protected]    |    |    | 
|  | DELETE /tests/{tests}      | tests.destroy   | [email protected]   |    |    | 
+--------+--------------------------------------------+------------------------+-----------------------------------+----------------+---------------+ 

Không đoán, Laravel sử dụng một danh sách CRUD được xác định trước của tuyến đường, bạn có thể loại bỏ một số những tuyến đường nhưng nó sẽ không kiểm tra bộ điều khiển của bạn để xây dựng các tuyến đường cho các phương pháp của bạn.

Bạn quyết định điều gì là tốt nhất cho mình. Nhưng, thông thường, nếu bộ điều khiển của bạn là một CRUD, Route :: resource() là một khởi đầu tốt, bạn có thể sử dụng Route :: controller() hoặc xây dựng các tuyến đường của bạn bằng tay.

CHỈNH SỬA:

Không thực sự lý do tại sao một lý do khác, chỉ là vấn đề thiết kế và lựa chọn. Một số sẽ không sử dụng chúng trong số đó. Nó chỉ là mũ Route::resource() theo cách Rails định tuyến: http://guides.rubyonrails.org/routing.html.

Sử dụng Route::resource() bạn không cần phải tạo ra tất cả các phương pháp đó, nhưng bạn sẽ kết thúc với một danh sách các tuyến đường vô nghĩa, bởi vì Laravel luôn tạo tất cả chúng theo mặc định, trừ khi bạn làm:

Route::resource('photo', 'PhotoController', 
       array('only' => array('index', 'show'))); 

Và danh sách các tuyến đường của bạn sẽ chỉ hiển thị chỉ mục và hiển thị các hành động.

Ngoài ra, nếu bạn cần một số tuyến đường khác, sử dụng Route::resource() bạn sẽ phải xây dựng chúng theo cách thủ công hoặc làm việc một số phép thuật để làm cho chúng tự động cho tất cả các tuyến đường tháo vát của bạn. Sử dụng Route::controller() mọi thứ đều tự động, mỗi khi bạn thêm phương thức mới, tuyến đường mới sẽ được tạo cho bạn.

Một lần nữa, nếu bạn có bộ điều khiển CRUD để xây dựng, hãy bắt đầu bằng cách sử dụng Route::resource(). Nếu không, hãy suy nghĩ về lợi ích của việc này hay cách khác trong trường hợp cụ thể của bạn.

EDIT2:

Đây là một bài viết tuyệt vời, từ Phil Sturgeon (PyroCMS và PHP-FIG), về lợi ích của tay xây dựng tất cả các tuyến đường của bạn: http://philsturgeon.co.uk/blog/2013/07/beware-the-route-to-evil.

+0

Tôi không chắc lắm, tôi hiểu câu trả lời của bạn. Tại sao tôi sẽ sử dụng 'Route :: controller' thay vì' Route :: resource' nếu cả hai đều đạt được điều tương tự? 'Route :: controller' có vẻ giống như một quá trình phức tạp hơn để thiết lập một bộ điều khiển RESTful vì nó yêu cầu phá vỡ quy ước và tiền tố các phương thức điều khiển với động từ HTTP. Có lý do nào để sử dụng nó trên 'Route :: resource' không? Nếu tôi sử dụng 'Route :: resource', tôi không cần phải có các phương thức điều khiển để lập chỉ mục, tạo, lưu trữ, hiển thị, chỉnh sửa, cập nhật và hủy bỏ không? Thêm hoặc loại bỏ các phương pháp này sẽ phản ánh trong các tuyến đường có sẵn? – Iain

+0

Chỉ cần chỉnh sửa để làm rõ. –

+3

Chỉnh sửa khác, chỉ để thêm liên kết vào bài viết. –

5

@ Câu trả lời của Antonio rất tốt. Hãy để tôi nói điều gì đó tương tự và quan trọng hơn một chút ngắn gọn. Trong routes.php:

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

Sử dụng phương pháp tài nguyên làm cho Laravel giả chức năng CRUD và nó chỉ tìm kiếm sáu, phương pháp chế tạo trước CRUD của nó: chỉ số, tạo, lưu trữ, hiển thị, phá hủy, vv Nó giành được' t "xem" bất kỳ phương pháp mới nào khác mà bạn tạo ở đó.

Route::controller('info', 'InfoController'); 

Sử dụng phương pháp điều khiển cho phép bạn tạo các phương pháp tùy chỉnh/trang. Laravel tìm kiếm chúng khi bạn thêm tên phương thức/trang bằng một động từ HTTP. Trong XxxxController.php của bạn:

class InfoController extends \BaseController { 

    public function getFeatures() 
    { 
     return View::make('info.features'); 
    } 

    public function getContactUs() 
    { 
     return View::make('info.contact-us'); 
    } 

    public function getPricing() 
    { 
     return View::make('info.pricing'); 
    } 

} 
+0

Rất rõ ràng trong ít từ hơn – Yash

Các vấn đề liên quan