32. 助手函数
简介
在本小节中,我们将定义两个开发前台模块布局模板( Layout )时使用到的函数:
- route_class 页面内容根结点元素(
<div id="app">
)的 CSS class 名; - asset_path 前台静态资源文件加载路径。
需求分解
因为我们要定义的两个函数(注意是函数,不是方法,在 ThinkPHP 里 函数和方法 的概念不一样),是在布局模板里使用,所以我们把它们定义成 助手函数 。遵循 开发规范 ,因为这两个助手函数我们只在 前台模块 使用,所以我们在 application/index/common.php
文件里声明它们。
接下来,我们再分析一下这两个助手函数的功能和实现思路。
1. route_class
这个函数用来生成布局模板里 <div id="app">
这个元素的 class
属性值,如下图所示(我们在下一节介绍布局模板的开发,这里只是演示一下效果)。
--- 截图 ---
我们要生成的class
属性值格式为 controller-action-page
,其中 -page
这部分是固定的,而 controller-action
和 URL 地址的 控制器名 和 操作方法名 相对应。
访问页面的控制器名和操作方法名,我们将使用 请求信息 来获得。
2. asset_path
这个函数是用来生成在布局模板里加载的 JS/CSS 资源文件路径。其实框架已经为我们提供了三个 资源文件加载 内置标签—— load
、 js
和 css
。
在本教程里,我们之所以不使用这三个内置标签,是因为它们加载 JS/CSS 文件时不能在文件名后面添加参数。特别是在开发阶段为了让浏览器加载服务器最新版本 CSS/JS 文件,我们通常会在文件路径后面加一个可变参数让浏览器强制加载服务器文件。以此避免当 CSS/JS 文件修改后因为浏览器使用本地缓存造成不能及时看到修改后效果。
考虑到只有服务器端资源文件更新后才强制浏览器必须重新加载该文件,没有更新时可以使用本地缓存文件这种情景,在 asset_path 函数里我们给文件加载路径添加的可变参数值是该文件的 最后修改时间戳 。
助手函数
下面是 route_class
和 asset_path
这两个助手函数的全部代码:
application/index/common.php
<?php
use think\Container;
/**
* 路由页面css class名
* @Author zhanghong(Laifuzi)
* @DateTime 2019-07-10
* @return [type] [description]
*/
function route_class()
{
$request = request();
try{
$ctr_name = $request->controller(true);
$act_name = $request->action(true);
$class_name = $ctr_name . '-' .$act_name;
}catch(\Exception $e){
$route_info = $request->routeInfo();
if(empty($route_info) || empty($route_info['route'])){
$class_name = 'none';
}else{
$class_name = str_replace(['/'], '-', $route_info['route']);
}
}
return strtolower($class_name).'-page';
}
/**
* 资源文件包含最后修改时间戳路径
* @Author zhanghong(Laifuzi)
* @DateTime 2019-07-10
* @param string $file_path 资源文件路径
* @return string [description]
*/
function asset_path($file_path)
{
try{
// 项目根目录
$root_path = Container::get('app')->getRootPath();
// 资源文件全路径
$full_path = $root_path.'public/'.$file_path;
$info = new \SplFileInfo($full_path);
$file_time = $info->getCTime();
}catch(\Exception $e){
$file_time = time();
}
return $file_path.'?c='.$file_time;
}
代码解读
- 在函数
route_class
里我们之所以获取请求信息的controller
和action
时进行异常捕获是因为,在 ThinkPHP 5.1 一些版本里这两个方法曾被取消了(可能是因为这两个方法大家用习惯了,之后在大家的强烈要求下官方又恢复了这两个方法,见 请求信息 底部评论),而routeInfo
这个方法返回值格式是「controller/action」,所以当controller
和action
这两个方法不可用时我们使用routeInfo
。
Git 代码版本控制
关于上面两个函数的使用我们在下一节介绍,现在让我们将该文件加入到版本控制中:
$ git add -A
$ git commit -m "新增自定义助手函数"
推荐文章: