MVC PHP - Xây dựng file Bootstrap và Controller chính
Bài này khá đơn giản vì bạn chỉ cần tạo các folder trong hệ thống xử lý của CORE và viết code cho file bootstrap, file Controller chính trong mô hình MVC. Tuy nói là đơn giản nhưng bạn cũng phải hiểu ý nghĩa của từng file để qua bài sau ta tiến hành code sẽ dễ dàng hơn.
Trước khi vào vấn đề chính mình xin nhắc lại một chút, vì mình chỉ hướng dẫn xây dựng một module quản lý tin tức MVC nên rất đơn giản và không code cho frontend nên bạn hãy xóa đi folder site
và file index.php
nhé.
1. Xây dựng cấu trúc folder System trong MVC
Note: Nếu bạn chưa xem bài trước thì quay lại để xem cấu trúc folder MVC.
Trong phần này ta chỉ quan tâm đến các file và folder bên trong system
nên mình sẽ không show các folder trong admin
nhé.
Bài viết này được đăng tại [free tuts .net]
Các bạn xem hình dưới đây:
Các bạn thấy folder system
mình đã bổ sung một số file và folder như trong hình và có giải thích ý nghĩa của nó nên mình không giải thích gì thêm. Và mình có xóa đi folder site
và file index.php
ngoài cùng rồi nhé.
2. Xây dựng lớp Controller chính
Lớp controller chính nằm trong file system/core/FT_Controller.php
. Bạn mở file này lên và thêm vào nội dung sau:
<?php if ( ! defined('PATH_SYSTEM')) die ('Bad requested!'); /** * @package FT_Framework * @author Freetuts Dev Team * @email freetuts.net@gmail.com * @copyright Copyright (c) 2015 * @since Version 1.0 * @filesource system/core/FT_Controller.php */ class FT_Controller { // Đối tượng view protected $view = NULL; // Đối tượng model protected $model = NULL; // Đối tượng library protected $library = NULL; // Đối tượng helper protected $helper = NULL; // Đối tượng config protected $config = NULL; /** * Hàm khởi tạo * * @desc Load các thư viện cần thiết */ public function __construct() { } /** * Hàm chạy ứng dụng * * @desc tham số truyền vào gồm controller và action */ public function load($controller, $action) { } }
Trong đó bạn cần chú ý đến những vấn đề sau:
- Phía trên cùng mình có sử dụng một đoạn kiểm tra một hằng số tồn tại không và nếu không tồn tại thì thoát khỏi chương trình. Đoạn code này giúp bảo vệ an toàn cho hệ thống vì hằng số
PATH_SYSTEM
chỉ tồn tại khi ban gọi thông qua file bootstrap. - Tại hàm
load()
có hai tham số truyền vào là controller và action. Đây cũng chính là hàm sẽ chạy ứng dụng
3. Tạo các hằng số cấu hình trong config
Bạn mở file system/config/config.php
lên và điền nội dung sau vào:
<?php // Thông số database define('DB_HOST', 'localhost'); define('DB_USER', 'root'); define('DB_PASSWORD', ''); // Thông số controller và action mặc định define('CONTROLLER_DEFAULT', 'index'); define('ACTION_DEFAULT', 'index');
Trong đó có hai loại:
- Hằng số cấu hình database
// Thông số database define('DB_HOST', 'localhost'); define('DB_USER', 'root'); define('DB_PASSWORD', '');
- Hằng số xác định controller mặc định và action mặc định
// Thông số controller và action mặc định define('CONTROLLER_DEFAULT', 'index'); define('ACTION_DEFAULT', 'index');
4. Viết code cho file bootstrap
Bây giờ ta sẽ tiến hành viết code cho file bootstrap admin.php
ở ngoài cùng của project mvc
.
Trước khi vào vấn đề chính thì mình có một số lưu ý như sau:
- Tất cả các request sẽ vào file
admin.php
và file này nó sẽ dựa vào URL để gọi tới controller và action tương ứng - URL của chúng ta có dạng domain.com/admin.php?c={controller}&a={action}, có nghĩa khi người dùng gọi controller nào thì sẽ truyền cho tham số
c
và gọi action nào thì truyền vào tham sốa
. - Nếu người dùng không gọi controller hoặc action nào thì sẽ lấy các giá trị
CONTROLLER_DEFAULT
vàACTION_DEFAULT
trong filesystem/config/config.php
mà ta đã tạo ở phần 3.
Bây giờ bạn nhập nội dung sau vào file admin.php
.
<?php // Đường dẫn tới hệ thống define('PATH_SYSTEM', __DIR__ .'/system'); define('PATH_APPLICATION', __DIR__ . '/admin'); // Lấy thông số cấu hình require (PATH_SYSTEM . '/config/config.php'); // Danh sách tham số gồm hai phần // - controller: controller hiện tại // - action: action hiện tại $segments = array( 'controller' => '', 'action' => array() ); // Nếu không truyền controller thì lấy controller mặc định $segments['controller'] = empty($_GET['c']) ? CONTROLLER_DEFAULT : $_GET['c']; // Nếu không truyền action thì lấy action mặc định $segments['action'] = empty($_GET['a']) ? ACTION_DEFAULT : $_GET['a']; // Require controller require_once PATH_SYSTEM . '/core/FT_Controller.php'; // Chạy controller $controller = new FT_Controller(); $controller->load($segments['controller'], $segments['action']);
Các phần comment mình đã giải thích quá kỹ rồi. Bạn chỉ lưu ý thêm các vấn đề sau:
- require file
syste/core/config.php
để lấy các hằng số - require file
system/core/FT_Controller.php
để tạo lớpFT_controller
, đây là controller chính - gọi tới hàm
load()
trong controller chính
5. Viết code cho hàm load trong file FT_Controller.php
Trước khi vào vấn đề thì mình đưa ra quy luật của controller như sau.
- Tất cả các controller của ứng dụng (ứng dụng ở đây chính là folder
admin
) đề nằm trong folderadmin/controller
- Tên của controller phải ở dạng
Controllername_Controller.php
. Trong đóControllername
là tên mà bạn muốn đặt cho controller - Class của controller cũng phải giống tên file của nó, nghĩa là sẽ có tên
Controllername_Controller
Các bạn xem hình tham khảo:
Bây giờ bạn mở file system/core/FT_Controller.php
lên, tìm tới hàm load()
và gõ nội dung sau vào:
public function load($controller, $action) { // Chuyển đổi tên controller vì nó có định dạng là {Name}_Controller $controller = ucfirst(strtolower($controller)) . '_Controller'; // chuyển đổi tên action vì nó có định dạng {name}Action $action = strtolower($action) . 'Action'; // Kiểm tra file controller có tồn tại hay không if (!file_exists(PATH_APPLICATION . '/controller/' . $controller . '.php')){ die ('Controller không tồn tại'); } require_once PATH_APPLICATION . '/controller/' . $controller . '.php'; // Kiểm tra class controller có tồn tại hay không if (!class_exists($controller)){ die ('Controller không tồn tại'); } // Khởi tạo controller $controllerObject = new $controller(); // Kiểm tra action có tồn tại hay không if ( !method_exists($controllerObject, $action)){ die ('Action không tồn tại'); } // Gọi tới action $controllerObject->{$action}(); }
Bạn chú ý trong code mình có dùng một số hàm chuyển đổi chuỗi như ucfirst, strtolower để đổi tên controller theo quy luật mà mình nói ở trên.
6. Tạo mới một controller và test
Bây giờ bạn cần tạo một file News_Controller.php
nằm trong folder admin/controller
nhé, sau đó copy nội dung sau vào:
<?php if ( ! defined('PATH_SYSTEM')) die ('Bad requested!'); class News_Controller { public function indexAction() { echo '<h1>Index Action</h1>'; } public function detailAction() { echo '<h1>Detail Action</h1>'; } }
Bạn ra trình duyệt gõ URL là localhost/mvc/admin.php?c=news&a=detail và nếu xuất hiện chữ Detail Action tức là bạn đã thành công rồi đấy.
Nếu vẫn còn nghi ngờ thì bạn gõ vào URL là localhost/mvc/admin.php?c=news thì nó sẽ xuất hiện chữ Index Action , bởi vì ta không truyền action vào URL nên mặc định nó gọi indexAction.
Và đây là toàn bộ các file tính đến thời điểm hiện tại trong project mvc của chúng ta
7 Lời kết
Trong bài này chúng ta đã tạo được file bootstrap và controller chính, ở các bài tiếp theo chúng ta sẽ tiến hành viết những thư viện loader để thực hiện load model, library nhé. Nếu có gì thắc mắc bạn có thể comment bên dưới và mình sẽ giải thích cho các bạn.