MVC PHP - Viết Base_Controller
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
.
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:
Bài viết này được đăng tại [free tuts .net]
<?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:
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é.
// 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ụ:
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:
<?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:
<!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é.