12/08/2018, 09:25

Tạo mới và sử dụng thư viện trong CodeIgniter

Một thư viện Codeigniter là một tập hợp các chức năng cố định, có tính logic cao và hợp lý, được thể hiện dưới dạng các lớp, cũng tương tự như các controller và model. Tuy nhiên các libraries lại được dùng để cung cấp các chức năng bên ngoài các controllers. Bài viết này sẽ tập trung hướng dẫn ...

Một thư viện Codeigniter là một tập hợp các chức năng cố định, có tính logic cao và hợp lý, được thể hiện dưới dạng các lớp, cũng tương tự như các controller và model. Tuy nhiên các libraries lại được dùng để cung cấp các chức năng bên ngoài các controllers.

Bài viết này sẽ tập trung hướng dẫn các bạn cách tạo mới một thư viện và sử dụng thư viện đó trong hệ thống CodeIgniter.

Việc nâng cấp hoặc mở rộng những thư viện được dựng sẵn trong hệ thống cũng khá đơn giản, bạn có thể thêm xử lý, điều chỉnh xử lý hoặc thay thế hoàn toàn những xử lý có sẵn bên trong thư viện cũ đó bằng cách ghi đè phiên bản của thư viện trong thư mục application/libraries của bạn.

Tóm lược bài viết sẽ hướng dẫn cách:

  • Tạo một thư viện hoàn toàn mới của riêng bạn
  • Mở rộng những thư viện đã có sẵn của hệ thống
  • Thay thế hoàn toàn những thư viện cũ

Lưu ý: Ngoại trừ việc không thể ghi đè lớp thư viện database giúp thao tác và quản lý connection thì tất cả các lớp thư viện khác đều có thể mở rộng

Lưu trữ - Storage

Lớp thư viện của bạn nên được đặt trong thư mục application/libraries đây là nơi mặc định hệ thống sẽ load các thư viện khi khởi tạo. Bạn có thể đặt ở nơi khác nhưng phải cấu hình lại đường dẫn thư viện

Quy ước khi đặt tên

  • Tên file phải bắt đầu bằng một ký tự hoa và không chứa ký tự đặc biệt. VD: Mycar.php
  • Tên lớp phải bắt đầu bằng một ký tự hoa và không chứa ký tự đặc biệt. VD: class Mycar
  • Tên file phải trùng với tên lớp

Tóm lại: tên file và tên lớp phải trùng với nhau, phải bắt đầu bằng một ký tự in hoa và không được chứa ký tự đặc biệt.

Nguyên mẫu

Một lớp thư viện phải có nguyên mẫu cơ bản như sau

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

class Mycar {
    public function turn_left(){
        //code here ...
    }

    public function turn_right($sound){
        //code here ...
    }

    public function go_along(){
        //code here
        return true; //Giá trị minh họa
    }

    public function stop($postion){
        //code here
        return true; //Giá trị minh họa
    }
}
/* File Mycar.php */

Ở mọi function nào trong bất kỳ controller nào bạn cũng có thể load thư viện mà bạn muốn dùng bằng câu lệnh

$this->load->library('Tên thư viện muốn gọi');

//Example: load Mycar class

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

Để sử dụng những function ở bên trong thư viện chúng ta có thể sử dụng câu lệnh

$this->ten_thu_vien->ten_function(doi_so_neu_co);

//Ví dụ: chúng ta sẽ gọi function turn_left của thư //viện Mycar trong file Mycar.php
$this->Mycar->turn_left(); //Không có đối số truyền vào và trả về

//Ví dụ: chúng ta sẽ gọi function turn_right có đối số truyền vào
$this->Mycar->turn_right('olala');

//Ví dụ: chúng ta sẽ gọi function go_along có đối số trả về
$result = $this->Mycar->go_along();

//Ví dụ: chúng ta sẽ gọi function stop có đối số truyền vào và trả về
$result = $this->Mycar->stop('low');

Ngoài ra bạn cũng có thể truyền trực tiếp đối số (một giá trị hoặc một mảng các giá trị) khi load thư viện bằng cách sau

$params = array('type' => 'large', 'color' => 'red');
$this->load->library('Mycar', $params);

Trong lớp Mycar ở function __construct() chúng ta nhận về param để sử dụng

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

class Mycar {
    public function __construct($params){
        //Sử dụng param...
    }

    .........................
}
/* File Mycar.php */

Trong thư viện của bạn muốn sử dụng cái tài nguyên của hệ thống thì chúng ta phải sử dụng một siêu object được trả về từ function get_instance() Thông thường ở các class trong controller chúng ta sẽ gọi các resource có sẵn một cách dễ dàng như sau

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

Nếu bạn sử dụng các tài nguyên của hệ thống trong lớp thư viện của bạn thì chúng ta sẽ phải làm như sau:

$CI =&get_instance();
$CI->load->helper('url');
$CI->load->library('session');
$CI->config->item('base_url');
vv...

Để thay thế hoàn toàn xử lý của một thư viện có sẵn trong framework bằng một thư viện của bạn chúng ta dễ dàng thực hiện bằng cách đặt tên file và tên lớp giống hệt với tên thư viện của hệ thống. Ví dụ nếu bạn muốn thay thế hoàn toàn xử lý của class Email trên hệ thống bạn chỉ việc tạo ra thư viện Email trong application/libraries/Email.php với khai báo nhưu sau

class CI_Email {
    //content
}

//Chú ý: hầu hết các thư viện của CI framework thì đều bắt đầu bằng tiền tố CI_

Việc thay thế xử lý không thể sử dụng cho class database

Để load thư viện Email chúng ta sử dụng cú pháp bình thường

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

Trong trường hợp bạn thấy thư viện viết sẵn của hệ thống vẫn thiếu một vài xử lý nhỏ để đáp ứng nhu cầu giải quyết bài toán bạn có thể viết lại tuy nhiên điều này là không cân thiết. Bạn chỉ cần mở rộng thư viện đã có để bổ sung thêm những xử lý bạn muốn là được. Ví dụ bạn muốn mở rộng thư viện Email có sẵn của hệ thống bạn sẽ tạo ra một class mới là My_Email nằm ở đường dẫn application/libraries/MY_Email.php

class MY_Email extends CI_Email {

    public function __construct()
    {
        parent::__construct(); //Bạn có thể bỏ di nếu không muốn kế thừa construct của lớp cha
    }
}

Thiết lập những tiền tố riêng cho thư viện mở rộng
==================================================

Nếu bạn muốn thay đổi những thiết lập tiền tố mặc định của hệ thống. Bạn chỉ cần mở file config **application/config/config.php** và tìm đến dòng sau
```php

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

Bạn chỉ cần chỉnh 'MY_' theo tiền tố mà bạn muốn.

Mặc định thư viện của hệ thống CI sử dụng tiền tố là CI_ nên bạn sẽ không được phép chọn tiền tố này.

Kính chúc các bạn tạo thành công thư viện. Bài viết có tham khảo bộ tài liệu chính thức của CI v2.2.0

Framgia-Tran Duc Liem

0