(*暂时未拆分前端控制器和应用控制器,全部集成在command类实现)
1 注册表模式//注册表模式//注册表模式用于提供一个系统级别对象,在任何地方都方便访问(可以使用单例模式)class registry{ private static $instance; private $request; private function __construct(){} static function instance(){ if(!isset(self::$instance)){ self::$instance=new self(); } return self::$instance; } function getrequest(){ $this->request; } function setrequest(request $request){ $this->request=$request; }}class request{} 2 三种作用域下的注册表namespace woo\controller;class request{}class complex{}//创建一个具有作用域的注册表模式//请求级别注册表namespace woo\base;use woo;abstract class registry{ abstract protected function get($key); abstract protected function set($key,$val); }class requestregistry extends registry{ private $values=array(); private static $instance; private function __construct(){} //返回唯一实例 static function instance(){ if(!isset(self::$instance)){ self::$instance=new self(); } return self::$instance; } protected function get($key){ if(isset($this->values[$key])){ return isset($this->values[$key]); } return null; } protected function set($key, $val){ $this->values[$key]=$val; } static function getrequest(){ return self::instance()->get('request'); } static function setrequest(woo\controller\request $request){ return self::instance()->set('request', $request); }}//会话级别的注册表class sessionregistry extends registry{ private static $instance; private function __construct(){ session_start(); } //返回唯一实例 static function instance(){ if(!isset(self::$instance)){ self::$instance=new self(); } return self::$instance; } protected function get($key){ if( isset($_session[__class__][$key]) ){ return isset($_session[__class__][$key]); } return null; } protected function set($key, $val){ $_session[__class__][$key]=$val; } static function getcomplex(){ return self::instance()->get('complex'); } static function setrequest(woo\controller\complex $request){ return self::instance()->set('complex', $request); }}//应用程序级别的注册表class applicationregistry extends registry{ private static $instance; private $freezedir='data'; private $values=array(); private $mtimes=array(); private function __construct(){ session_start(); } //返回唯一实例 static function instance(){ if(!isset(self::$instance)){ self::$instance=new self(); } return self::$instance; } //get,set都是单独保存一个$key到文件中 protected function get($key){ $path=$this->freezedir.directory_separator.$key; if(file_exists($path)){ clearstatcache(); //获取文件修改时间 $mtime=filemtime($path); if(!isset($this->mtimes[$key])){ $this->mtimes[$key]=0; } //如果文件被修改 if($mtime > $this->mtimes[$key]){ $data=file_get_contents($path); $this->mtimes[$key]=$mtime; return ($this->values[$key]=unserialize($data)); } } if(isset($this->values[$key])){ return $this->values[$key]; } return null; } protected function set($key, $val){ $this->values[$key]=$val; $path=$this->freezedir.directory_separator.$key; //文件不存在会自动创建 file_put_contents($path, serialize($val)); $this->mtimes[$key]=time(); } static function getdsn(){ return self::$instance()->get('dsn'); } static function setdsn($dsn){ return self::$instance()->set('dsn',$dsn); }}3 前端控制器controller----结合注册表模式与命令模式打造统一入口框架doexecute($request); } function display($request){ //获取cmd,用于决定调取那个页面 $cmd=$request->getproperty('cmd'); //写法不是很好....截取command之前的字符 print $cmd; $viewurl=./woo/view/.substr($cmd,0,strlen($cmd)-(7)).view.html; include_once($viewurl); } abstract function doexecute(\woo\controller\request $request);} getproperty('cmd'); $sep=directory_separator; //找不到指定cmd数据时,返回默认cmd实例 if(!$cmd){ return clone 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); //判断传入的类是否存在,是否是base_cmd的子类 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); return clone self::$default_cmd; } } }else{ $request->addfeedback(command '$cmd' is not found); return clone self::$default_cmd; } }}addfeedback(welcome to woo!); $feedbacks=$request->getfeedback(); foreach ($feedbacks as $key=>$val){ print $val; print
; } include_once(woo/view/main.html); }}addfeedback(welcome to woo!); $feedbacks=$request->getfeedback(); foreach ($feedbacks as $key=>$val){ print $val; print
; } $this->display($request); }}freezedir.directory_separator.$key; if(file_exists($path)){ clearstatcache(); //获取文件修改时间 $mtime=filemtime($path); if(!isset($this->mtimes[$key])){ $this->mtimes[$key]=0; } //如果文件被修改 if($mtime > $this->mtimes[$key]){ $data=file_get_contents($path); $this->mtimes[$key]=$mtime; return ($this->values[$key]=unserialize($data)); } } if(isset($this->values[$key])){ return $this->values[$key]; } return null; } protected function set($key, $val){ $this->values[$key]=$val; $path=$this->freezedir.directory_separator.$key; if(!is_dir($this->freezedir)){ mkdir($this->freezedir); } //文件不存在会自动创建 file_put_contents($path, serialize($val)); $this->mtimes[$key]=time(); } static function getdsn(){ return self::instance()->get('dsn'); } static function setdsn($dsn){ return self::instance()->set('dsn',$dsn); }}values[$key]); } return null; } protected function set($key, $val){ $this->values[$key]=$val; } static function getrequest(){ return self::instance()->get('request'); } static function setrequest(\woo\controller\request $request){ return self::instance()->set('request', $request); }}get('complex'); } static function setrequest(woo\controller\complex $request){ return self::instance()->set('complex', $request); }}getoptions(); } //只有缓存数据不存在时才会调用该方法 private function getoptions(){ $this->ensure(file_exists($this->config), could not find options file!); $options=simplexml_load_file($this->config); print get_class($options); $dsn=$options->dsn; $this->ensure($dsn, no dsn found!); //获取值之后,将其存放进应用程序级别注册表中,方便缓存使用 //先转化成数组,方便序列化 \woo\base\applicationregistry::setdsn(array($dsn->__tostring())); //设置其他值 //... } private function ensure($expr,$message){ if(!$expr){ throw new \exception($message); } }}handlerequest(); } function init(){ //获取一个单例,用于做全局配置 $applicationhelper=applicationhelper::instance(); $applicationhelper->init(); } //每次请求都需要调用一次 function handlerequest(){ $request=new request(); $cmd_r=new \woo\command\commandresolver(); //根据request生成对应command抽象类(接口)的子类实例 //之后要利用command执行相关动作 $cmd=$cmd_r->getcommand($request); $cmd->execute($request); }}init(); \woo\base\requestregistry::setrequest($this); } //同时支持http请求和命令行参数(可用于调试程序使用) //*用于将参数填充进properties属性里 function init(){ //表单提交方式 if(isset($_server['request_method'])){ //用于收集表单提交的数据 $this->properties=$_request; return; } //$_server['argv'] 传递给该脚本的参数 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]; } return null; } 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); }}//woo_options.xmldsndsn //框架入口index.php