06/04/2021, 14:46

MVC PHP - Viết Base_Controller - Học MVC PHP nâng cao

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

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:

 

<?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:

base-controller-mvc-php.png

Bạn cần chú ý những vấn đề sau:

  • Trong Product_Controller mình đã kế thừa lớp Base_Controller nên tất cả các phương thức trong Base_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.

mvc-php-viet-basecontroller.png

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é.

Bài tiếp
0