CodeIgnitor: Tạo thư viện riêng

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Từ "Libraries" tham chiếu đến các lớp đặt trong các tập tin thuộc thư mục application/libraries.

Tuy nhiên, CodeIgniter cũng cho phép bạn đưa vào các thư viện của riêng bạn, hoặc bạn cũng có thể tạo các lớp dẫn xuất từ các lớp của thư viện, hoặc bạn cũng có thể thay thế toàn bộ các thư viện sẵn có đó bằng thư viện mới của riêng bạn.

Tóm lại, CI có thể cho phép bạn:

  • Tạo thêm các thư viện mới.
  • Dẫn xuất từ các thư viện gốc.
  • Thay thế các thư viện gốc.

Lưu ý

Lớp Database không thể được thừa kế hay thay thế bằng lớp do bạn định nghĩa.

Lưu trữ

Các lớp thư viện của bạn cần được đặt trong thư mục application/libraries, đây là nơi CodeIgniter sẽ tìm đến khi chúng được khởi tạo. 

Quy ước đặt tên

  • Tên tập tin thư viện phải được viết hoa chữ đầu tiên. Ví dụ: Myclass.php

  • Phần định nghĩa một lớp cũng phải được được viết hoa chữ đầu tiên. Ví dụ: class Myclass

  • Tên lớp và tên tập tin phải trùng nhau.

Tập tin lớp

Các lớp được xây dựng cần có nguyên mẫu cơ bản như sau:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Someclass {

        public function some_method()
        {
        }
}

Lưu ý

Tên lớp là Someclass chỉ là ví dụ minh họa, bạn có thể dùng tên theo ý bạn.

Sử dụng lớp đã định nghĩa

Từ một phương thức bất kỳ của Controller ta đều có thể khởi tạo lớp thư viện đã định nghĩa theo dạng sau:

$this->load->library('someclass');

Trong đó, someclass chính là tên tập tin (không có phần mở rộng .php), bạn có thể viết hoặc không viết chữ cái đầu tiên.

Sau khi tải xong lớp thư viện ta có thể truy cập lớp như sau:

$this->someclass->some_method();  // Các đối tượng thể hiện sẽ luôn có dạng chữ in thường

Truyền tham số khi khởi tạo lớp

Bạn có thể truyền tham số khi tải lớp thư viện như sau:

$params = array('type' => 'large', 'color' => 'red');

$this->load->library('someclass', $params);

Nếu bạn sử dụng tính năng này thì bạn cần phải cài đặt hàm tạo như sau:

<?php defined('BASEPATH') OR exit('No direct script access allowed');

class Someclass {

        public function __construct($params)
        {
                // Code sử dụng $params
        }
}

Bạn cũng có thể truyền tham số được lưu trữ trong tập tin config bằng cách đơn giản là bạn tạo một tập tin config có tên tương ứng với tập tin lớp và lưu tập tin này trong thư mục application/config/. Lưu ý rằng nếu bạn muốn truyền các tham số động như mô tả ở trên thì tập tin config này sẽ không cho phép.

Sử dụng tài nguyên CodeIgniter trong thư viện đã tạo

Để truy cập được vào các tài nguyên gốc của CodeIgniter ở trong thư viện bạn đã tạo thì ta sử dụng phương thức get_instance(). Phương thức này sẽ trả về đối tượng super.

Thương thì từ bên trong các phương thức controller của bạn bạn sẽ gọi bất kỳ phương thức nào được phép của CodeIgniter bằng cách sử dụng $this dạng như sau:

$this->load->helper('url');
$this->load->library('session');
$this->config->item('base_url');
// etc.

Tuy vậy, $this chỉ làm việc trực tiếp trong các controller, model hay view. Nếu bạn cũng muốn sử dụng các lớp của CodeIgniter từ trong chính các lớp bạn xây dựng thì bạn có thể làm như sau:

Đầu tiên bạn gán đối tượng CodeIgniter cho một biến:

$CI =& get_instance();

Sau đó bạn sử dụng biến đó thay cho $this:

$CI =& get_instance();

$CI->load->helper('url');
$CI->load->library('session');
$CI->config->item('base_url');
// etc.

Lưu ý

Cần lưu ý rằng phương thức get_instance() ở trên được truyền theo dạng tham chiếu:

$CI =& get_instance();

Điều này rất quan trong vì việc gán tham chiếu sẽ cho phép bạn sử dụng đối tượng gốc của CodeIgniter thay vì phải tạo bản sao của nó.

Tuy nhiên, vì mỗi thư viện thực ra là một lớp cho nên tốt nhất là ta nên tận dụng các khả năng của lập trình hướng đối tượng (OOP). Vậy thì, để cho phép sử dụng đối tượng super CodeIgniter trong tất cả các phương thức của lớp ta nên gán nó cho một thuộc tính:

class Example_library {

        protected $CI;

        // Ta sẽ sử dụng một hàm tạo, vì bạn không thể trực tiếp gọi một hàm
        // từ việc định nghĩa thuộc tinh.
        public function __construct()
        {
                // Gán đối tượng siêu CodeIgniter
                $this->CI =& get_instance();
        }

        public function foo()
        {
                $this->CI->load->helper('url');
                redirect();
        }

        public function bar()
        {
                echo $this->CI->config->item('base_url');
        }

}

Thay thế các thư viện gốc

Để thực hiện điều này ta cần phải đặt tên file và khai báo lớp y hệt như tập tin gốc trong thư viện. Ví dụ như để thay thế thư viện gốc là Email bạn phải tạo một tập tin là application/libraries/Email.php, và khai báo lớp như sau:

class CI_Email {

}

Lưu ý rằng đa số các lớp đều có tên với tiền tố là CI_.

Để tải thư viện bạn định nghĩa thì ta làm như sau:

$this->load->library('email');

Dẫn xuất từ các thư viện gốc

Nếu bạn muốn thêm một vài chức năng nào đó vào thư viện gốc thôi thì bạn không nên thay thế bằng thư viện riêng của bạn, mà đơn giản là bạn chỉ cần tạo một lớp dẫn xuất từ lớp thư viện tương ứng đó. Để thực hiện điều này bạn cần lưu ý hai điều sau:

  • Khai báo lớp phải dẫn xuất từ lớp cha.

  • Lớp mới phải có tên với tiền tố là MY_.

Ví dụ, để thừa kế lớp Email gốc thì ta sẽ tạo một tập tin là application/libraries/MY_Email.php, và trong tập tin bạn khai báo một lớp là:

class MY_Email extends CI_Email {

}

Nếu bạn cần sử dụng một hàm tạo trong lớp thì bạn cần đảm bảo rằng nó phải chứa câu lệnh thừa kế từ hàm tạo của lớp cha:

class MY_Email extends CI_Email {

        public function __construct($config = array())
        {
                parent::__construct($config);
        }

}

Tải lớp thừa kế

Để tải lớp lớp ta cần bỏ qua tiền tố, chẳng hạn muốn tải lớp MY_Email ở trên thì ta làm như sau:

$this->load->library('email');

Sau khi tải xong thì ta có quyền truy cập vào các thành phần của lớp theo dạng sau:

$this->email->some_method();

Thiết lập tiền tố

Để thiết lập tiền tố cho lớp con thì ta mở tập tin application/config/config.php và tìm đến lệnh sau:

$config['subclass_prefix'] = 'MY_';

Xin lưu ý là tất cả các thư viện CodeIgniter đều có tiền tố là CI_ và vì vậy không được sử dụng nó để đặt cho tiền tố của bạn.

» Tiếp: Cú pháp thay thế PHP
« Trước: Thư viện của CI
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!