|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
左手拿着MOTOLOLA右手拿着NOKIA,要多潇洒,有多潇洒,哈哈,终于学会了,但是可能这个时候,又会有人不经意的拍拍肩膀对你说:哥们,别高兴的太早,你还是菜鸟,离学会还差着一大截呢!
之前讲了怎样让完成跳转和恳求的转发,固然,也只是很复杂的说了一下,更深的内容需求你本人去读一下详细框架的完成。
如今跳转和转发有了,关于模子的编写可今后面再来,那我就先说一下怎样讲数据从掌握器传递到视图,之前咱们的完成体例十分丑恶:
1 $viewPath = dirname(__FILE__) . '/../views/index.php'; 2 if(file_exists($viewPath)) { 3 include $viewPath; 4 } else { 5 echo 'view does not exists'; 6 } 如今我筹办用更优雅一点的体例将数据传递到视图,如今先说一下怎样挪用:
01 <?php 02 class TestController extends Controller { 03 public function test() { 04 $this->_assign(array( 05 'arr' => array( 06 'test','test2' 07 ), 08 'str' => 'it is a str' 09 )); 10 $this->_display('test'); 11 } 12 }
这就是明天我写以后的挪用体例,假如你学过smarty,那末你会发明这和smarty很类似,切实其实,我写toper的时分也是受了smarty的影响,最入手下手的设法是视图这一块就利用smarty,前面想了一下,既然号称是本人的框架,那末视图这一起一定也要全体本人写,固然如斯,然而我前面仍是保存了assign,display这类写法,而且只需设置装备摆设文件修正,完整可以将视图切换到smarty而不利用框架自己的完成。
仿佛扯得有点远了,起首说一下,为了代码的复杂,我将assign和display的完成简化,人人了解思绪就好,真实的框架的完成要庞杂一些。
起首assign,它的功效是为变量赋值,这里我假定传递的参数都是联系关系数组,也就是常说的HashTable,它不该该直接挪用View的接口,这接话柄现怎样赋值:
1 protected function _assign(Array $arr) { 2 View::assign($arr); 3 }
为了处置视图这一块的数据存储和展现,我界说了View.php这个文件,View::assign这个办法是它的一个静态办法,固然,完成的功效人人都懂的。。。
详细View.php中怎样完成的呢?
1 private static $_data = array(); 2 public static function assign($arr) { 3 foreach($arr as $key => $val) { 4 if(!is_int($key)) { 5 //过滤失落如array('test','test2')这类数据 6 self::$_data[$key] = $val; 7 } 8 } 9 } 因为assign是静态办法,数据又需求存储到这个类,所以需求界说一个静态的成员变量$_data,这个变量存储掌握器传递的数据。由于之前在掌握器的assign中已停止了类型提醒,所以可以包管在View中的assign传递的形参都是数组,如今只需求一个foreach然后顺次存储便可,那为何不直接利用self::$_data = $arr呢,如许只要一句话呢?
起首,数组中的数据有些多是不合错误的,好比array('test','test2')我就不懂数据test和test2究竟代表了甚么,如许的数据应当在assign中就被剔除失落,假如你请求对照严苛,也能够直接给用户提醒正告。
其次,有能够用户屡次挪用assign,假如直接利用援用,那末第二次挪用assign就会把第一次的数据弄丢,如许是不成容忍的。
好,赋值弄定,然后就是怎样显示的成绩了,在掌握器中,仍是直接挪用接口,而不担任外部完成,然而在挪用接口之前需求停止必定的格局化:
01 protected function _display($str) { 02 if(is_string($str)) { 03 $str = str_replace(array( 04 '.','#' 05 ),array( 06 '/','.' 07 ),$str); 08 View::display(MODULES_PATH . View::VIEW_BASE_PATH . $str . '.php'); 09 } 10 } 为了视觉上的雅观和其他一些XXX的缘由,咱们可以将暗示途径的/在作为实参传递的时分酿成.,如许假定要挪用test/test2.php,那末只需求传递test.test2.php便可。固然,如许也存在一个成绩,有时分需求利用.,就像方才这个例子,实践上test.test2.php会被解析为test/test2/php,如许实践上是有成绩的,那末怎样处理呢,我利用一个#代表.,如许方才这个传递的时分就酿成了test.test2#php。如许还有一个成绩,.php根基上每一个页面都有,那为何还要传递出来呢,直接框架帮你加上就行了嘛,所以用户只需求输出test.test2就好,如许从逻辑上也轻易了解,test模块上面的test2这个视图文件。假如你用过thinkphp,你会发明这和它的写法很相似,实践上我在最入手下手写的时分就是边看thinkphp源码边写的,所以良多器材都自创了它的思惟。我团体对照厌恶利用#,所以我根基上在视图文件中没有利用过#,由于我感觉你本人不会这么无聊,去写相似于test.view.php如许的有意义的文件名,直接test.php就行了,如许的名字框架又帮你处理了一局部,所以根基上不存在这个成绩了。
这儿还呈现了一个常量View::VIEW_BASE_PATH,这个常量代表的寄义是视图根目次的途径,如许传递出来的实践上是一个实践的相对途径。
因为display是展现这个视图文件,那末一定会利用include某一个文件,详细的完成以下:
1 public static function display($file) { 2 if(file_exists($file)) { 3 extract(self::$_data); 4 include $file; 5 } else { 6 throw new ViewException(ViewException::NOT_EXISTS_TEMPLATE); 7 } 8 } extract就是讲数组打散,更多的请查询PHP手册。
这里因为能够这个视图文件不存在,所以需求剖断一下,假如视图文件不存在,则直接抛出异常,注重,异常是利用了ViewException,这个类又是新界说的,传递的参数暗示这个异常是由于视图模板不存在而引发的。
那我么来看看详细这个异常类的完成:
01 <?php 02 class ViewException extends BaseException { 03 const NOT_EXISTS_TEMPLATE = 1; 04 public function __construct($code = 0) { 05 switch($code) { 06 case ViewException::NOT_EXISTS_TEMPLATE: 07 $msg = 'the template file is not exists'; 08 break; 09 default : 10 $msg = 'unknown exception'; 11 break; 12 } 13 parent::__construct($msg,$code); 14 } 15 } 这个类它承继了BaseException,因为BaseException完成了debug形式开与关分歧情形下展现内容分歧,ViewException也具有这个特征,当debug封闭,抛出异常的时分,也只会跳转到毛病页,不会直接展现异常,如许的处置更容易保护。
会HTML吗?会,我能编好几个大表格排板的网页啦! |
|