使用Composer从零开发一个简单的web框架(05)-php模板

框架会集成2个模板引擎,php语言原生和Twig,本章集成php语言原生模板

模板接口

新建core/tpl/Tpl.php,内容如下。所有的模板实现都要实现它接口函数,内容很简单,assign 实现模板变量赋值, import 输出模板文件

<?php
namespace core\tpl;


interface Tpl {
    public function assign($key, $val);
    public function import($filename);
}

模板基类

新建core/tpl/BaseTpl.php,内容如下。主要声明了模板目录和模板数据变量以及实现了Tpl接口的assign方法

<?php
namespace core\tpl;


class BaseTpl implements Tpl {
    /** 模板目录 */
    protected $_tplDir;
    /** 模板数据 */
    protected $_tplData = [];

    /**
     * BaseTpl constructor.
     * @param string $tplDir 模板目录
     */
    public function __construct($tplDir) {
        $this->_tplDir = $tplDir;
    }

    public function assign($key, $val) {
        if (is_array($key)) {
            foreach ($key as $k => $v) {
                $this->_tplData[ $k ] = $v;
            }
        } else {
            $this->_tplData[ $key ] = $val;
        }
    }

    public function import($filename) {

    }
}

php模板

新建core/tpl/PhpTpl.php,内容如下

<?php
namespace core\tpl;


class PhpTpl extends BaseTpl  {
    public function import($tpl) {
        $filename = $tpl ?: CONTROLLER . '/' . METHOD . '.phtml';
        $filename = $this->_tplDir . $filename;

        if (!file_exists($filename)) {
            echo '<strong style="color:#F30">Can\'t find Template:' . $tpl . '</strong>';
            exit();
        }

        extract($this->_tplData);
        require_once $filename;
    }
}

集成模板

编辑public/index.php,主要定义了APP_TPL常量为php即使用 php模板引擎,PATH_VIEW常量为模板目录

// 日志目录
define('PATH_LOG',      PATH_RUNTIME . 'log/');

// 使用的模板引擎(php 或者 twig)
define('APP_TPL',       'php');
// 模板目录(如果未定义, 默认使用 app/应用/view/ 目录)
//define('PATH_VIEW',     __DIR__ . '/views/');

// 默认应用
define('DEFAULT_APP',           'home');

编辑core/App.php,处理当用户没有定义PATH_VIEW常量时要设置一个默认的模板目录

define('CONTROLLER',$controller);

// 模板目录
defined('PATH_VIEW') or define('PATH_VIEW', PATH_APP . $app . '/view/');

// 控制器类文件名大写
$controllerFile = ucfirst($controller);
$module = "app\\{$app}\\controller\\{$controllerFile}";

编辑core/Controller.php,引入模板相关类

<?php
namespace core;

use core\tpl\PhpTpl;
use core\tpl\Tpl;

编辑core/Controller.php,添加处理模板调用

public function assign($key, $val) {
    $this->_template();
    $this->_tpl->assign($key, $val);
}
public function import($filename = '') {
    $this->_template();
    $this->_tpl->import($filename);
}
/** @var Tpl  */
private $_tpl = null;
private function _template() {
    if ($this->_tpl) return;

    if (APP_TPL == 'php') {
        $this->_tpl = new PhpTpl(PATH_VIEW);
    } else {
        exit('没有定义 ' . APP_TPL . ' 模板引擎');
    }
}

测试模板

编辑app/home/controller/Hello.php,添加viewview2方法

public function view() {
    $this->assign('name', '老王');
    $this->assign('varIf', true);
    $this->assign('varFor', 5);
    $this->assign('varForeach', ['php', 'html']);

    $this->import();
}

public function view2() {
    $this->assign('name', '老宋');

    $this->import('hello/view2.phtml');
}

新建app/home/view/hello/view.phtml文件,内容如下

Hello, <?=$name?> from Hello.view

<br /><br />
php 模板写法

<br /><br />
<?php if ($varIf): ?>
    $varIf 变量为 true
<?php else: ?>
    $varIf 变量为 false
<?php endif; ?>

<br /><br />
<?php for ($i = 0; $i < $varFor; $i++): ?>
    for $i: <?=$i?><br />
<?php endfor; ?>

<br />
<?php
foreach ($varForeach as $k => $v): ?>
    foreach $k: <?=$k?>, $v: <?=$v?><br />
<?php endforeach; ?>

新建app/home/view/hello/view2.phtml文件,内容如下

Hello, <?=$name?> from Hello.view2

浏览器访问 http://phpweb.com/home/hello/view,输出

Hello, 老王 from Hello.view

php 模板写法

$varIf 变量为 true

for $i: 0
for $i: 1
for $i: 2
for $i: 3
for $i: 4

foreach $k: 0, $v: php
foreach $k: 1, $v: html

浏览器访问 phpweb.com/home/hello/view2 ,输出

Hello, 老宋 from Hello.view2
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!