0

#5 Sử dụng Controller trong Laravel 5

Thay vì định nghĩa tất cả các xử lý login trong routes.php, bạn có thể tổ chức logic hợp lý, gọn gàng hơn bằng cách sử dụng Controller trong Laravel 5. Mục tiêu của Controller là gom nhóm các xử lý logic từ request HTTP vào chung trong một class. Các Controller được lưu trữ tại thư mục app/Http/Controllers

Tạo Controller đầu tiên

Có hai cách để tạo controller:

Tự tạo bằng tay

Bạn hãy tạo một file mới trong  app/Http/Controllers có tên HomeController:

Trong đó, tên class phải giống với tên file để Laravel có thể nạp controller của bạn vào ứng dụng.

Tiếp theo phần khai báo namespace và use ở trên tên của class là cú pháp hỗ trợ bắt đầu từ PHP 5.3.0. Vì Laravel làm một glue framework, nên nó sử dụng rất nhiều packages từ nhiều nhà phát triển khác nhau để tạo nên. Do đó để quản lý packages và tránh bị trùng tên class thì namespace là bắt buộc.
Cách đặt namespace cho Controler khá đơn giản, bạn có thể xem nó giống như đường dẫn chỉ thư mục chứa class vậy, HomeController.php nằm trong thư mục app/Http/Controllers  thì có  namespace App\Http\Controllers; Các từ khoá use  để chỉ định bạn muốn “include” lớp nào vào để dùng.

Tạo bằng dòng lệnh Artisan

Mình rất thích Artisan do nó nhanh và tạo ra code template quá tiện lợi, hầu hết các thao tác tạo các thành phần trên Laravel (trừ view) thì mình đều dùng Artisan:

Để tạo HomeController.php, chạy lệnh sau tại thư mục gốc của proeject:

Kết quả sẽ được một file HomeController.php có nội dung:

Đây là cách tận dụng Artisan để tạo Implicit Controller rất tiện lợi, sau khi chạy xong ta sẽ có một template trong đó có sẵn các hàm hay dùng, ta chỉ việc code bên trong để xử lý logic.

Về Implicit Controller (IC)

Sử dụng IC rất tiện cho chúng ta khi cần tạo controller để xử lý cho các trường hợp:

  • Tạo GRUD: Xử lý dữ liệu cho form, các hàm thêm/xoá/sửa đều có thể nhanh chóng khi triển khai cùng với Route::Controller()
  • Tạo RESTful web service truy cập đến các resource
  • Tạo JWT – Json Web Service tuân thủ theo chuẩn RESTful

Để khai báo route cho Implicit Controller chúng ta sử dụng mẫu của hàm Route:Controller()

Ví dụ trên tôi tạo Route cho CategoryController chuyên xử lý GRUD cho dữ liệu Category. Lưu ý để đặt tên cho route, không dùng từ khoá “as” như bình thường mà dùng một mảng, trong đó key => value là “action_name” => “route_name”.

Lưu ý với quy tắc đặt trên action trong IC là từ đầu tiên chỉ HTTP Method, từ tiếp theo là tên thật của action. Ví dụ action index khi đặt tên trong controller phải là getIndex, trong đó get mà HTTP method, Index là tên action. Nếu một request gởi đến đúng tên action nhưng không đúng với Method khai báo, Laravel sẽ xuất ra thông báo lỗi “Không tìm thấy trang” có mã lỗi 404.

Tạo Action cho Controller

Nghĩ đơn giản, mỗi action trong controller là một hàm trong class. Mỗi action giải quyết một request cụ thể từ người dùng. Ví dụ getIndex có nhiệm vụ “khi có request tới trang chủ thì lấy dữ liệu và nạp vào vào view template của trang chủ”. Ngoại trừ Implicit Controller thì không có quy tắc đặt tên cho action. Bạn có thể đặt bất cứ tên gì cho action, miễn sao bạn có thể nhớ được.

Tham số của Action

Action có thể nhận đầu vào một hoặc nhiều tham số khác nhau. Để nhận tham số, bạn chỉ việc khai báo vào khai báo hàm:

$id $parent được hiểu và truyền vào theo đúng thứ tự khai báo paramter ở route:

Action lấy dữ liệu từ form

Các truyền dữ liệu qua tham số phù hợp cho các chức năng có dữ liệu “read-only”, còn để xử lý form, ta cần sử dụng class Request để lấy dữ liệu nhập từ form gởi lên.

Chắc chắn bạn đã khai báo sử dụng use Illuminate\Http\Request; sau đó chỉ việc code như dòng 1 bên dưới:

Chú ý dòng 4,5,7 bạn sẽ thấy:

  • $request->all() lấy dữ liệu cả form dưới dạng array. Thích hợp cho massive asign gía trị vào model.
  • $request->get(‘name’) lấy giá trị trong input field có name = “title”
  • $request->file(‘thumbnail’) lấy file upload trong input field có tên “thumbnail”

Sử dụng Middleware cho controller

Có hai cách khai báo dùng middleware:

Tại route

Để gán nhiều middleware, thay vì tên của middleware, hãy dùng mảng chứa tên các middleware:

Trực tiếp trong Controller Class

Bạn có thể khai báo  dùng middleware trực tiếp trong Controller:

Việc khai báo trực tiếp trong code của Controller còn đem lại một lợi ích, đó là có thể chỉ định rõ ràng hơn dùng middle với action nào.

Trong ví dụ trên, từ khoá “only” chỉ ra middleware chỉ áp dụng cho những aciton nào, còn từ khoá “except” chỉ định các action sẽ không bị ảnh hưởng bởi middleware.

Tạo cache cho route

Để tăng tốc cho route, Laravel 5 hỗ trợ cache xử lý route mà theo lời bóng gió của Laravel thì có thể nhanh đến hơn 100 lần “trong một số trường hợp”. Không biết có ai làm benchmark chưa, và tôi cũng không tin là nhanh đến vậy, tuy nhiên nhanh thêm chút xíu thôi cũng đã là tốt hơn rồi:

Để xoá cache cho route:

Lưu ý: Khi viết xử lý logic trực tiếp trong route bằng các hàm Closure thì sẽ không cache được.

Bài kế tiếp trong series Lập Trình Web Với Laravel – Cơ Bản:

#6 Laravel 5: Tạo bảng và khoá ngoại trong database

Bình luận với Facebook

Hoàng Tựa

Yêu thích lập trình web và tạo ra những thứ đẹp đẽ.

Leave a Reply

Your email address will not be published. Required fields are marked *