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.
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.
·
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.
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()
{
}
}
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
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.
Để 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');
}
}
Đơ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 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 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();
Để 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
Không có nhận xét nào:
Đăng nhận xét