06/04/2021, 14:46

MVC PHP - Xây dựng file Bootstrap và Controller chính - Học MVC PHP nâng cao

Bài này khá đơn giản vì bạn chỉ cần tạo các folder trong hệ thống xử lý của CORE và viết code cho file bootstrap, file Controller chính trong mô hình MVC. Tuy nói là đơn giản nhưng bạn cũng phải hiểu ý nghĩa của từng file để qua bài sau ta tiến hành code sẽ dễ dàng hơn. Trước khi vào vấn đề ...

Bài này khá đơn giản vì bạn chỉ cần tạo các folder trong hệ thống xử lý của CORE và viết code cho file bootstrap, file Controller chính trong mô hình MVC. Tuy nói là đơn giản nhưng bạn cũng phải hiểu ý nghĩa của từng file để qua bài sau ta tiến hành code sẽ dễ dàng hơn.

Trước khi vào vấn đề chính mình xin nhắc lại một chút, vì mình chỉ hướng dẫn xây dựng một module quản lý tin tức MVC nên rất đơn giản và không code cho frontend nên bạn hãy xóa đi folder site và file index.php nhé.

1. Xây dựng cấu trúc folder System trong MVC

Trong phần này ta chỉ quan tâm đến các file và folder bên trong system nên mình sẽ không show các folder trong admin nhé. 

Các bạn xem hình dưới đây:

folder-mo-hinh-mvc-php.png

Các bạn thấy folder system mình đã bổ sung một số file và folder như trong hình và có giải thích ý nghĩa của nó nên mình không giải thích gì thêm. Và mình có xóa đi folder site và file index.php ngoài cùng rồi nhé.

2. Xây dựng lớp Controller chính

Lớp controller chính nằm trong file system/core/FT_Controller.php. Bạn mở file này lên và thêm vào nội dung sau:

 

<?php if ( ! defined('PATH_SYSTEM')) die ('Bad requested!');

/**
 * @package		FT_Framework
 * @author		Zaidap.com Dev Team
 * @email       Zaidap.com.net@gmail.com
 * @copyright	Copyright (c) 2015
 * @since		Version 1.0
 * @filesource  system/core/FT_Controller.php
 */
class FT_Controller
{
    // Đối tượng view
    protected $view     = NULL;
    
    // Đối tượng model
    protected $model    = NULL;
    
    // Đối tượng library
    protected $library  = NULL;
    
    // Đối tượng helper
    protected $helper   = NULL;
    
    // Đối tượng config
    protected $config   = NULL;
    
    /**
	 * Hàm khởi tạo
     * 
     * @desc    Load các thư viện cần thiết
	 */
    public function __construct() 
    {
    }
    
    /**
	 * Hàm chạy ứng dụng
     * 
     * @desc    tham số truyền vào gồm controller và action
	 */
    public function load($controller, $action)
    {
        
    }
}

 

Trong đó bạn cần chú ý đến những vấn đề sau:

  • Phía trên cùng mình có sử dụng một đoạn kiểm tra một hằng số tồn tại không và nếu không tồn tại thì thoát khỏi chương trình. Đoạn code này giúp bảo vệ an toàn cho hệ thống vì hằng số PATH_SYSTEM chỉ tồn tại khi ban gọi thông qua file bootstrap.
  • Tại hàm load() có hai tham số truyền vào là controller action. Đây cũng chính là hàm sẽ chạy ứng dụng

3. Tạo các hằng số cấu hình trong config

Bạn mở file system/config/config.php lên và điền nội dung sau vào:

 

<?php
// Thông số database
define('DB_HOST',       'localhost');
define('DB_USER',       'root');
define('DB_PASSWORD',   '');

// Thông số controller và action mặc định
define('CONTROLLER_DEFAULT', 'index');
define('ACTION_DEFAULT', 'index');

 

Trong đó có hai loại:

  • Hằng số cấu hình database
    // Thông số database
    define('DB_HOST',       'localhost');
    define('DB_USER',       'root');
    define('DB_PASSWORD',   '');
  • Hằng số xác định controller mặc định và action mặc định
    // Thông số controller và action mặc định
    define('CONTROLLER_DEFAULT', 'index');
    define('ACTION_DEFAULT', 'index');

4. Viết code cho  file bootstrap

Bây giờ ta sẽ tiến hành viết code cho file bootstrap admin.php ở ngoài cùng của project mvc.

Trước khi vào vấn đề chính thì mình có một số lưu ý như sau:

  • Tất cả các request sẽ vào file admin.php và file này nó sẽ dựa vào URL để gọi tới controller và action tương ứng
  • URL của chúng ta có dạng domain.com/admin.php?c={controller}&a={action}, có nghĩa khi người dùng gọi controller nào thì sẽ truyền cho tham số c và gọi action nào thì truyền vào tham số a.
  • Nếu người dùng không gọi controller hoặc action nào thì sẽ lấy các giá trị CONTROLLER_DEFAULT và  ACTION_DEFAULT trong file system/config/config.php mà ta đã tạo ở phần 3.

Bây giờ bạn nhập nội dung sau vào file admin.php.

 

<?php

// Đường dẫn tới hệ  thống
define('PATH_SYSTEM', __DIR__ .'/system');
define('PATH_APPLICATION', __DIR__ . '/admin');

// Lấy thông số cấu hình
require (PATH_SYSTEM . '/config/config.php');

// Danh sách tham số gồm hai phần
//  - controller: controller hiện tại
//  - action: action hiện tại
$segments = array(
    'controller'    => '',
    'action'        => array()
);

// Nếu không truyền controller thì lấy controller mặc định
$segments['controller'] = empty($_GET['c']) ? CONTROLLER_DEFAULT : $_GET['c'];

// Nếu không truyền action thì lấy action mặc định 
$segments['action'] = empty($_GET['a']) ? ACTION_DEFAULT : $_GET['a'];

// Require controller
require_once PATH_SYSTEM . '/core/FT_Controller.php';

// Chạy controller
$controller = new FT_Controller();
$controller->load($segments['controller'], $segments['action']);

 

Các phần comment mình đã giải thích quá kỹ rồi. Bạn chỉ lưu ý  thêm các vấn đề sau:

  • require file syste/core/config.php để lấy các hằng số 
  • require file system/core/FT_Controller.php để tạo lớp FT_controller, đây là controller chính
  • gọi tới hàm load() trong controller chính

5. Viết code cho hàm load trong file FT_Controller.php

Trước khi vào vấn đề thì mình đưa ra quy luật của controller như sau.

  • Tất cả các controller của ứng dụng (ứng dụng ở đây chính là folder admin) đề nằm trong folder admin/controller
  • Tên của controller phải ở dạng Controllername_Controller.php. Trong đó Controllername là tên mà bạn muốn đặt cho controller
  • Class của controller cũng phải giống tên file của nó, nghĩa là sẽ có tên Controllername_Controller

Các bạn xem hình tham khảo:

356/cau-hinh-system-core-mvc-1.png

Bây giờ bạn mở file system/core/FT_Controller.php lên, tìm tới hàm load() và gõ nội dung sau vào:

 

public function load($controller, $action)
{
    // Chuyển đổi tên controller vì nó có định dạng là {Name}_Controller
    $controller = ucfirst(strtolower($controller)) . '_Controller';

    // chuyển đổi tên action vì nó có định dạng {name}Action
    $action = strtolower($action) . 'Action';

    // Kiểm tra file controller có tồn tại hay không
    if (!file_exists(PATH_APPLICATION . '/controller/' . $controller . '.php')){
        die ('Controller không tồn tại');
    }

    require_once PATH_APPLICATION . '/controller/' . $controller . '.php';

    // Kiểm tra class controller có tồn tại hay không
    if (!class_exists($controller)){
        die ('Controller không tồn tại');
    }

    // Khởi tạo controller
    $controllerObject = new $controller();

    // Kiểm tra action có tồn tại hay không
    if ( !method_exists($controllerObject, $action)){
        die ('Action không tồn tại');
    }

    // Gọi tới action
    $controllerObject->{$action}();
}

 

Bạn chú ý trong code mình có dùng một số hàm chuyển đổi chuỗi như ucfirst, strtolower để đổi tên controller theo quy luật mà mình nói ở trên.

6. Tạo mới một controller và test

Bây giờ bạn cần tạo một file News_Controller.php nằm trong folder admin/controller nhé, sau đó copy nội dung sau vào:

 

<?php if ( ! defined('PATH_SYSTEM')) die ('Bad requested!');

class News_Controller 
{
    public function indexAction()
    {
        echo '<h1>Index Action</h1>';
    }
    
    public function detailAction()
    {
        echo '<h1>Detail Action</h1>';
    }
}

 

Bạn ra trình duyệt gõ URL là localhost/mvc/admin.php?c=news&a=detail và nếu xuất hiện chữ Detail Action tức là bạn đã thành công rồi đấy.

Nếu vẫn còn nghi ngờ thì bạn gõ vào URL là localhost/mvc/admin.php?c=news thì nó sẽ xuất hiện chữ Index Action , bởi vì ta không truyền action vào URL nên mặc định nó gọi indexAction.

Và đây là toàn bộ các file tính đến thời điểm hiện tại trong project mvc của chúng ta

356/cau-hinh-system-core-mvc-2.png

7 Lời kết

Trong bài này chúng ta đã tạo được file bootstrap và controller chính, ở các bài tiếp theo chúng ta sẽ tiến hành viết những thư viện loader để thực hiện load model, library nhé. Nếu có gì thắc mắc bạn có thể comment bên dưới và mình sẽ giải thích cho các bạn.

Trần Trung Dũng

15 chủ đề

2610 bài viết

0