src/Template.php
static private function getTpl(?string $view = null): string
    {

        // 如果未提供视图文件名,则根据当前模块,控制器和当前动作生成
        if (!$view) {
            $view = self::$controller . '/' . self::$action;
        } elseif (strpos($view, '/') === false) {
            // 替换路径分隔符
            $view = str_replace('\\', '/', trim($view, '/'));

            // 只提供了动作名称,则附加当前控制器名称
            $view = self::$controller . '/' . $view;
        }

        //当前模块
        $m = self::$module;

        // 如果当前模块有此视图,则使用当前模块的
        if ($m and self::checkFile(self::$root . 'program/module/' . $m . '/view/' . $view . '.tpl')) {
            // 编译前的源文件
            $source = self::$root . 'program/module/' . $m . '/view/' . $view . '.tpl';

            // 编译后的目标文件
            $compiled = self::$root . 'run/view_c/' . $m . '/' . $view . '.php';
        } elseif (self::checkFile(self::$root . 'program/view/' . $view . '.tpl')) {
            // 编译前的源文件
            $source = self::$root . 'program/view/' . $view . '.tpl';

            // 编译后的目标文件
            $compiled = self::$root . 'run/view_c/' . $view . '.php';
        } else {
            // 实在没找到
            throw new TemplateException('模板文件不存在:' . $view, TemplateException::TEMPLATE_NOT_FOUND);
        }

        // 如果关闭了模板自动编译的开关,则不自动编译,这个太不常用了.
        if (configDefault(true, 'system', 'template')) {
            self::compile($source, $compiled);
        }

        // 编译后的模板应该是这个名字
        return $compiled;
    }
static private function getTpl(?string $view = null): string
    {

        // 如果未提供视图文件名,则根据当前模块,控制器和当前动作生成
        if (!$view) {
            $view = self::$controller . '/' . self::$action;
        } elseif (strpos($view, '/') === false) {
            // 替换路径分隔符
            $view = str_replace('\\', '/', trim($view, '/'));

            // 只提供了动作名称,则附加当前控制器名称
            $view = self::$controller . '/' . $view;
        }

        //当前模块
        $m = self::$module;

        // 如果当前模块有此视图,则使用当前模块的
        if ($m and self::checkFile(self::$root . 'program/module/' . $m . '/view/' . $view . '.tpl')) {
            // 编译前的源文件
            $source = self::$root . 'program/module/' . $m . '/view/' . $view . '.tpl';

            // 编译后的目标文件
            $compiled = self::$root . 'run/view_c/' . $m . '/' . $view . '.php';
        } elseif (self::checkFile(self::$root . 'program/view/' . $view . '.tpl')) {
            // 编译前的源文件
            $source = self::$root . 'program/view/' . $view . '.tpl';

            // 编译后的目标文件
            $compiled = self::$root . 'run/view_c/' . $view . '.php';
        } else {
            // 实在没找到
            throw new TemplateException('模板文件不存在:' . $view, TemplateException::TEMPLATE_NOT_FOUND);
        }

        // 如果关闭了模板自动编译的开关,则不自动编译,这个太不常用了.
        if (configDefault(true, 'system', 'template')) {
            self::compile($source, $compiled);
        }

        // 编译后的模板应该是这个名字
        return $compiled;
    }
根据视图获取编译后的模板文件,会自动进行智能编译

@param string $view
格式一: <c>/<a> 这将匹配 当前模块的 view/<c>/<a>.tpl 或
/module/common/view/...
格式二: <a> 使用当前控制器名称,并按格式一处理
格式三: null 使用当前动作名称,并按格式二处理

@return string 编译后的模板文件(带路径)
@throws TemplateException