Hướng dẫn custom bộ core codeigniter
Có khi nào bạn đặt câu hỏi có nên sửa các file nằm trong bộ core của codeigniter? Tôi sẽ trả lời cho bạn là không nên sửa các file nằm trong hệ thống core, library của codeigniter vì nếu làm như vậy sau này CI nâng cấp lên phiên bản mới thì coi như bộ source của bạn khó có thể nâng cấp theo. Vậy có cách nào ta có thể can thiệp vào? câu trả lời là CI cung cấp cho ta một chức năng dùng để overwrite các hàm trong core một cách dễ quản lý nhất, đó chính là thư mục core trong application.
Bài này chỉ mang tính chất giải thích cho bạn biết cách viết Overwrite lại bộ core codeigniter chứ không hướng dẫn một chức năng cụ thể nào, bạn hay xem như bài này bổ trợ kiến thức Codeigniter cho bạn.
Ghi đè các hàm trong lớp CI_Loader
Trước tiên tôi muốn bạn mở fiel system/core/loader.php
và tìm hểu trong file này có những gì. Trong này có một lớp CI_Loader và có tất cả những hàm mà bạn sử dụng ở controller. Ví dụ như với đoạn code $this->load->view()
thì tương ứng trong lớp CI_Loader có hàm function view()
, tương tự cho các hàm load model, load language, ....
Đôi lúc các bạn muốn ghi đè lên một số function như function load view, load model, load language nhưng bạn không biết làm như thế nào, giải pháp cho bạn là bạn tạo một file với tên MY_Loader
đặt trong thư mục core của application như hình bên dưới.
Bài viết này được đăng tại [free tuts .net]
Sau đó bạn copy nội dung sau vào file MY_Loader
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); class MY_Loader extends CI_Loader { function __construct() { parent::__construct(); } function view($view, $vars = array(), $return = FALSE){ die ('BAN DANG LOAD VIEW '.$view); } } ?>
Sau đó bạn tạo một controller với tên là welcome.php, và copy nội dung này vào
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); class Welcome extends CI_Controller { public function index() { $this->load->view('welcome_message'); } } ?>
Sau đó bạn chạy controller lên trên màn hình sẽ xuất hiện dòng chữ "BAN DANG LOAD VIEW welcome_message", như vậy là hàm view
trong lớp MY_Widget
đã overwrite lại hàm view
trong lớp CI_Loader
nên khi ta gọi $this->load->view()
nó sẽ gọi đến hàm view trong lớp MY_Widget
.
Như vậy ta có kết luận như sau: Khi ta tạo bất kì một lớp nào nằm trong thư mục core của application mà có phần đuôi sau (tức là phần bỏ đi chữ MY_) trùng với phần đuôi sau của một nào đó nằm trong thư mục core của System (bỏ đi chữ CI_) thì hệ thống sẽ tự động require file đó và coi nó như là file core của CI thay vì file gốc.
Nếu file MY_{name} không kế thừa (extends) lớp CI_{name} thì hệ thông cũng không báo sai, nhưng lúc này nếu ta sử dụng một hàm nào đó trong lớp CI_{name} thì sẽ bị báo lỗi, như đoạn code bên trên tôi đã extends lớp CI_Loader nên đó là đoạn code đúng.
Ghi đè lên các lớp CORE khác
Với các hàm khá thì tương tự như ví dụ trên, các bạn chỉ cần tạo tên file có chữ MY_
với tên file bạn muốn overwrite, ví dụ MY_View, MY_Model, MY_Controller, ....
Bạn có thắc mắc chữ MY_ đâu ra không? nó nằm trong file appliation/config/config.php, các bạn tìm đến dòng 109 $config['subclass_prefix'] = 'MY_';
. Nếu bạn không muốn chữ MY thì có thể đặt một tên bất kì, ví dụ $config['subclass_prefix'] = 'FTUTS_'
thì những file bạn muốn overwrite phải đặt lại tên là FTUTS_Loader, FTUTS_Model. FTUTS_View, ....
Lời Kết
Qua bài trên các bạn đã biết được chức năng của thư mục core
rồi đúng không nào, các bạn phải hiểu rằng muốn nắm được bộ source codeigniter thì ta phải nắm được quy trình hoạt động, các instance và có thể custom bộ core của codeigniter... Vì thế mình mới tạo topic này với hy vọng giải đáp được thắc mắc của một số bạn, và cũng từ bài này tôi có thể viết các bài nâng cao hơn.