使用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
,添加view
和view2
方法
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 协议》,转载必须注明作者和本文链接