帮助中心 > 新闻资讯 >动手创建自己第一个MVC框架项目【二】

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

发布时间:2019-01-15

重头戏来了呀

[路由分发]

我们在上一章动手创建自己第一个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['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');
    }
}

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

相关推荐