LARAVEL
BÀI MỚI NHẤT
MỚI CẬP NHẬT

Bài 3: Sử dụng Controller trong laravel

Sau khi route nhận được request thì sẽ chuyển hướng request đến cho controller và giao cho controller này xử lý. Controller sẽ gọi tới Model để tương tác với cơ sở dữ liệu (database) và đưa dữ liệu tới View và View sẽ nhận dữ liệu và chuyển thành những đoạn mã HTML rồi gửi về cho Client. Hiện tại tới bài này là chúng ta đang học Controller chứ chưa học Model và View nên mình chỉ giới thiệu Controller và cách sử dụng thôi nhé.

1. Tạo controller trong laravel

Tất cả controller trong laravel được chứa trong thư mục app/controllers và việc tạo tên file, đặt tên controller cũng phải tuân theo nguyên tắc của nó như sau:

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.
  • Trước tiên tôi muốn giới thiệu với các bạn lớp Controller của Laravel, đây là một lớp xử lý controller chính của Laravel nên tất cả các Controller mới phải thừa kế (extends) từ lớp này.
  • Nêu bạn muốn kế thừa từ một Controller khác thì lớp đó phải kế thừa từ lớp Controller của Laravel. Lúc này Controller mới tạo sẽ extends từ lớp Controller khác đó.
  • Tên Controller phải trùng với tên File. Ví dụ bạn tạo Controller tên DemoController thì file phải tên là DemoController.php

Tạo Controller kế thừa trực tiếp từ Controller của Laravel

Bước 1: Bạn tạo file DemoController.php nằm trong thư mục app/controllers

Bước 2: Bạn viết code tạo Controller trong file DemoController.php như sau:

<?php
class DemoController extends Controller{
		
}

Lưu ý là trong đó mình có kế thừa từ lớp Controller của Laravel. Vậy là bạn đã tạo thành công một Controller rồi đấy.

Tạo Controller kế thừa từ một Controller khác

Bây giờ mình sẽ tạo một ExtController và DemoController, DemoController sẽ kế thừa từ ExtController.

Bước 1: Tạo ExtController, bạn tạo file ExtController.php nằm trong folder app/controllers với nội dung như sau:

class ExtController extends Controller{

}

Bước 2: Tạo DemoController, bạn tạo file DemoController.php nằm trong folder app/controllers với nội dung như sau:

class DemoController extends ExtController{

}

Tới đây bạn sẽ có thắc mắc rằng tại sao lớp ExtController chưa load vào mà trong lớp DemoController có thể kế thừa được? Lý do là Laravel đã load sẵn cho chúng ta nhé.

Việc sử dụng kế thừa qua controller khác như thế này nhằm mục đích tạo ra những hành động dùng chung cho một nhóm controller khác. Ví dụ bạn muốn filter trong các controller của backend xem đã đăng nhập chưa, thay vì bạn filter trong từng controller thì có thể tạo 1 controller AdminController rồi cho các controller khác extends lại.

Tạo Controller trong thư mục con (sub folder)

Ngoài ra chúng ta cũng có thể tạo Controller nằm trong một subfolder. Ví dụ bạn tạo thư mục con backend trong thư mục app/controllers và tạo một controller AdminController trong thư mục này và đặt tên controller tuân theo quy tắc trên là được. Nhưng để laravel có thể hiểu hiểu được AdminController này thì ngay sau khi tạo controller bạn phải chạy lệnh sau (run command): php artisan dump-autoload

Như bạn thấy đó, việc tạo controller trong sub folder trong laravel rất đơn giản phải không.

2. Tạo Action Controller trong Laravel

Tạo action mới thì bạn cần lưu ý những điều dưới đây.

Khi làm việc với Route::controller thì bạn chú ý việc đặt tên action phải tuân theo quy tắc methodUri như sau:

  • method là post, get, ... và viết thường
  • Uri: Chữ cái đầu tiên của Uri sẽ bắt buộc viết in hoa, cứ 1 chữ in hoa sẽ được tính là 1 đoạn uri được phân cách bởi dấu -

Ví dụ: action getDemoAction sẽ có method là get và Uri là demo-action

Khi làm việc với Route::resource thì controller laravel hỗ trợ 8 action: index, create, store, show, edit, update, destroy nhưng trong controller không nhất thiết phải tạo đủ 8 action này.

Ngoại trừ những điều trên thì action bạn có thể đặt tên tùy ý.

Truyền tham số vào action

Làm việc với Route::controller:

Quay lại ví dụ trên mình viết action hiển thị chi tiết tin tức mà chưa truyền ID vào phải không nào? Bây giờ ta sẽ sửa lại một chút để nhận tham số ID trên URL để sử dụng nhé.

Bước 1: Bạn tạo một Route mới như sau:

Route::controller('/news','NewsController');

Bước 2: Bạn sửa lại file NewsController.php như sau:

class NewsController extends Controller{
    public function getDetailAction($id)
    {
            dd($id);
    }
}

Bước 3: Bạn bạn truy cập URL: http://tênmiềnảocủabạn/news/detail-action/3 bạn sẽ nhận được kết quả $id=3

Làm việc với Route::resource:

Trường hợp này thì bạn xem lại phần cuối bài Sử dụng Route::controller và Route::resource trong laravel

Các trường hợp khác:

Ngoại trừ hai trường hợp trên thì thông thường khi truyền tham số vào Action bạn phải tuân theo cú pháp như sau:

  • Tên tham số trong route đặt trong cặp thẻ {}, ví dụ {id}
  • Trong action sẽ nhận tham số tương ứng. Ví dụ ta có route là '/chitiet-{id}-{title}' thì trong action sẽ nhận hai tham số tương ứng là nameAction($id, $title)

Ví dụ: Bạn thay đổi nội dung ở Route lại như sau:

Route::get('/chitiet-{id}','NewsController@detail');

Thì khi bạn truy cập URL: http://tênmiềnảocủabạn/chitiet-3 bạn sẽ nhận được biến $id = 3.

3. Sử dụng filter trong controller.

Ngoài việc sử dụng filter ngay trong file routes.php thì khi khai báo route bạn có thể đặt nó trong controller, cụ thể là trong hàm khởi tạo function __construct của controller bằng cách sử dụng con trỏ $this trỏ tới function beforFilter (filter trước khi bất kỳ action nào được quy định được gọi) hoặc afterFilter (filter sau khi controller được gọi). Cu pháp như sau:

public function __construct(){
	$this->beforeFilter( $filter, $options);
}

Trong đó:

  • $filter là tên của filter trong file filters.php
  • $option là mảng các tùy chọn trong đó
    • on: filter trên method nào
    • except: filter trên tất cả các action của controller trừ action được khai báo
    • only: chỉ filter trên các action được khai báo}

Ví dụ:

//gọi bộ lọc auth trên tất cả các action trong controller trừ action getLogin
$this->beforeFilter('auth', array('except' => 'getLogin'));

//gọi bộ lọc csrf trên tất cả các action trong controller có method là post
$this->beforeFilter('csrf', array('on' => 'post'));

//sau khi 2 action fooAction và barAction xử lý xong thì filter log được gọi
$this->afterFilter('log', array('only' => array('fooAction', 'barAction')));

Bạn cũng có thể dùng action trong chính controller để sử dụng làm filter bằng cách sử dụng ký tự @ để khai báo, tuy nhiên cách này ít khi được sử dụng. Cú pháp như sau:

public function __construct(){
    $this->beforeFilter('@filterRequests');
}

public function filterRequests($route, $request){
    //
}

4. Kết luận

Như vậy trong bài này mình đã giới thiệu qua về cách khai báo và sử dụng controller một cách cơ bản. Ở bài sau mình sẽ giới thiệu cách bạn tương tác với View bằng Controller.

Cùng chuyên mục:

Bài 1: Laravel là gì? hướng dẫn cài đặt laravel bằng Composer

Bài 1: Laravel là gì? hướng dẫn cài đặt laravel bằng Composer

Bài 04: Tìm hiểu cấu trúc của Laravel 5.x

Bài 04: Tìm hiểu cấu trúc của Laravel 5.x

Và trong bài này, chúng ta sẽ tìm hiểu cấu trúc của Laravel để có…

Bài 03: Hướng dẫn cài đặt Laravel 5.x

Bài 03: Hướng dẫn cài đặt Laravel 5.x

Để bắt đầu series tự học Laravel 5x thì công việc đầu tiên là bạn…

Bài 02: Hướng dẫn sử dụng Composer PHP

Bài 02: Hướng dẫn sử dụng Composer PHP

Composer là một công cụ tuyệt vời cho tín đồ PHP và trong bài này,…

Bài 11: Sử dụng Query Builder (Model) trong laravel

Bài 11: Sử dụng Query Builder (Model) trong laravel

Model trong mô mình MVC dùng để tương tác với cơ sở dữ liệu và…

Bài 10: Sử dụng Blade template engine trong Laravel

Bài 10: Sử dụng Blade template engine trong Laravel

Template engine có tác dụng giúp sạch đi những đoạn code PHP nằm trong View…

Bài 4: Sử dụng View trong laravel

Bài 4: Sử dụng View trong laravel

Trong bài này chúng ta sẽ tìm hiểu đến View, một thành phần khá quan…

Bài 07: Sử dụng Route::filter và Route::group trong laravel

Bài 07: Sử dụng Route::filter và Route::group trong laravel

Giới thiệu về 2 loại route rất quan trọng trong việc xử lý logic và…

Bài 06: Sử dụng Route::controller và Route::resource trong laravel

Bài 06: Sử dụng Route::controller và Route::resource trong laravel

Ở bài trước mình có giới thiệu tổng quan về rout trong Laravel và việc…

Bài 02: Tổng quan về route trong laravel

Bài 02: Tổng quan về route trong laravel

Trong khuôn khổ bài viết này, mình sẽ giới thiệu đến bạn route trong laravel…

Bài 04: Những công cụ tốt nhất hỗ trợ học laravel

Bài 04: Những công cụ tốt nhất hỗ trợ học laravel

Trước hết, ai khi học php đều chọn cho mình 1 IDE hoặc text editor…

Bài 02: Cấu trúc thư mục cơ bản của Laravel

Bài 02: Cấu trúc thư mục cơ bản của Laravel

Bất kì một Framework nào cũng đưa ra một mô hình các cấu trúc thư…

Bài 03: Cài đặt Openserver và tạo domain ảo trên localhost

Bài 03: Cài đặt Openserver và tạo domain ảo trên localhost

Trong bài 3 này mình sẽ giới thiệu các bạn cách tạo tên miền ảo…

Bài 01: Composer là gì?

Bài 01: Composer là gì?

Composer là một công cụ quản lý các thư viện trong PHP (Dependency Management), công…

Một cách quản lý filter trong Laravel

Một cách quản lý filter trong Laravel

Filter là một thành phần tuyệt vời mà laravel cung cấp cho chúng ta, nó…

Sử dụng Event trong Laravel

Sử dụng Event trong Laravel

Trong bài này mình sẽ giới thiệu event, cách tạo event và bắt event trong…

Bài 01: Laravel là gì? Hướng dẫn cài đặt laravel trên windows

Bài 01: Laravel là gì? Hướng dẫn cài đặt laravel trên windows

Trong chuỗi bài viết này mình sẽ viết về laravel 4.2.* trong môi trường windows,…

Top