MVC CMS - Thư viện load controller

PHP MVC 15/04/2017 07:00 849
Hello ! Trong bài viết tiếp theo mình sẽ cùng các bạn xây dựng thư viện load controller của TzCMS. Có lẽ đây là thành phần khá quan trọng trong hệ thống MVC của chúng ta.

Tiếp tục trong bài viết này mình sẽ hướng dẫn các bạn xây dựng một class load controller. Chúng ta sẽ tìm hiểu qua cơ chế để từ đó bạn lắm được cơ chế load controller là như thế nào.

Như các bạn đã biết thì controller đóng vài trò trung gian giữa Model và View. Nó có nhiệm vụ tiếp nhận yêu cầu từ client sau đó xử lý request, load model tương ứng và gửi data qua view tương ứng rồi trả kết quả về cho client.

Trong một hệ thống thì có thể sẽ có nhiều controller và trong mỗi controller có thể có nhiều action khác nhau.

Mỗi action là một phương thức và nó có thể tương tác với một viewview sẽ đóng vai trò hiển thị dữ liệu cho người dùng của action đó.

Chúng ta sẽ dựa vào request của người dùng để có thể xác định được controlleraction. Trong trường hợp khi người dùng truy cập vào hệ thống thì chúng ta sẽ lấy controller, và action mặc đinh.

// Thông số controller và action mặc định
define('DEFAULT_CONTROLLER', 'home');
define('DEFAULT_ACTION', 'default');

Khi người dùng truy cập vào liên kết http://localhost/TzCMS/?c=news&a=detail thì chúng ta ngầm hiểu rằng.

  • controller = news.
  • action = detail.

Đó chính là phương pháp chính nhằm xác định được controlleraction. Tiếp theo chúng ta cần gọi controller và gọi action.

Như các bạn đã biết thì mỗi controller là một class và mỗi một action sẽ là một phương thức.

  • Kiểm tra sự tồn tại của controller nếu có thì include controller file.
  • Khởi tạo mới đối tượng controller.
  • Kiểm tra phương thức có tồn tại trong controller hay không.
  • Gọi phương thức thông qua đối tượng controller.

Trong folder core/common bạn tạo một file /core/common/controller.class.php

<?php if (!defined('ABSPATH')) exit('No direct script access allowed'); 
	/*
	|------------------------------------------------------------
	| TzCMS - Content management system website
	| @Author	: Tz.Thiêm (buivanthiem.it@gmail.com)
	| @Date		: 2009/1/18
	| @Version	: 2.1.1
	| @Copyright (c) TzCMS. All Rights Reserved,
	|------------------------------------------------------------
	| Email: info@chiasephp.net
	| Website: http://www.chiasephp.net
	| -----------------------------------------------------------
	*/
	class Controller{
		private static $_instance = null;
		
		private $controller = DEFAULT_CONTROLLER;
		private $action = DEFAULT_ACTION;
		/*
		|-----------------------------------
		| Constructor
		| @param $array
		|-----------------------------------
		*/
		private function __construct($config){
			if(is_array($config)){
				foreach($config as $k=>$v){
					$this->{$k}	= $v;
				}
			}
		}
		/*
		|-----------------------------------
		| Get Instance
		| @param $array
		|-----------------------------------
		*/
		public static function getInstance($config){
			if(!isset(self::$_instance)){
				self::$_instance = new Controller($config);
			}
			return self::$_instance;
		}
		/*
		|-----------------------------------
		| Run controller
		|-----------------------------------
		*/
		public function run(){
			$_controller = ucfirst(strtolower($this->controller)) . 'Controller';
			$_action = 'default_'.$this->action;
			
			// Check controller exists
			if (!file_exists(DIR_CONTROLLER . '/' . $_controller . '.php')){
				trigger_error('Error 404. ModuleFile is not found !', E_USER_ERROR);
			}
			
			require_once(DIR_CONTROLLER . '/' . $_controller . '.php');
			if (!class_exists($_controller)){
				trigger_error('Error 404. Controller is not found !', E_USER_ERROR);
			}
			
			// Controller construct
    		$objController = new $_controller();
			// check action exist
			if ( !method_exists($objController, $_action)){
				trigger_error('Error 404. Action is not found !', E_USER_ERROR);
			}
			// Call function method
			$objController->$_action();
    	}
		/*
		|-----------------------------------
		| Load other controller
		|-----------------------------------
		*/
		function load_controller($controller, $action){
			if($controller == $this->controller) return false;
			return '<!-- Comming soon -->';
		}
		/*
		|-----------------------------------
		| Destructor
		|-----------------------------------
		*/
		function __destructr(){
			self::$_instance = null;
		}
	}
?>

Lưu ý rằng ta có quy tắc đặt tên controller là như sau [Tên_controller]Controller.php. Ví dụ HomeController, NewsController, ProductController. Tất cả các phương thức trong controller sẽ bắt đầu bằng từ khóa default_ nhé.

Ví dụ:

  • function default_cat() 
  • function default_detail()

Tiếp tục trong file core/bootstrap.php

/*
|---------------------------------------
| Get controller & action
|---------------------------------------
*/
$controller = Input::get('c', 'home');
$action = Input::get('a', 'default');

/*
|---------------------------------------
| Run controller
|---------------------------------------
*/
$controllerInstance = Controller::getInstance(
	array(
		'controller' => $controller,
		'action'	=> $action
	)
);
$controllerInstance->run();

Tiếp tục trong folder application/controller bạn tạo một controller mới là NewsController.php

<?php if (!defined('ABSPATH')) exit('No direct script access allowed'); 
	/*
	|------------------------------------------------------------
	| TzCMS - Content management system website
	| @Author	: Tz.Thiêm (buivanthiem.it@gmail.com)
	| @Date		: 2009/1/18
	| @Version	: 2.1.1
	| @Copyright (c) TzCMS. All Rights Reserved,
	|------------------------------------------------------------
	| Email: info@chiasephp.net
	| Website: http://www.chiasephp.net
	| -----------------------------------------------------------
	*/
	class NewsController{
		function default_default(){
			print_r('Home News'); die();
		}
		function default_detail(){
			print_r('Detail News'); die();
		}
	}
?>

Khi ban truy cập vào controlleraction.

  • http://localhost/TzCMS/?c=news xuất hiện kết quả là Home News
  • http://localhost/TzCMS/?c=news&a=detail xuất hiện kết quả là Detail News  là bạn đã thành công.

Tổng kết.

Như vậy là mình và các bạn đã xây dựng xong thư viện load controller vào hệ thống TzCMS. Bài viết có thể hơi dài dòng nhưng mình muốn các bạn có thể hiểu rõ nguyên lý cơ bản của nó. Bài viết tiếp theo mình và các bạn sẽ tích hợp smarty engine vào CMS.

Xem Thêm

Profile photo of adminTheHalfHeart

B.V.T

Sinh ra và lớn nên ở Bắc Giang. Hiện tại thì tôi đang là một lập trình viên tại VietISO. Tôi lập website này với mục đích là bookmark những gì tôi đã đọc qua và mong muốn chia sẻ những gì tôi biết.