使用Composer从零开发一个简单的web框架(05)-php模板
admin
2024-04-02 17:21
框架会集成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 = [];
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);
}
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
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341