本书未发布

32. 助手函数

未匹配的标注

简介

在本小节中,我们将定义两个开发前台模块布局模板( Layout )时使用到的函数:

  1. route_class 页面内容根结点元素( <div id="app"> )的 CSS class 名;
  2. 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 资源文件路径。其实框架已经为我们提供了三个 资源文件加载 内置标签—— loadjscss

在本教程里,我们之所以不使用这三个内置标签,是因为它们加载 JS/CSS 文件时不能在文件名后面添加参数。特别是在开发阶段为了让浏览器加载服务器最新版本 CSS/JS 文件,我们通常会在文件路径后面加一个可变参数让浏览器强制加载服务器文件。以此避免当 CSS/JS 文件修改后因为浏览器使用本地缓存造成不能及时看到修改后效果。

考虑到只有服务器端资源文件更新后才强制浏览器必须重新加载该文件,没有更新时可以使用本地缓存文件这种情景,在 asset_path 函数里我们给文件加载路径添加的可变参数值是该文件的 最后修改时间戳

助手函数

下面是 route_classasset_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 里我们之所以获取请求信息的 controlleraction 时进行异常捕获是因为,在 ThinkPHP 5.1 一些版本里这两个方法曾被取消了(可能是因为这两个方法大家用习惯了,之后在大家的强烈要求下官方又恢复了这两个方法,见 请求信息 底部评论),而 routeInfo 这个方法返回值格式是「controller/action」,所以当 controlleraction 这两个方法不可用时我们使用 routeInfo

Git 代码版本控制

关于上面两个函数的使用我们在下一节介绍,现在让我们将该文件加入到版本控制中:

$ git add -A
$ git commit -m "新增自定义助手函数"

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~