动手创建自己第一个MVC框架项目【一】
讲到了项目基本搭建以是这一张讲到我们的重头戏-“路由分发”,我们路由的目的便是为了通过一个入口文件实现调用不同类中的不同方法,以是我们现在就开始吧!
1.吸收url参数(p平台参数,c 掌握器名 ,a 方法名)2.通过平台参数(p)+掌握器名 (c) 创建工具 并调用 a 方法talk is cheep show me the code 我们现在开始写代码
[代码]
在Core/App.php中创建创建getUrl静态方法。记得每次写完方法都要在run方法中调用哦
获取url,做一些人性化处理首字母大写,并给予默认值 /public static function getUrl(){ $GLOBALS[39;p']=isset($_GET['p']) ? ucfirst(strtolower($_GET['p'])) :'Back'; $GLOBALS['c']=isset($_GET['c']) ? ucfirst(strtolower($_GET['c'])) :'Index'; $GLOBALS['a']=isset($_GET['a']) ? ucfirst(strtolower($_GET['a'])) :'showIndex';}
根据上面定义的url实例化工具并调用方法
分发路由 根据url实例化工具并调用方法 /public static function dispathRouter(){ //我们的掌握器的规则便是名字+Controller关键字 $className='App\\'.$GLOBALS['p'].'\\Controller\\'.$GLOBALS['c'].'Controller'; $action=$GLOBALS['a']; $obj=new $className; $obj->$action();}
到了这里实在你们运行的时候会报错,为什么呢,由于如果你在查看就会创造我们从始至终并未引入过除App.php之外的任何类文件,以是以上代码一旦运行就会提示没有这个类文件。以是我们现在还缺一个关键的零件
[自动加载]/ 自动加载 /public static function autoload(){ //这里我们用了高阶函数的写法,剩下了一个方法 spl_autoload_register(function($className){ $fileName=ROOT_PATH.str_replace('\\','/',$className).'.php'; if (file_exists($fileName)){ include_once $fileName; return true; }else{ echo '文件不存在!
'; die; } });}
我们上面利用了高阶函数什么是高阶函数❓ 这里我们就要说一样平常的函数,一样平常函数参数有什么?
字符串2.数组3.工具高阶函数的参数便是能把全体函数体作为参数的函数别忘了还要在App/Back/Controller创建一个IndexController.php<?php/ IndexController.php User: kalvin Date: 2018/1/30 Time: 下午3:23 /namespace App\Back\Controller;class IndexController{ public function showIndex() { }}
这样我们就基本可以有一个雏形了
[Smarty]我们现在来让我们的项目支持Smarty模板引擎
解压 把SMarty中的libs文件夹全体拷贝至项目的Vendor目录并更改名字为Smarty变动core/App.php至让其能自动加载Smarty[代码]/ 自动加载 /public static function autoload(){ //这里我们用了高阶函数的写法,剩下了一个方法 spl_autoload_register(function($className){ if ($className=='Smarty'){ $fileName=VEND_PATH.'Smarty/'.str_replace('\\','/',$className).'.class.php'; }else{ $fileName=ROOT_PATH.str_replace('\\','/',$className).'.php'; } if (file_exists($fileName)){ include_once $fileName; return true; }else{ echo '文件不存在!
'; die; } });}
然后在Core创建一个Controller.php并让这个类继续\Smarty
<?php/ Controller.php User: kalvin Date: 2018/1/30 Time: 下午3:32 /namespace Core;class Controller extends \Smarty{}
往后在App目录下所有须要利用Smarty的类必须继续Controller
<?php/ IndexController.class.php User: kalvin Date: 2018/1/30 Time: 下午3:23 /namespace App\Back\Controller;use Core\Controller;class IndexController extends Controller{ public function showIndex() { }}
现在还不是很完美,我们开始配置Smarty模板路径与编译路径Core里面的Controller
<?php/ Controller.php User: kalvin Date: 2018/1/30 Time: 下午3:32 /namespace Core;class Controller extends \Smarty{ public function __construct() { parent::__construct(); $templateDir=APP_PATH.$GLOBALS['p'].'/'.'View'; $this->template_dir=$templateDir; $this->compile_dir=ROOT_PATH.'Caching/'; }}
我用的Smarty 3彷佛已经废弃了setTemplateDir方法只有template_dir 属性我们可以在view创建模板,并在IndexController中利用display访问模板
<?php/ IndexController.class.php User: kalvin Date: 2018/1/30 Time: 下午3:23 /namespace App\Back\Controller;use Core\Controller;class IndexController extends Controller{ public function showIndex() { $this->display('hello.tpl'); }}
如果以为我的文章对你有帮助又或者喜好,别忘了关注.喜好加转发,当然如果可以打赏我一下奶茶钱也是可以的哦(#.#)