继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

动手创建自己第一个MVC框架项目【二】

慕姐8265434
关注TA
已关注
手记 1283
粉丝 222
获赞 1065

webp

image


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['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;
       }
    });
}

我们上面使用了高阶函数

什么是高阶函数 这里我们就要说一般的函数,一般函数参数有什么?

  1. 字符串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

  1. 解压 把SMarty中的libs文件夹整个拷贝至项目的Vendor目录并更改名字为Smarty

  2. 更改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');
    }
}

如果觉得我的文章对你有帮助又或者喜欢,别忘了关注.喜欢加转发,当然如果可以打赏我一下奶茶钱也是可以的哦(#.#)



作者:秋名山吴师傅
链接:https://www.jianshu.com/p/56610364473a


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP