06/04/2021, 14:46

MVC PHP - Viết thư viện load library - Học MVC PHP nâng cao

Ở bài trước chúng ta đã viết được thư viện load config và trong bài này chúng ta cũng viết một thư viện có chức năng tương tự đó là load library. Vậy library có gì đặc biệt trong mô hình MVC mà ta phải cần đến nó? Để trả lời câu hỏi này thì ta sẽ đi tìm hiểu khái niệm library là gì đã ...

Ở bài trước chúng ta đã viết được thư viện load config và trong bài này chúng ta cũng viết một thư viện có chức năng tương tự đó là load library. Vậy library có gì đặc biệt trong mô hình MVC mà ta phải cần đến nó? Để trả lời câu hỏi này thì ta sẽ đi tìm hiểu khái niệm library là gì đã nhé.

Trước khi vào vấn đề chính thì mình chụp hình cấu trúc folder của project khi kết thúc bài này để các bạn dễ học hơn nhé.

load-thu-vien-trong-mvc-1.png

1. Library trong mô hình MVC

Trong quá trình xây dựng dự án đôi lúc bạn cần viết những class nhằm xử lý một vấn đề nào đó. Ví dụ như class upload file, class phân trang, ... thì những lớp này sẽ được đặt ở đâu trong mô hình MVC? Câu trả lời chính là đặt trong thư mục library nhé các bạn. Còn thư mục config chỉ chứa những file cấu hình hệ thống và nội dung của nó sẽ return về một mảng dạng tương tự như bài trước chúng ta đã học rồi.

Cấu trúc lưu trữ này giống với Framework Codeigniter và mình cũng xây dựng dạng như nó nhưng ở mức đơn giản để dễ trình bàydễ cả vấn đề hiểu bài của các bạn.

2. Thư mục library nằm ở đâu trong mô hình MVC

Tất cả các class thư viện đều được đặt trong thư mục system/library. Vậy bạn có thắc mắc tại sao không đặt ở trong module admin không? Đó là tại vì tôi muốn các thư viện có thể dùng chung cho tất cả module (admin, site) nên sẽ đặt trong system. Còn nếu đặt trong module thì chỉ dùng được cho module đó thôi.

Bây giờ bạn tạo một file tên là Upload_Library.php nằm trong thư mục system/library và copy nội dung sau dán vào:

 

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

class Upload_Library 
{
    public function __construct()
    {
        echo '<h3>Class Upload_Library được khởi tạo</h3>';
    }
    
    public function upload()
    {
        echo '<h3>Method Upload được gọi tới</h3>';
    }
}

 

Vấn đề bây giờ của chúng ta là viết thư viện load library.

3. Viết thư viện load library

Bạn mở file system/core/loader/FT_Library_Loader.php  và copy nội dung sau vào:

 

<?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/loader/FT_Library_Loader.php
 */
class FT_Library_Loader
{
    /**
	 * Load library
     * 
	 * @param 	string
     * @param 	array
     * @desc    hàm load library, tham số truyền vào là tên của library và 
     *          danh sách các biến trong hàm khởi tạo (nếu có)
	 */
    public function load($library, $agrs = array())
    {
        // Nếu thư viện chưa được load thì thực hiện load
        if ( empty($this->{$library}) )
        {
            // Chuyển chữ hoa đầu và thêm hậu tố _Library
            $class = ucfirst($library) . '_Library';
            require_once(PATH_SYSTEM . '/library/' . $class . '.php');
            $this->{$library} = new $class($agrs);
        }
    }
}

 

Trong đó mình đã tạo một class tên là FT_Library_Loader và có một method load() gôm hai tham số:

  • $library là tên class muốn load.
  • $agrs là các tham số truyền vào hàm khởi tạo của class đó. Nếu không có thì bỏ qua tham số này

Các bạn chú ý tên class truyền vào phải tuân theo nguyên tắc như sau: Giả sử class bạn đặt tên là upload thì tên file phải là Upload_Library.php (viết hoa chữ đầu và thêm hậu tố _Library), tương tự tên class cũng phải đặt như vậy. Nếu bạn để ý kĩ trong phương thức load() mình cũng có đề cập đến vấn đề này.

4. Bổ sung thư viện vào FT_Controller

Chúng ta cần khởi tạo thư viện FT_Library_Loader này ở controller chính (FT_Controller) nhằm mục đích các controller trong module admin có thể sử dụng được.

Bạn mở file system/core/FT_Controller.php lên và sửa lại hàm khởi tạo như sau:

 

public function __construct() 
{
    // Loader cho config
    require_once PATH_SYSTEM . '/core/loader/FT_Config_Loader.php';
    $this->config   = new FT_Config_Loader();
    $this->config->load('config');

    // Loader Library
    require_once PATH_SYSTEM . '/core/loader/FT_Library_Loader.php';
    $this->library = new FT_Library_Loader();
}

 

Ok và cuối cùng chúng ta chỉ học cách sử dụng thôi.

4. Load libray tại Controller

Bây giờ bạn tạo mới một controller tên là library bằng cách thực hiện các bước sau:

  • Tạo file Library_Controller.php nằm trong thư mục admin/controller
  • Viết code tạo mới Controller và Action index.
    <?php if ( ! defined('PATH_SYSTEM')) die ('Bad requested!');
    
    class Library_Controller extends FT_Controller
    {
        public function indexAction()
        {
            
        }
    }

Như vậy là bạn tạo xong rồi đấy. Ở những bài sau mình không nhắc lại cách tạo controller nữa nhé.

Bây giờ bạn viết code load library uploadgọi đến phương thức upload bằng cách sửa lại controller như sau:

 

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

class Library_Controller extends FT_Controller
{
    public function indexAction()
    {
        // Tạo mới thư viện
        $this->library->load('upload');
        
        // Gọi đến phương thức upload
        $this->library->upload->upload();
    }
}

 

Chạy lên với URL http://localhost/mvc/admin.php?c=library nếu xuất hiện giao diện như sau là OK.

load-thu-vien-trong-mvc.png

5. Lời kết

Vậy là trong bài này bạn đã tìm hiểu được cách viết hệ thống load library và ý nghĩa của folder library trong mô hình MVC. Bài này cũng rất thú vụ không kém gì bài load config phải không nào. Nếu có vấn đề thắc mắc bạn hãy comment bên dưới mình sẽ giải đáp sớm nhất có thể.

Trần Trung Dũng

15 chủ đề

2610 bài viết

0