NTM Solutions

Facebook Youtube Google+

Thứ Tư, 28 tháng 11, 2018

Tự học CodeIgniter-Bài 08-Tạo thư viện


#hoccodeigniter


Khi chúng ta đụng tới “Thư viện” nghĩa là chúng ta đang đề cập đến các lớp đặt ở thư mục của thư viện và được mô tả trong phần Class Reference của user guide. Trong trường hợp này, tuy nhiên thay vào đó chúng ta sẽ mô tả cách tạo các thư viện bên trong thư mục application/libraries nhằm mục đích tách riêng 02 phần: thư viện do lập trình viên tạo và thư viện toàn cục của framework.

Giá trị cộng thêm ở đây là CodeIgniter cho phép các thư viện của bạn có thể thừa kế các lớp gốc có sẵn nếu bạn đơn giản chỉ muốn thêm vào thư viện tính năng mới nào đó. Hoặc bạn có thể thay thế thư viện gốc chỉ bằng cách đặt các phiên bản cùng tên trong thư mục application/libraries

Túm lại:


·         Bạn có thể tạo thư viện mới hoàn toàn.

·         Bạn có thể mở rộng từ các thư viện gốc.

·         Bạn có thể thay thế thư viện gốc.

Các mục dưới đây sẽ lần lượt giải thích chi tiết 03 phần này.

Ghi chú:

Các lớp cơ sở dữ liệu không thể được mở rộng hoặc thay thế bởi các lớp do người dùng tạo. Ngoài ra các lớp khác thì được.

Lưu trữ

Các lớp thư viện của bạn cần phải đặt tại thư mục application/libraries , vì đó là nơi CodeIgniter sẽ tìm kiếm chúng khi bắt đầu quá trình khởi tạo.

Cách đặt tên

·         Tên tập tin phải viết Hoa đầu từ. Ví dụ: Myclass.php

·         Tên lớp cũng phải viết Hoa đầu tử. Ví dụ: class Myclass

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

Tập tin chứa lớp

Các lớp phải có dạng cơ bản như cấu trúc sau:

<?php

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



class Someclass {



        public function some_method()

        {

        }

}



Sử dụng lớp

Từ bất kỳ phương thức nào bên trong Controller bạn có thể khởi tạo lớp của bạn bằng cách dùng phương thức sau:

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

Ngay chỗ “someclass” là tên tập tin nhưng không có phần đuôi “.php” . Bạn không cần viết Hoa đầu từ ở đây vì CodeIgniter không quan tâm.

Một khi đã tải bạn có thể truy cập lớp của bạn với tên viết thường toàn bộ:

$this->someclass->some_method();  // Các thể hiện của đối tượng luôn là viết thường



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

Trong phương thức tải thư viện bạn có thể truyền dữ liệu 01 cách động như 01 mảng thông qua tham số thứ 02 và nó sẽ truyền vào phần khởi tạo của lớp:

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



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

Nếu bạn dùng tính năng này bạn phải thiết lập phần khởi tạo lớp có khai báo tham số để truyền dữ liệu:

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



class Someclass {



        public function __construct($params)

        {

                // Làm gì đó với biến $params

        }

}

Bạn cũng có thể truyền tham số lưu trong tập tin cấu hình. Đơn giản là ta tạo 01 tập tin cấu hình trùng tên với lớp và lưu chúng tại thư mục application/config/ . Chú ý rằng nếu bạn truyền tham số 01 cách động như đã mô tả ở trên, tùy chọn dùng tập tin cấu hình này sẽ không xài được.

Sử dụng tải nguyên CodeIgniter bên trong thư viện

Để truy cập các tài nguyên CodeIgniter bên trong thư viện của bạn dùng phương thức get_instance() . Phương thức này trả về 01 siêu đối tượng CodeIgniter.

Thông thường từ bên trong các phương thức controller bạn sẽ gọi bất kỳ các phương thức nào sẵn có của CodeIgniter bằng cách dùng cấu trúc $this

$this->load->helper('url');

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

$this->config->item('base_url');

// etc.

$this, tuy nhiên nó chỉ hoạt động được trực tiếp bên trong các controllers, models, hoặc views. Nếu bạn muốn dùng các lớp của CodeIgniter từ bên trong các lớp của bạn tạo -> bạn cần làm như sau:

Đầu tiên, gán đối tượng CodeIgniter vào 01 biến:

$CI =& get_instance();

Khi bạn gán đối tượng vào 01 biến, Bạn sẽ sử dụng biến đó thay vì dùng biến $this

$CI =& get_instance();



$CI->load->helper('url');

$CI->load->library('session');

$CI->config->item('base_url');

// etc.

Ghi chú:

Bạn sẽ chú ý hàm get_instance() ở trên đang được truyền vào thông qua phần tử trung gian:

$CI =& get_instance();

Điều này là rất quan trọng. Việc gán vào thông qua trung gian cho phép bạn dùng đối tượng CodeIgniter gốc hơn là tạo ra 01 phiên bản tương tự.

Tuy vậy, bởi vì 01 thư viện là 01 lớp, nên sẽ tốt hơn nếu bạn có thể dùng đầy đủ các đặc tính hướng đối tượng. Vì vậy để có thể dùng siêu đối tượng CodeIgniter trong tất cả các phương thức của lớp, khuyến khích các bạn nên gán siêu đối tượng này thành 01 thuộc tính của lớp:

class Example_library {



        protected $CI;



        // Chúng ta sẽ dùng 01 hàm khởi tạo, vì bạn không thể gọi trực tiếp 01 hàm

        // từ 01 thuộc tính lớp.

        public function __construct()

        {

                // Gán siêu đối tượng 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ế thư viện gốc bằng phiên bản mới

Đơn giản bằng cách đặt tên các tập tin lớp trùng tên với 01 thư viện gốcsẽ làm cho CodeIgniter dùng nó thay vì dùng phiên bản gốc. Để dùng tính năng này bạn phải đặt tên tập tin và tên lớp trùng khớp tên thư viện gốc. Ví dụ, để thay thế thư viện gốc Email bạn sẽ tạo 01 tập tin tên là application/libraries/Email.php, và đặt tên lớp là :

class CI_Email {



}

Hãy chú ý rằng hầu hết các lớp gốc có phần đầu là chữ CI_

Để tải thư viện của bạn-> bạn sẽ dùng phương thức tải tiêu chuẩn sau:

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

Ghi chú:

Vào thời điểm này(2018), các lớp cơ sở dữ liệu không thể thay thế bằng phiên bản của người dùng được.

Mở rộng các thư viện gốc

Mở rộng 01 lớp gần giống như là thay thế 01 lớp với 01 vài điểm khác biệt:

·         Lớp mới phải thừa kế lớp gốc.

·         Tên lớp mới và tên tập tin phải bắt đầu bằng chữ MY_ (phần này có thể cấu hình được. Xem phần dưới sẽ rõ).

Ví dụ, để mở rộng lớp gốc Email bạn sẽ tạo 01 tập tin tên là: application/libraries/MY_Email.php, và khai báo lớp như sau:

class MY_Email extends CI_Email {



}

Nếu bạn cần dùng 01 phương thức khởi tạo trong lớp của bạn->nhất thiết phải được thừa kế từ phương thức khởi tạo của lớp gốc:

class MY_Email extends CI_Email {



        public function __construct($config = array())

        {

                parent::__construct($config);

                // Your own constructor code

        }



}

Ghi chú:

Không phải tất cả thư viện có cùng (hay bất kỳ) tham số trong phần khởi tạo. Hãy xem qua về thư viện mà bạn khai báo thừa kế trước để xem cách nó thực thi ra sao.

Tải Sub-class

Để tải sub-class bạn sẽ dùng cú pháp cơ bản như thường lệ. KHÔNG có phần prefix. Ví dụ , để tải lớp trong ví dụ trên thừa kế từ lớp gốc Email ta sẽ dùng cú pháp sau:

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

Khi tải được lớp rồi các biến của lớp cứ sử dụng như bình thường dùng lớp gốc. Trong trường hợp này để gọi các phương thức lớp email ta dùng như sau:

$this->email->tên_phương_thức();

Thiết lập phần Prefix

Để thay đổi phần prefix của sub-class-> mở tập tin: application/config/config.php và tìm giá trị sau:

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

Hãy chú ý rằng tất cả thư viện gốc CodeIgniter bắt đầu bằng chữ CI_ vậy nên TUYỆT ĐỐI KHÔNG dùng chữ này cho phần prefix của bạn.

Nếu vẫn chưa rõ các bạn xem thêm video clip sau:




By #tiensim

Nguồn: User Guide – General Topics