•  

【20201028】做个web框架(5)——控制器Controller(二)网页控制器的实现

发表于 2020-10-27,阅读 18

介绍

介绍

今天福哥会带着大家实现网页控制器的逻辑以及它和路由模块的结合部分的逻辑,实现了这部分功能之后,每个用户的请求就会映射到具体的程序文件上面了。

上一课我们提到过网页控制器需要借助Smarty这个模板扩展实现,所以我们需要先下载最新版本的Smarty模板扩展包,把它安装到我们的TFPHP里面。由于Smarty是第三方的代码,福哥打算把它放到Extends这个目录下面。

Smarty

网页控制器需要依赖Smarty模板扩展,所以我们先要把它安装起来。

下载

Smarty的官方下载地址是

https://www.smarty.net/download

福哥下载的是最新的3.1.35版本

https://github.com/smarty-php/smarty/releases/tag/v3.1.35

安装

安装Smarty其实就是把它解压缩后的源代码放到我们指定的目录下面,福哥打算把Smarty放到Extends目录下面。

9baee4c7c9d7fd86.jpg

网页控制器

我们先实现网页控制器Controller/Page/TFController,在这个对象里面会完成Smarty对象的初始化,设置映射程序文件对应的模板文件,调用模板文件展示用户界面等等功能。

控制器目录

控制器目录用来存放控制器程序,控制器程序文件存放在WEB-INF/Controller下面,根据路由进行自动映射,文件扩展名是“.inc.php”。

a0ab55eff4227856.jpg

视图目录

视图目录用来存放Smarty的网页模板,目录设置在WEB-INF/View/Template里面,在这个目录里面存放和WEB-INF/Controller完全对应的网页模板文件。

Smarty工作时候会将模板文件编译成可执行的php程序文件,所以我们还需要建立一个编译目录,编译目录设置在WEB-INF/View/Compile里面。

47cbef0e45f57392.jpg

模板文件存放在WEB-INF/View/Template下面,根据控制器程序文件对应路径存放,文件扩展名“.html”。

f637b2492e099b6a.jpg

代码

TFRouter

map

private function map($uri){
    // parse urim
    $uri = $this->getUri($uri);
    $uri = $this->parseUri($uri);

    // mapping
    $mappingFilePath = $this->detectMapping($uri);

    // debug
    if($mappingFilePath != null){
        include_once ($mappingFilePath);
        // call
        if(class_exists('PageController')){
            $myCtrl = new \PageController();
            $myCtrl->load(
                $this->uri,
                $this->extension,
                $mappingFilePath
            );
        }
        else if(class_exists('APIController')){
            $myCtrl = new \APIController();
            $myCtrl->load(
                $this->uri,
                $this->extension,
                $mappingFilePath
            );
        }
        else{
            header('HTTP/1.1 500 Internal Server Error');
            echo ("<li>[exception] 404 of ". $this->uri);
        }
    }
    else{
        header('HTTP/1.1 404 Not Found');
        echo ("<li>[missing] 404 of ". $this->uri);
    }
}

TFController

initTpl

private function initTpl(){
    // include Smarty class
    include_once (FRAMEWORK_ROOT_PATH. "Extends/smarty-3.1.35/libs/Smarty.class.php");
    
    // init Smarty
    $this->smartyObj = new \Smarty();
    $this->smartyObj->template_dir = WEB_INF_ROOT_PATH . "View/Template";
    $this->smartyObj->compile_dir = WEB_INF_ROOT_PATH . "View/Compile";
    $this->smartyObj->cache_dir = WEB_INF_ROOT_PATH . "View/Cache";
    $this->smartyObj->left_delimiter = "<%";
    $this->smartyObj->right_delimiter = "%>";
    $this->smartyObj->auto_literal = false;
}

setTplVar

protected function setTplVar($key, $val){
    $this->smartyObj->assign($key, $val);
}

displayTpl

private function displayTpl($mappingFilePath){
    $mappingFileName = substr($mappingFilePath, strlen(WEB_INF_ROOT_PATH. "Controller/"));
    $smartyTplFileName = substr($mappingFileName, 0, strlen($mappingFileName)-8). ".html";
    $smartyTplFilePath = WEB_INF_ROOT_PATH . "View/Template/". $smartyTplFileName;
    if(file_exists($smartyTplFilePath)){
        $this->smartyObj->display($smartyTplFileName);
    }
    else{
        header('HTTP/1.1 500 Internal Server Error');
        echo ("<li>unable to load template ". $smartyTplFileName);
    }
}

process

protected function process(){

}

load

public function load($uri, $extension, $mappingFilePath){
    $this->process();
    $this->displayTpl($mappingFilePath);
}

示例

控制器程序

use TFPHP\Controller\Page\TFController;

class PageController extends TFController{
    protected function process(){

    }
}

视图模板

page of index

讲解

下面福哥来讲解一下网页控制器Controller/Page/TFController的函数的逻辑。

TFRouter

map

增加了对mapping到的控制器程序文件进行引用的逻辑,这里面会自动include程序文件,会自动初始化PageController对象,会自动调用load方法启动程序。

TFController

initTpl

在这个方法里面进行Smarty对象的初始化操作,包括设置模板目录、编译目录、缓存目录以及标签标记等等。

setTplVar

通过这个方法可以将控制器程序文件里的变量传递给视图模板文件给Smarty使用。

displayTpl

这个方法用来将视图模板文件的内容展示到用户面前。

process

这个方法是一个空方法,是给控制器程序文件重载的一个保护方法,它用来实现具体控制器程序的业务逻辑。

load

这个方法是给路由模块进行自动调用的,它负责控制器程序的加载操作。

示例

控制器程序

这是默认首页的控制器程序文件的代码。

视图模板

这是默认首页的视图模板文件的代码。

666c8e0949edc471.jpg

总结

今天我们学习了Smarty模板扩展的使用方法,以及网页控制器的逻辑实现。现在通过TFPHP就可以将网页发布出来了。

下一课福哥会带着童鞋们完成另外一个控制器——接口控制器的对象的逻辑实现。

P.S.

微信公众号的文章发出去之后是不能编辑的,但是福哥偶尔会修复一些描述不到位、示例不正确、结构不清晰等等的文章错误,这些只能在网站上才能看到最新版本内容,望大家知晓~~


鬼谷子叔叔
  • 日志:212
  • 回复:13

进入ta的主页