Gi ớ i thi ệ u
T ổ ng quan
CodeIgniter is an open-source web application framework written in PHP by Rick Ellis, CEO of EllisLab, Inc Originally released on February 28, 2006, the current version is 1.7.2, which was launched on September 11, 2009 The framework was inspired by Ruby on Rails, a web application framework developed in Ruby CodeIgniter is currently maintained by the ExpressionEngine Development Team at EllisLab, Inc.
Nh ững điể m n ổ i b ậ t
Mô hình Model-View-Controller (MVC) giúp tách biệt giao diện và xử lý logic trong phần mềm, tạo điều kiện thuận lợi cho việc thiết kế, bảo trì và mở rộng mã nguồn CodeIgniter áp dụng mô hình này để phân tách các tập tin giao diện và xử lý dữ liệu, từ đó nâng cao khả năng quản lý và dễ dàng bảo trì ứng dụng.
CodeIgniter có kích thước gói cài đặt chỉ 404KB, không bao gồm phần Hướng dẫn Sử dụng, giúp tiết kiệm đáng kể không gian lưu trữ so với các PHP framework khác như CakePHP (1.3MB), Symfony (5.08MB) và Zend Framework (5.66MB).
CodeIgniter được xem là framework PHP nhanh nhất hiện nay, nhờ vào cơ chế lưu trữ nội dung vào bộ đệm (cache) Bằng cách kiểm tra bộ đệm trước khi thực hiện yêu cầu, CodeIgniter giảm thiểu số lần truy cập và xử lý dữ liệu, từ đó tối ưu hóa tốc độ tải trang hiệu quả.
Miễn phí: CodeIgniter được ph|t h{nh dưới giấy phép Apache/BSD mở rộng, cho phép người dùng tựdo thay đổi, phát triển và phân phối mã nguồn
Hỗ trợ Search Engine Optimization: Cấu trúc URL của CodeIgniter rất thân thiện với các robot tìm kiếm
CodeIgniter sở hữu một hệ thống thư viện phong phú, cung cấp các công cụ cần thiết cho những tác vụ phổ biến trong lập trình web như truy cập cơ sở dữ liệu, gửi email, kiểm tra dữ liệu, quản lý session và xử lý ảnh Ngoài ra, nó còn hỗ trợ những chức năng nâng cao như XML-RPC, mã hóa và bảo mật, giúp lập trình viên dễ dàng phát triển ứng dụng web hiệu quả.
Hệ thống bảo mật của CodeIgniter sử dụng cơ chế kiểm tra dữ liệu chặt chẽ, giúp ngăn chặn các lỗ hổng như XSS và SQL Injection, từ đó giảm thiểu nguy cơ bảo mật cho hệ thống.
Nh ững điể m h ạ n ch ế
Chưa hỗ trợ Object-Relational Mapping: Object Relational Mapping
ORM (Object-Relational Mapping) là một kỹ thuật lập trình cho phép ánh xạ các bảng trong cơ sở dữ liệu thành các đối tượng trong chương trình, giúp đơn giản hóa các thao tác CRUD (Create, Read, Update, Delete) và làm cho mã nguồn ngắn gọn hơn Tuy nhiên, hiện tại CodeIgniter vẫn chưa hỗ trợ tính năng ORM.
AJAX (Asynchronous JavaScript and XML) đã trở thành một phần thiết yếu trong các ứng dụng Web 2.0, nâng cao tính tương tác giữa người dùng và hệ thống, mang lại trải nghiệm tương tự như ứng dụng desktop với các thao tác diễn ra ngay lập tức Tuy nhiên, hiện tại CodeIgniter chưa cung cấp thư viện hỗ trợ tích hợp cho AJAX, buộc lập trình viên phải dựa vào các thư viện bên ngoài như jQuery, Script.aculo.us, Prototype hoặc Mootools để phát triển ứng dụng.
CodeIgniter không hỗ trợ một số module thông dụng, điều này khiến nó kém linh hoạt hơn so với các framework khác Cụ thể, CodeIgniter thiếu các module thực thi các tác vụ thường gặp trong quá trình phát triển ứng dụng web như chứng thực người dùng, trình phân tích RSS và trình xử lý PDF.
Chưa hỗ trợ Event-Driven Programming: Event-Driven Programming
EDP (Event-Driven Programming) là nguyên lý lập trình mà trong đó các luồng xử lý của hệ thống được điều khiển bởi các sự kiện như nhấp chuột hoặc gõ phím Mặc dù CodeIgniter không hỗ trợ EDP, điều này không phải là một nhược điểm lớn, vì chỉ có một số ít framework như Prado, QPHP và Yii hiện đang hỗ trợ phương pháp lập trình này.
Cài đặ t
Hệ thống CodeIgniter có khả năng hoạt động trên nhiều hệ điều hành và máy chủ, yêu cầu cài đặt PHP phiên bản 4.x trở lên Ngoài ra, hệ quản trị cơ sở dữ liệu cần hỗ trợ MySQL (4.1+), MySQLi, Microsoft SQL Server, Postgres, Oracle, SQLite và ODBC.
1 Download bộ nguồn CodeIgniter tại website http://codeigniter.com/, phiên bản hiện tại: 1.7.2
2 Mở tập tin application/config/config.php bằng một chương trình soạn thảo, thay đổi giá trị$config['base_url'] Đ}y l{ đường dẫn tuyệt đối đến thư mục CodeIgniter trên server
3 Nếu ứng dụng có tương t|c với cơ sở dữ liệu, thiết lập các giá trị cần thiết trong tập tin application/config/database.php
4 Upload tất cảthư mục và tập tin của CodeIgniter lên server Để nâng cao tính bảo mật hệ thống, người dùng có thể đổi tên thư mục system của CodeIgniter Sau khi đổi tên, người dùng phải thay đổi giá trị biến
$system_folder trong tập tin index.php
Tìm hi ể u
Mô hình Model-View-Controller
Model-View-Control (MVC) là một kiến trúc phần mềm quan trọng trong công nghệ, được công nhận như một mẫu thiết kế hiệu quả Mô hình MVC giúp tách biệt xử lý dữ liệu và giao diện người dùng, tạo điều kiện thuận lợi cho việc phát triển, kiểm tra và bảo trì các thành phần một cách độc lập.
Model là thành phần thể hiện các cấu trúc dữ liệu và thường thực hiện các tác vụ như truy vấn, thêm, xóa và cập nhật dữ liệu Khi có sự thay đổi dữ liệu trong Model, thành phần View sẽ tự động được cập nhật để phản ánh những thay đổi này.
View là thành phần hiển thị dữ liệu từ Model dưới dạng giao diện tương tác với người dùng Mỗi Model có thể đi kèm với nhiều View khác nhau, phục vụ cho các mục đích sử dụng đa dạng.
Controller là trung gian giữa Model và View, nhận thông tin người dùng từ View để xử lý Sau đó, Controller tương tác với Model để truy xuất dữ liệu cần thiết và cuối cùng trả dữ liệu này về cho View.
Mô hình MVC thường được sử dụng trong các ứng dụng web, vì thành phần
View (mã HTML/XHTML) được sinh ra từ các ngôn ngữ lập trình web Thành
Trang 9 phần Controller sẽ nhận các dữ liệu GET/POST, xử lý những dữ liệu n{y, sau đó chuyển sang Model xử lý
Model sẽ trả dữ liệu về phía Controller, sau đó Controller sinh m~ HTML/XHTML để thể hiện trên View.
C ấ u trúc CodeIgniter
Tập tin index.php được xem như controller đầu vào, tiếp nhận các yêu cầu từ phía client và chuyển các yêu cầu này cho hệ thống xử lý
Thư mục system là phần cốt lõi của CodeIgniter, bao gồm các thư viện xây dựng sẵn, tập tin ngôn ngữ và ghi chú hệ thống Trong đó, một số thư mục rất quan trọng cần lưu ý.
• Thư mục application: Dành cho lập trình viên, các tập tin được lập trình cho ứng dụng sẽlưu trong thư mục này
• Thư mục cache : Bộ đệm của hệ thống, chứa c|c trang đ~ được xử lý trước đó
• Thư mục helpers : Chứa các hàm hỗ trợ cho lập trình viên khi viết ứng dụng Thư mục libraries : Chứa c|c thư viện dựng sẵn của CodeIgniter
Trang 10 Đối với lập trình viên, các tập tin của ứng dụng sẽ được lưu trong thư mục system/application Trong đó:
• Thư mục config : Chứa các tập tin cấu hình hệ thống
• Thư mục controllers: chứa các lớp controller
• Thư mục errors : chứa các tập tin lỗi
• Thư mục helpers : chứa các hàm tiện ích do người dùng định nghĩa
• Thư mục hooks : chứa các tập tin để mở rộng mã nguồn CodeIgniter
• Thư mục language : chứa các tập tin ngôn ngữ
• Thư mục libraries : chứa c|c thư viện cho người dùng dùng định nghĩa
• Thư mục models : chứa các lớp model
• Thư mục views : chứa các lớp view
Bạn có thể đổi tên thư mục application thành tên tùy ý và cần thiết lập tên mới cho biến $application_folder trong tập tin index.php Ngoài ra, bạn cũng có thể tạo nhiều ứng dụng trong cùng một cài đặt CodeIgniter bằng cách tạo các thư mục con bên trong system/application, với cấu trúc giống như thư mục application gốc.
For example, consider two applications, foo and bar The directory structure would be as follows: system/application/foo/ and system/application/bar/, each containing subdirectories for config, controllers, errors, libraries, models, and views To determine which application the index.php file will execute, we need to redefine the value of the $application_folder variable.
Dòng ch ả y d ữ li ệ u trong CodeIgniter
Hình 3:Sơ đồ thể hiện dòng chảy dữ liệu trong CodeIgniter
1 Tập tin index.php đóng vai trò l{m controller đầu vào, thiết lập các tài nguyên cần thiết cho hệ thống
2 Routing: Qu| trình điều hướng giúp x|c định các yêu cầu v{ hướng xử lý đối với chúng
3 Caching: Nếu dữ liệu được yêu cầu đ~ được lưu trong bộ đệm, CodeIgniter sẽ trả dữ liệu trong bộđệm về phía client Quá trình xử lý kết thúc
4 Security: Dữ liệu trước khi được chuyển đến các Controller sẽđược lọc để phòng chống XXS hoặc SQL Injection
5 Application Controller: Controller xử lý dữ liệu nhận được bằng cách gọi đến c|c Models, Libraries, Helpers, Plugins…có liên quan
6 View: Dữ liệu được chuyển qua View để hiển thị cho người dùng Nếu chức năng caching được bật, dữ liệu sẽ được lưu trong cache cho những lần yêu cầu tiếp theo
Trong quá trình phát triển ứng dụng, đôi khi cần xen kẽ các bước trong sơ đồ xử lý Ví dụ, trước khi một controller được gọi, có thể muốn ghi lại log vào tập tin hệ thống CodeIgniter cung cấp cơ chế hook để thực hiện điều này Để kích hoạt hook, bạn cần thay đổi giá trị của biến $config['enable_hooks'] trong tập tin application/config/config.php.
C|c hook được khai báo trong tập tin application/config/hooks.php, có mẫu sau:
• class: tên lớp sẽ được gọi Nếu chỉ sử dụng một hàm thủ tục, ta có thể bỏ trống giá trị này
• function: tên h{m/phương thức sẽđược gọi
• filename: tên tập tin chứa lớp/h{m đó
Đường dẫn đến tập tin hook được xác định dựa trên vị trí của nó trong thư mục Nếu tập tin nằm trong thư mục application/hooks, chỉ cần đặt giá trị là "hooks" Ngược lại, nếu tập tin nằm trong thư mục application/hooks/utilities, giá trị sẽ là "hooks/utilities" Lưu ý rằng không nên có dấu "/" ở cuối đường dẫn.
• params: các tham sốđược truyền vào cho hàm
Khóa pre_controller cho biết thời điểm hook n{y được thực hiện CodeIgniter hỗ trợ các thời điểm sau:
• pre_system: được gọi khi hệ thống vừa khởi động Ởgiai đoạn này chỉ có lớp benchmark v{ c|c hook được kích hoạt Các tiến trình khác vẫn chưa xảy ra
• pre_controller: được gọi trước khi các controller hoạt động Các tiến trình routing v{ security đ~ được thực hiện
• post_controller_constructor: được gọi ngay sau khi hàm tạo của controller được thi hành Các hàm trong controller vẫn chưa được gọi
• post_controller: được gọi ngay sau khi controller thực hiện xử lý yêu cầu
Để hoàn tất nội dung trang trước khi gửi đến trình duyệt người dùng, bạn cần thực hiện việc chồng (override) hàm display() trong display_override Nội dung trang có thể được lấy bằng cách gọi $this->CI->output.
• cache_override: thực hiện việc chồng hàm _display_cache() để lấy trang trong bộđệm
• scaffolding_overrid e : không sử dụng từ CodeIgniter 1.6
• post_system: được gọi sau khi hệ thống đ~ thực hiện xong một yêu cầu.
CodeIgniter URL
Cấu trúc URL trong CodeIgniter sử dụng các segment thay vì kiểu query truyền thống, giúp tạo ra các URL ngắn gọn, dễ nhớ và thân thiện với SEO Một URL trong CodeIgniter có định dạng như sau: domain.com/index.php/controller/method/param/
• Segment controller là tên của lớp controller được gọi
• Segment method là tên của phương thức trong lớp controller ở trên
• Segment param l{ c|c đối số của phương thức đó
URI domain.com/index.php/product/view/1 có nghĩa là gọi phương thức view() trong lớp Product với đối số là 1 Điều này liên quan đến định tuyến URI (URI Routing).
URI như domain.com/index.php/product/view/appple-ipad-1 thân thiện hơn với các bộ máy tìm kiếm so với domain.com/index.php/product/view/1 CodeIgniter cho phép lập trình viên tùy chỉnh cách xử lý URL thông qua tính năng Định hướng URI trong tập tin application/config/routes.php Tập tin này chứa mảng $route, với khóa là URI mới và giá trị là URI cũ, và các quy luật được ưu tiên theo thứ tự từ trên xuống CodeIgniter cũng hỗ trợ sử dụng ký tự đại diện (wildcard), với hai ký tự đại diện được quy định sẵn.
• :numtương ứng với các giá trị số
• :anytương ứng với bất kỳ giá trị nào
$route['product/view/(:num)'] = "product/view/$1"; Ý nghĩa: Gọi đến phương thức view() trong lớp Product với tham số truyền vào là giá trị kiểu số
$route['product/:any'] = "product/find_product"; Ý nghĩa: Tất cả các yêu cầu bắt đầu bằng product sẽ gọi đến hàm find_product() của lớp Product
Ta cũng có thể sử dụng biểu thức chính quy (Regular Expression) để thiết lập các quy luật Chẳng hạn:
Thêm hậu tố vào URL
Các bộ máy tìm kiếm có xu hướng thân thiện hơn với các tập tin HTML Bằng
Trang 14 c|ch thay đổi giá trị biến $config['url_suffix'] trong tập tin system/application/config/config.php, ta có thể thêm hậu tố HTML hay bất cứ hậu tố nào khác vào cho URL Ví dụ, với $config['url_suffix'] = '.html', URL của ta sẽ như sau: domain.com/index.php/controller/method/param.html
Loại bỏ chuỗi index.php trong URL
Theo mặc định, chuỗi index.php được thêm v{o URL Để loại bỏ chuỗi này, ta có thể sử dụng một tập tin htaccess có nội dung như sau:
RewriteCond $1 !^(index\.php|resources|robots\.txt)
Model
Model là các lớp được thiết kế để trao đổi thông tin với cơ sở dữ liệu, thực hiện các tác vụ như truy vấn, thêm, xóa và cập nhật dữ liệu Trong CodeIgniter, việc khai báo lớp model cho một thực thể không bắt buộc, vì có thể sử dụng thư viện database trong controller để thao tác với cơ sở dữ liệu Tuy nhiên, việc xây dựng lớp model cho mỗi thực thể được khuyến khích để thuận tiện trong quản lý.
Một lớp model chuẩn trong CodeIgniter có cấu trúc như sau: class Example_model extends Model {
* @param kiểu dữ liệu $param mô tả biến
Khi khai báo một lớp model, ta cần tuân theo một số quy tắc:
• Tên lớp được viết hoa chữ đầu tiên, phần còn lại viết thường Ví dụ:
File names should be the same as the class names and are stored in the application/models/ directory Subdirectories can be created for better organization, such as application/models/user_model.php, application/models/front_end/blog_model.php, and application/models/back_end/article_model.php.
Lớp con phải kế thừa từ lớp Model và trong hàm tạo của nó, cần gọi hàm tạo của lớp cha Để sử dụng model trong controller, bạn có thể sử dụng đoạn mã sau:
$this->load->model('model_name');
Để sử dụng lớp model, cần chỉ định tên lớp model và đường dẫn đến thư mục nơi lớp đó được lưu trữ Chẳng hạn, lớp Blog_model được lưu trong thư mục application/models/front_end/blog_model.php Đoạn mã sau đây sẽ giúp bạn sử dụng lớp này.
$this->load->model('front_end/blog_model');
Sau khi load lớp model, ta có thể sử dụng lớp n{y trong chương trình bằng cách gọi
$this->model_name->method(); Để gán một tên khác cho lớp model khi sử dụng trong chương trình, ta có thể truyền vào tham số thứhai như sau:
$this->load->model('model_name', 'ModelName');
Khi đó, để sử dụng c|c phương thức của lớp model, ta gọi:
View
View là các tập tin HTML được thiết kế để hiển thị dữ liệu từ model dưới dạng giao diện tương tác với người dùng Nó có thể là một trang web đầy đủ hoặc chỉ là một phần của trang như header, footer hay sidebar.
Nội dung của tập tin view, ngoài mã HTML còn có thể chứa mã PHP View không bao giờđược gọi trực tiếp mà phải thông qua controller
Trang 16 Để sử dụng view trong controller, ta sử dụng đoạn mã sau:
$this->load->view('view_name', $data);
Trong đoạn mã này, `view_name` đại diện cho tên của view, trong khi `$data` chứa các dữ liệu cần hiển thị Tương tự như model, bạn có thể tổ chức và lưu trữ view trong các thư mục để dễ dàng quản lý.
Khi sử dụng, chỉ cần khai b|o đường dẫn tương đối đến thư mục chứa view
Ví dụ tập tin header.tpl.php được lưu trong thư mục application/views /front_end Để hiển thị view này, ta sử dụng đoạn mã sau:
$this->load->view('front_end/header.tpl');
CodeIgniter allows the use of multiple views within a single controller method, enabling the combination of data across these views For instance, in a class Example that extends Controller, the method showExample can return results that integrate various view components seamlessly.
$this->load->view('header.tpl');
$this->load->view('content.tpl');
$this->load->view('sidebar.tpl'); $this->load-
} Để hiển thị dữ liệu trong model ra view, ta có thể truyền một mảng hoặc đối tượng l{m đối số thứ hai khi load view Ví dụ:
'email' => 'maxwell.smart@control.org',
$this->load->view('employee_detail', $data);
$this->load->view('employee_detail', $objEmployee);
Trong quá trình xử lý, các khóa của mảng hoặc thuộc tính của đối tượng sẽ được chuyển đổi thành các biến để sử dụng trong tập tin view Dưới đây là nội dung mẫu của tập tin employee_detail.php:
Trong lập trình, chúng ta có thể sử dụng các cấu trúc điều khiển như if, else, switch…case và các vòng lặp như for, while, do…while bên trong view để hiển thị dữ liệu Ví dụ, đoạn mã dưới đây sẽ giúp hiển thị danh sách các nhân viên.
$data['employeeList'] = $this->EmployeeModel->getAllEmployee(); $this-
>load->view('employee_list', $data);
Tập tin employee_list.php