模板引擎

EasySwoole虽说是专为API打造,但难免有些用户想一站全撸,本例介绍了如何集成模板引擎,配合Apache或者是Nginx做静态服务器,构建全站开发示例。

本示例介绍两种模板引擎的集成,分别是Smarty引擎和来自LaravelBlade引擎

集成前准备

由于swoole_http_server对Http协议的支持并不完整,建议仅将easySwoole作为后端服务,并且在前端增加Nginx或者Apache作为代理,参照下面的例子添加转发规则,将请求转发给Swoole Server处理

Nginx转发规则

  1. server {
  2. root /data/wwwroot/;
  3. server_name local.swoole.com;
  4. location / {
  5. proxy_http_version 1.1;
  6. proxy_set_header Connection "keep-alive";
  7. proxy_set_header X-Real-IP $remote_addr;
  8. if (!-e $request_filename) {
  9. proxy_pass http://127.0.0.1:9501;
  10. }
  11. }
  12. }

Apache转发规则

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

集成Smarty引擎" class="reference-link">集成Smarty引擎

支持库引入

下载Smarty,并将其全部项目文件放入App/Vendor/Smarty目录下。在框架初始化事件引入。

  1. $loader = AutoLoader::getInstance()->requireFile("App/Vendor/Smarty/Smarty.class.php");

基础封装

请注意下面的代码中设置了模板目录,请提前新建好模板目录并添加模版文件

  1. namespace App\Utility;
  2. use Core\Component\Di;
  3. class Smarty extends \Smarty
  4. {
  5. function __construct()
  6. {
  7. $tempDir = Di::getInstance()->get(SysConst::TEMP_DIRECTORY);
  8. parent::__construct();
  9. $this->setCompileDir("{$tempDir}/templates_c/");
  10. $this->setCacheDir("{$tempDir}/cache/");
  11. //注意这里设置了模板目录
  12. $this->setTemplateDir(ROOT."/App/Static/Template/");
  13. $this->setCaching(false);
  14. }
  15. /*
  16. 封装这个函数的原因在于,smarty的dispaly是直接echo输出的
  17. */
  18. function getDisplayString($tpl){
  19. return $this->fetch($tpl,$cache_id = null, $compile_id = null, $parent = null, $display = false,
  20. $merge_tpl_vars = true, $no_output_filter = false);
  21. }
  22. }

建立自定义控制器抽象类

  1. namespace App\Controller\Test;
  2. use App\Utility\Smarty;
  3. use Core\AbstractInterface\AbstractController;
  4. abstract class Base extends AbstractController
  5. {
  6. function display($tpl,$data = array()){
  7. $smarty = new Smarty();
  8. foreach ($data as $key => $item){
  9. $smarty->assign($key,$item);
  10. }
  11. $this->response()->write($smarty->getDisplayString($tpl));
  12. }
  13. }

建立测试控制器

  1. namespace App\Controller\Test;
  2. class Index extends Base
  3. {
  4. function index()
  5. {
  6. // TODO: Implement index() method.
  7. $this->display("index.html",array(
  8. "welcome"=>"easySwoole"
  9. ));
  10. }
  11. function onRequest($actionName)
  12. {
  13. // TODO: Implement onRequest() method.
  14. }
  15. function actionNotFound($actionName = null, $arguments = null)
  16. {
  17. // TODO: Implement actionNotFound() method.
  18. }
  19. function afterAction()
  20. {
  21. // TODO: Implement afterAction() method.
  22. }
  23. }

集成Blade引擎" class="reference-link">集成Blade引擎

对于从Laravel迁移到easySwoole的用户,可以选择集成熟悉的Blade引擎,以便快速上手,我们通过Composer进行集成以简化集成的难度,如果还没有为easySwoole添加Composer支持,请参照手册中的自动加载章节来配置,也可以用下面的方法集成任意一个通过Composer加载的第三方模板引擎

安装引擎

  1. composer require jenssegers/blade

建立视图控制器抽象类

  1. <?php
  2. namespace App\Controller;
  3. use Core\AbstractInterface\AbstractController;
  4. use Jenssegers\Blade\Blade;
  5. abstract class ViewController extends AbstractController
  6. {
  7. protected $TemplateViews = ROOT . '/Templates/';
  8. protected $TemplateCache = ROOT . '/Temp/TplCache';
  9. function View($tplName, $tplData = [])
  10. {
  11. $blade = new Blade([$this->TemplateViews], $this->TemplateCache);
  12. $viewTemplate = $blade->render($tplName, $tplData);
  13. $this->response()->write($viewTemplate);
  14. }
  15. }

在控制器中使用

控制器需要继承自ViewController,需要提前创建好模板文件,模板文件和laravel是一致的,如下面的例子模板文件是Templates/Index/index.blade.php

  1. $this->View('Index/index', ['name' => 'easySwoole']);

关于Blade引擎的使用可以参考laravel文档: http://laravel.com/docs/5.1/blade