模板引擎集成

框架秉承高度自由的理念,既可以作为API框架,也可以作为常规的全站框架,开发混合式Web服务,本例介绍了如何集成当下常用的三种模板引擎,为框架集成View层,提供渲染模板视图的能力

引擎名称 说明 仓库地址 开发参考手册
Smarty 业界最著名的PHP模板引擎之一 GitHub 官方文档
think-template ThinkPHP 5.1 官方分离的模板引擎 GitHub 官方手册
Blade Laravel的模板引擎组件 GitHub 官方手册

demo

demo提供了tp-orm的封装:
TpViewController.php
TpView.php

引入支持库

无论使用哪个模板引擎,首先都要引入模板引擎的支持库文件,我们推荐使用 Composer 进行第三方组件包的管理,请确保已经正确安装了 Composer 然后执行下面对应的命令,引入引擎的支持库包

# 使用Smarty引擎
composer require smarty/smarty

# 使用think-template
composer require topthink/think-template

# 使用Blade
composer require duncan3dc/blade

第三方模板引擎支持库不属于框架的维护范围,如果遇到问题,请首先考虑升级到最新版本,如果问题无法解决,请到群里求助

建立自定义控制器抽象类

为了简化渲染页面的操作,我们需要建立一个自定义的控制器抽象类,以便自动初始化模板引擎,以及对输出方法进行封装,简化操作。下面给出的三段代码例子,分别针对不同的模板引擎,请按照自己使用的引擎参照对应的代码建立抽象控制器,请注意模板引擎都需要编译缓存目录以及模板视图目录,请提前新建好对应的目录

下面所示的例子中,视图控制器抽象类都直接存放在 APP 文件夹中,如果放在其他文件夹中,请注意命名空间,确保能自动加载到文件

Smarty

<?php

namespace App;
use EasySwoole\EasySwoole\Config;
use EasySwoole\Http\AbstractInterface\Controller;

/**
 * 视图控制器
 * Class ViewController
 * @author  : evalor <master@evalor.cn>
 * @package App
 */
abstract class ViewController extends Controller
{
    protected $view;

    public function onRequest(?string $action): ?bool
    {
        $this->view = new \Smarty();
        $tempPath   = Config::getInstance()->getConf('TEMP_DIR');    # 临时文件目录
//        var_dump($tempPath);
        $this->view->setCompileDir("{$tempPath}/templates_c/");      # 模板编译目录
        $this->view->setCacheDir("{$tempPath}/cache/");              # 模板缓存目录
        $this->view->setTemplateDir(EASYSWOOLE_ROOT . '/Views/');    # 模板文件目录
        $this->view->setCaching(false);
        return parent::onRequest($action); // TODO: Change the autogenerated stub
    }

    public function afterAction(?string $actionName): void
    {
        $this->view=null;
        parent::afterAction($actionName); // TODO: Change the autogenerated stub
    }

    /**
     * 输出模板到页面
     * @param  string|null $template 模板文件
     * @author : evalor <master@evalor.cn>
     * @throws \Exception
     * @throws \SmartyException
     */
    function fetch($template = null)
    {
        $content = $this->view->fetch($template);
        $this->response()->write($content);
        $this->view->clearAllAssign();
        $this->view->clearAllCache();
    }

    /**
     * 添加模板变量
     * @param array|string $tpl_var 变量名
     * @param mixed        $value   变量值
     * @param boolean      $nocache 不缓存变量
     * @author : evalor <master@evalor.cn>
     */
    function assign($tpl_var, $value = null, $nocache = false)
    {
        $this->view->assign($tpl_var, $value, $nocache);
    }
}

Think-Template

<?php

namespace App;

use EasySwoole\EasySwoole\Config;
use EasySwoole\Http\AbstractInterface\Controller;
use think\Template;

/**
 * 视图控制器
 * Class ViewController
 * @author  : evalor <master@evalor.cn>
 * @package App
 */
abstract class ViewController extends Controller
{
    protected $view;

    public function onRequest(?string $action): ?bool
    {
        $this->view = new Template();
        $tempPath = \EasySwoole\EasySwoole\Config::getInstance()->getConf('TEMP_DIR');     # 临时文件目录
        $this->view->config([
            'view_path'  => EASYSWOOLE_ROOT . '/Views/',              # 模板文件目录
            'cache_path' => "{$tempPath}/templates_c/",               # 模板编译目录
        ]);
        return parent::onRequest($action); // TODO: Change the autogenerated stub
    }

    public function afterAction(?string $actionName): void
    {
        $this->view = null;
        parent::afterAction($actionName); // TODO: Change the autogenerated stub
    }

    /**
     * 输出模板到页面
     * @param  string|null $template 模板文件
     * @param array $vars 模板变量值
     * @param array $config 额外的渲染配置
     * @author : evalor <master@evalor.cn>
     */
    public function fetch($template, $vars = [], $config = [])
    {
        ob_start();
        $this->view->fetch($template, $vars, $config);
        $content = ob_get_clean();
        $this->response()->write($content);
    }

    /**
     * 模板变量赋值
     * @access public
     * @param mixed $name
     * @param mixed $value
     * @return void
     */
    public function assign($name, $value = '')
    {
        $this->view->assign($name,$value);
    }
}

Blade

<?php

namespace App;

use duncan3dc\Laravel\BladeInstance;
use EasySwoole\EasySwoole\Config;
use EasySwoole\Http\AbstractInterface\Controller;

/**
 * 视图控制器
 * Class ViewController
 * @author  : evalor <master@evalor.cn>
 * @package App
 */
abstract class ViewController extends Controller
{
    protected $view;

    public function onRequest(?string $action): ?bool
    {
        $tempPath = Config::getInstance()->getConf('TEMP_DIR');    # 临时文件目录
        $this->view = new BladeInstance(EASYSWOOLE_ROOT . '/Views', "{$tempPath}/templates_c");

        return parent::onRequest($action); // TODO: Change the autogenerated stub
    }

    public function afterAction(?string $actionName): void
    {
        $this->view = null;
        parent::afterAction($actionName); // TODO: Change the autogenerated stub
    }

    /**
     * 输出模板到页面
     * @param string $view
     * @param array $params
     * @author : evalor <master@evalor.cn>
     */
    public function render(string $view, array $params = [])
    {
        $content = $this->view->render($view, $params);
        $this->response()->write($content);
    }
}

进行模板渲染

建立一个测试控制器进行模板渲染,请提前建立好模板文件,这里假设你已经有了一个index模板文件

<?php

namespace App\HttpController;

use App\ViewController;

/**
 * Class Index
 * @author  : evalor <master@evalor.cn>
 * @package App\HttpController
 */
class Index extends ViewController
{
    function index()
    {
        // Blade View
        $this->render('index');     # 对应模板: Views/index.blade.php

        // Think-Template
        $this->fetch('index');      # 对应模板: Views/index.html

        // Smarty
        $this->fetch('index.html'); # 对应模板: Views/index.html
    }
}

静态资源文件处理

由于 URL Dispatcher 的解析,直接使用 Swoole 作为HTTP服务器,在默认情况下并不能处理静态文件的返回,需要编辑全局配置文件,加入额外的配置项如下:

# eg:
      # mysql.port = 3306
      # MAIN_SERVER.PORT = 80
      # MAIN_SERVER.SETTING.worker_num = 80

      ################ defalut config ##################
      SERVER_NAME = EasySwoole

      MAIN_SERVER.LISTEN_ADDRESS = 0.0.0.0
      MAIN_SERVER.PORT = 9501
      MAIN_SERVER.SERVER_TYPE = WEB_SERVER ## 可选为 SERVER  WEB_SERVER WEB_SOCKET_SERVER
      MAIN_SERVER.SOCK_TYPE = SWOOLE_TCP  ## 该配置项当为SERVER_TYPE值为TYPE_SERVER时有效
      MAIN_SERVER.RUN_MODEL = SWOOLE_PROCESS

      MAIN_SERVER.SETTING.worker_num = 8
      MAIN_SERVER.SETTING.max_request = 5000
      MAIN_SERVER.SETTING.task_worker_num = 8
      MAIN_SERVER.SETTING.task_max_request = 500
      TEMP_DIR = null
      LOG_DIR = null


      ############## 这里是用户自己的配置 ##################
      ## 加入以下两条配置以返回静态文件
      document_root= EASYSWOOLE_ROOT/Public #静态资源目录  
      enable_static_handler = true

注意静态资源目录需要提前新建好 改为自己的目录 !!!不要直接复制!!!

前端服务器

由于 Swoole Server 对 HTTP 协议的支持并不完整,建议仅将 EasySwoole 作为后端服务,并且在前端增加 NGINX 或 APACHE 作为代理,参照下面的例子添加转发规则

NGINX

server {
    root /data/wwwroot/;
    server_name local.swoole.com;
    location / {
        proxy_http_version 1.1;
        proxy_set_header Connection "keep-alive";
        proxy_set_header X-Real-IP $remote_addr;
        if (!-e $request_filename) {
             proxy_pass http://127.0.0.1:9501;
        }
    }
}

APACHE

<IfModule mod_rewrite.c>
  Options +FollowSymlinks
  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  #RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]  fcgi下无效
  RewriteRule ^(.*)$  http://127.0.0.1:9501/$1 [QSA,P,L]
   #请开启 proxy_mod proxy_http_mod request_mod
</IfModule>

results matching ""

    No results matching ""