1. 程式人生 > >PHP面向對象之前端控制器模式

PHP面向對象之前端控制器模式

app 應用程序 per help 區別 setprop trac exist 類名

/*

前端控制器的主要組成部分及功能如下:
1、入口文件類controller;(對這個系統的調用都是從這個文件開始的,也相當於一個控制中心,對所有相關的類進行調用)
2、應用程序配置信息類applicationhelper;(用於獲取應用程序所需的配置信息)
3、命令類解釋器commandresolver;(根據用戶請求調用相應的命令類)
4、命令類command;(調用用戶請求信息類和業務邏輯,還可以調用視圖文件)

整個系統的調用步驟大概就是:
1、獲取程序所需的配置信息
2、獲取命令類
3、執行命令類

前端控制器與命令模式對比,在我看來二者基本沒什麽區別,原理大致相同。前端控制器的代碼及註解如下:

*/ namespace woo\controller; //入口文件類 class Controller { private $applicationHelper; private function __construct (); static function run(){ $instance = new Controller(); $instance->init(); $instance->handleRequest(); } function init(){ //
獲取程序所需的配置信息 $applicationHelper = ApplicationHelper::instance(); $applicationHelper->init(); } function handleRequest(){ //獲取並執行命令類 $request = new \woo\controller\Request(); $cmd_r = new \woo\command\CommandResolver(); $cmd = $cmd_r
->getCommand($request); $cmd->execute($request); } } //獲取應用程序配置信息 class ApplicationHelper { private static $instance; private $config = "/tmp/data/woo_options.xml"; //配置信息保存的文件 private function __construct (){} static function instance(){ if(!self::$instance){ selff::$instance = new self(); } return self::$instance; } function init(){ $dsn = \woo\base\ApplicatonRegistry::getDSN(); if(!is_null($dsn)){ return; } $this->getOptions(); } private function getOptions(){ $this->ensure(file_exists($this->config),"conld not find options file"); $options = SimpleXml_load_file($this->config); print get_class($options); $dsn = (string)$options->dsn; $this->ensure($dsn,"No DSN found"); \woo\base\ApplicationRegistry::setDSN($dsn); //配置信息將被緩存到一個註冊表類中 //設置其他值 } private function ensure($expr,$message){ if(!$expr){ throw new \woo\base\AppException($message); } } } //用戶請求信息類 class Request { private $properties; private $feedback =array(); function __construct(){ $this->init(); \woo\base\RequestRegistry::setRequest($this); } function init(){ if(isset($_SERVER[‘REQUEST_METHOD‘])){ $this->properties = $_REQUEST; return; } foreach($_SERVER[‘argv‘] as $arg){ if(Strpos($arg,‘=‘)){ list($key,$val) = explode("=",$arg); $this->setProperty($key,$val); } } } function getProperty($key){ if(isset($this->properties[$key]){ return $this->properties[$key]; } } function setProperty($key,$val){ $this->properties[$key] = $val; } function addFeedback($msg){ array_push($this->feedback,$msg); } function getFeedback(){ return $this->feedback; } function getFeedbackString($separator="\n"){ return implode($separator,$this->feedback); } } namespace woo\command; //命令解釋器 class CommandResolver{ private static $base_cmd; private Static $default_cmd; function __construct (){ if(!self::$base_cmd){ //命令類的基類,這個主要將使用反射來檢查找到的命令類是否是繼承了它 self::$base_cmd = new \ReflectionClass("\woo\command\Command"); self::$default_cmd = new DefaultCommand(); //默認的命令類,當找不到相應的命令類時將調用它 } } //獲取命令類 function getCommand(\woo\controller\Request $request){ $cmd = $request->getProperty(‘cmd‘); $sep = DIRECTORY_SEPARATOR; //代表"/" if(!$cmd){ return self::$default_cmd; } $cmd = str_replace(array(‘.‘,$sep),"",$cmd); $filepath = "woo{$sep}command{$sep}{$cmd}.php"; //命令類的文件路徑 $classname = "woo\\command\\{$cmd}"; //類名 if(file_exists($filepath)){ @require_once("$filepath"); if(class_exists($classname)){ $cmd_class = new ReflectionClass($classname); if($cmd_class->isSubClassOf(self::$base_cmd)){ return $cmd_class->newInstance(); //實例化命令類 } else { $request->addFeedback("command ‘$cmd‘ is not a Command"); } } } $request->addFeedback("command ‘$cmd‘ not found"); return clone self::$default_cmd; } } //命令類 abstract class Command{ final function __construct(){} function execute(\woo\controller\Request $request){ $this->doExecute($request); } abstract function doExecute(\woo\controller\Request $request); } class DefaultCommand extends Command{ function doExecute(\woo\controller\Request $request){ $request->addFeedback("Welcome to Woo"); include("woo/view/main.php"); } } //客戶端 require("woo/controller/Controller.php"); \woo\controller\Controller::run();

PHP面向對象之前端控制器模式