Chúng 
ta đã học được cách load 
view rồi, tuy nhiên nếu sử dụng cấu trúc như vậy thì dự án sẽ 
khó quản lý code và nội dung sẽ bị trùng lặp. Ví dụ giao diện website của bạn 
gồm có 3 phần là header, footer và content. Đối với header và footer sẽ là nội 
dung mà trang nào cũng 
có nên mình muốn chi viết cho nó đúng một lần duy nhất, và 
muốn làm được như vậy mình sẽ tạo một controller đặc biệt tên 
là 
Base_Controller.
Nội 
dung chính
- 1. Vị trí đặt Base_Controller
- 2. Load Base_Controller trong hàm FT_Load()
- 3. Ví dụ sử dụng Base_Controller
- 4. Lời kết
1. Vị trí đặt Base_Controller
Chúng 
ta sẽ đặt controller này trong thư mục 
core của 
ứng dụng, nghĩa là sẽ đặt trong admin/core.
Bạn 
tạo một file tên là 
Base_Controller.php nằm 
trong thư muc admin/core, 
sau đó copy nội dung sau vào:| 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 | <?php 
if( 
! defined('PATH_SYSTEM')) 
die('Bad 
requested!');classBase_Controller 
extendsFT_Controller{    publicfunction__construct() 
    {        parent::__construct();    }        publicfunctionload_header()    {        // 
Load nội dung footer    }        publicfunctionload_footer()    {        // 
Load nội dung header    }        // 
Hàm hủy này có nhiệm vụ show nội dung của view, lúc này các 
controller    // 
không cần gọi đến $this->view->show nữa    publicfunction__destruct() 
    {        $this->view->show();    }} | 
Ở 
Base_Controller mình 
tạo các hàm load_header, load_footer và 
đặc biệt là ở hàm 
hủy mình có gọi đến phương thúc $this->view->show() và 
đây chính là phương thức hiển thị 
view ra trình duyệt mà ta đã sử dụng rất nhiều lần 
rồi. Riêng ở hàm khởi tạo __construct()  bắt 
buộc bạn phải gọi tới hàm khởi tạo của lớp cha nhé (parent::__construct()).
Nhiệm 
vụ bây giờ của chúng ta là làm thế nào để sử dụng được 
Base_Controller? 2. Load Base_Controller trong hàm FT_Load()
Quay 
lại file 
FT_Common.php nằm 
trong thư mục system/core. 
Bạn mở file này lên và tìm đến hàm FT_Load() sau 
đó tìm đến dòng 28 có đoạn code load FT_Controller như 
sau:| 
1 | include_oncePATH_SYSTEM 
. '/core/FT_Controller.php'; | 
Bây 
giờ ta bổ sung thêm một đoạn code bên dưới dòng đó nhé.
| 
1 
2 
3 
4 
5 
6 
7 | // 
Include controller chính để các controller con nó kế thừainclude_oncePATH_SYSTEM 
. '/core/FT_Controller.php';// 
Load Base_Controllerif(file_exists(PATH_APPLICATION . '/core/Base_Controller.php')){    include_oncePATH_APPLICATION 
. '/core/Base_Controller.php';} | 
Ok 
mọi chuyện vậy là xong rồi. Nhưng có một lưu ý 
là sau khi bổ sung thư viện này thì ở 
các controller bạn không phải kế thừ 
FT_Controller nữa mà sẽ kế 
thừa Base_Controller nhé.
Ví dụ:
| 
1 
2 
3 
4 
5 
6 
7 | classLayout_Controller extendsBase_Controller{    publicfunctionindexAction()    {            }} | 
3. Ví dụ sử dụng Base_Controller
Bạn 
tạo một controller tên là 
Product_Controller và 
copy nội dung sau vào:| 
1 
2 
3 
4 
5 
6 
7 
8 
9 | <?php 
if( 
! defined('PATH_SYSTEM')) 
die('Bad 
requested!');classProduct_Controller extendsBase_Controller{    publicfunctionindexAction()    {        $this->view->load('product');    }} | 
Tiếp 
theo bạn tạo một view tên là 
product.php và 
copy nội dung sau vào:| 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 | <!DOCTYPE 
html><html>    <head>        <title></title>        <metahttp-equiv="Content-Type"content="text/html; 
charset=UTF-8">    </head>    <body>        <h1>Đây 
là trang sản phẩm</h1>    </body></html> | 
Bây 
giờ bạn ra trình duyệt nhập URL là http://localhost/mvc/admin.php?c=product thì 
sẽ xuất hiện dòng chữ như sau tức là controller đã chạy đúng:

Bạn 
cần chú ý những vấn đề sau:
- Trong Product_Controllermình đã kế thừa lớpBase_Controllernên tất cả các phương thức trongBase_Controllerđều có thể sử dụng được nhé.
- Trong action index mình không cần gọi tới phương 
thức $this->view->show()nữa bởi vì ởBase_Controllerta đã gọi tới nó ở hàm hủy__destruct().
Và 
sau đây là cấu trúc folder cho tới bài hôm nay.

4. Lời kết
Bài 
này có vẻ hơi ngắn nhưng mình vẫn quyết định tạo một bài riêng bởi vì như vậy 
các bạn sẽ dễ dàng học và dễ dàng tìm kiếm lại. Nếu bạn cảm thấy mình phân chia 
kiểu này sẽ khó học thì có thể góp ý và mình sẽ ghi nhận các ý kiến đó và bổ 
sung cho các serie sau này.
Trong 
bài này bạn cần hiểu ý nghĩa của 
Base_Controller như 
thế nào thì ở bài tiếp theo tìm hiểu kỹ thuật master layout trong 
MVC bạn mới có thể tiếp thu nhanh được. Chính vì vậy bạn 
đừng bỏ qua những đoạn code và giải thích của mình nhé. 
0 nhận xét: