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!' ); class Base_Controller
extends FT_Controller { public function __construct()
{ parent::__construct(); } public function load_header() { //
Load nội dung footer } public function load_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 public function __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_once PATH_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ừa include_once PATH_SYSTEM
. '/core/FT_Controller.php' ; //
Load Base_Controller if
( file_exists (PATH_APPLICATION . '/core/Base_Controller.php' )){ include_once PATH_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
|
class Layout_Controller extends Base_Controller { public function indexAction() { } } |
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!' ); class Product_Controller extends Base_Controller { public function indexAction() { $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 > < meta http-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_Controller
mình đã kế thừa lớpBase_Controller
nê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_Controller
ta đã 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: