Sử dụng Controller trong Laravel 5:

Một phần của tài liệu Xây dựng Website bán mỹ phẩm trực tuyến sử dụng Framework Laravel. (Trang 44 - 50)

Thay vì định nghĩa tất cả các xử lý login trong routes.php, 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: Tạo một file mới trong app/Http/Controllers có tên HomeController. <?php

namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests;

use App\Http\Controllers\Controller; class HomeController extends Controller {

// something will be here }

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, 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ư

Sinh viên thực hiện: Nguyễn Linh – 12CNTT 34

mục app/Http/Controllers thì có namespaceApp\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: Artisan 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ường được dùng Artisan:

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

$ php artisan make:controller HomeController

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

<?php

namespace App\Http\Controllers\Controllers\Backend; use Illuminate\Http\Request;

use App\Http\Requests;

use App\Http\Controllers\Controller; class HouseController extends Controller {

/**

* Display a listing of the resource. *

* @return \Illuminate\Http\Response */

public function index() {

// } /**

* Show the form for creating a new resource. *

Sinh viên thực hiện: Nguyễn Linh – 12CNTT 35

* @return \Illuminate\Http\Response */

public function create() {

// } /**

* Và rất nhiều hàm khác ở dưới đây */

}

Đâ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 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(): Route::controller('category', 'CategoryController',[ 'getIndex' => 'category.home', 'getAdd' => 'category.add', 'postStore' => 'category.save', 'getShow' => 'category.show', 'getEdit' => 'category.edit',

Sinh viên thực hiện: Nguyễn Linh – 12CNTT 36 'postUpdate'=> 'category.update', 'deleteDestroy'=> 'category.remove', 'getTrash' => 'category.trash', 'getRestore' => 'category.restore', ]);

Ví dụ trên 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. Có thể đặt bất cứ tên gì cho action, miễn sao 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ố, chỉ việc khai báo vào khai báo hàm:

public function show($id, $parent) {

// do something to show anything }

Sinh viên thực hiện: Nguyễn Linh – 12CNTT 37

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

paramter ở route:

Route::get('/show/{id}/{parent}', ['uses'=>'HomeController@show']);

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 rằng đã khai báo sử dụng use Illuminate\Http\Request; sau đó chỉ việc code như dòng 1 bên dưới:

public function postStore(Request $request) {

//Minh hoạ việc xử lý form trong một action $category = new Category($request->all()); $category->title = $request->get('title'); if ( null !== $request->file('thumbnail') ) { $category->thumbnail = UploadHelper::image($request- file('thumbnail')); } $category->save();

return redirect( route('backend::category.edit',[$category->id]) )- >with('status', 'Thêm danh mục thành công!');

}

Trong đó:

$request->all() lấy dữ liệu cả form dưới dạng array.

$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”.

Sinh viên thực hiện: Nguyễn Linh – 12CNTT 38

Có hai cách khai báo dùng middleware: Tại route:

Route::get('profile', [ 'middleware' => 'auth',

'uses' => 'UserController@showProfile' ]);

Để 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:

Route::get('profile', [

'middleware' => ['auth','youShallNotPass', 'imTheGuardian'], 'uses' => 'UserController@showProfile'

]);

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

class UserController extends Controller {

/**

* Instantiate a new UserController instance. *

* @return void */

public function __construct() {

$this->middleware('auth');

$this->middleware('log', ['only' => [ 'fooAction',

Sinh viên thực hiện: Nguyễn Linh – 12CNTT 39 ]]); $this->middleware('subscribed', ['except' => [ 'fooAction', 'barAction', ]]); } }

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 các nhà phát triển Laravel thì có thể nhanh đến hơn 100 lần “trong một số trường hợp”.

$ php artisan route:cache

Để xoá cache cho route:

$ php artisan route:clear

Một phần của tài liệu Xây dựng Website bán mỹ phẩm trực tuyến sử dụng Framework Laravel. (Trang 44 - 50)

Tải bản đầy đủ (PDF)

(102 trang)