迁移Blade视图层模板

仓库地址: Blade

安装

  1. composer require jenssegers/blade

通过向其传递视图文件所在的文件夹和缓存文件夹来创建一个Blade实例。通过调用make方法来渲染一个模板。有关Blade模板引擎的更多信息可以在http://laravel.com/docs/5.1/blade
添加模板配置


先单例Blade,为什么我们要用单例?先留个彩蛋

  1. namespace App\Vendor\Db;
  2. class Blade
  3. {
  4. static function getInstance(){
  5. static $blade = null;
  6. if($blade === null){
  7. $blade = new \Jenssegers\Blade\Blade([ROOT . '/views/'],ROOT . '/Temp/TplCache');
  8. }
  9. return $blade;
  10. }
  11. }

建立视图控制器抽象类

  1. <?php
  2. namespace App\Controller;
  3. use Core\AbstractInterface\AbstractController;
  4. use App\Vendor\Db\Blade;
  5. abstract class ViewController extends AbstractController
  6. {
  7. function View($tplName, $tplData = [])
  8. {
  9. $viewTemplate = Blade::getInstance()->render($tplName, $tplData);
  10. $this->response()->write($viewTemplate);
  11. }
  12. }

添加测试模板文件

views目录下添加一个模板文件Index/index.balde.php,可以直接复制下面的内容来测试

  1. <!doctype html>
  2. <html lang="zh">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  6. <title>Template Test</title>
  7. </head>
  8. <body>
  9. <p>If you see this message, the template engine has been initialized successfully</p>
  10. </body>
  11. </html>

添加测试控制器

修改默认的Index控制器,位于App\Controller\Index.php,继承自ViewController并尝试输出模板

  1. <?php
  2. namespace App\Controller;
  3. use App\ViewController;
  4. class Index extends ViewController
  5. {
  6. function index()
  7. {
  8. // 输出Index模板
  9. $this->View('Index/index', ['name' => 'easySwoole']);
  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. }

然后重启服务,访问http://localhost:9501看到刚才模板文件中的内容,则说明模板引擎加载成功

使用拓展 Blade(彩蛋在这里)

通过调用compiler函数轻松创建指令

  1. use App\Vendor\Db\Blade;
  2. //需要在server启动前写
  3. Blade::getInstance()->compiler()->directive('datetime', function ($expression) {
  4. return "<?php echo with({$expression})->format('F d, Y g:i a'); ?>";
  5. });
  6. //在你的模板内
  7. <?php $dateObj = new DateTime('2017-01-01 23:59:59') ?>
  8. @datetime($dateObj)

由于不能实现 Larvel 服务容器 中检索服务,有些功能是不能实现的,如 服务注入, 共享视图模板,自定义 If 语句

题外扩展

es本身不提供帮助函数,我们可以创建Conf/Helpers.php,然后

  1. //服务启动前加载,我们的blade就可以使用自定义的函数了
  2. $loader->requireFile('Conf/Helpers.php');

UP主扩展了几个方法,若使用不当的可以在群里指道一下UP主

  1. use Illuminate\Support\HtmlString;
  2. if (! function_exists('app')) {
  3. /**
  4. * 获取Di容器
  5. *
  6. * @param string $abstract
  7. * @return mixed|\Core\Component\Di
  8. */
  9. function app($abstract = null)
  10. {
  11. if (is_null($abstract)) {
  12. return \Core\Component\Di::getInstance();
  13. }
  14. return \Core\Component\Di::getInstance()->get($abstract);
  15. }
  16. }
  17. if (! function_exists('asset')){
  18. /**
  19. * 转发静态文件
  20. * \Conf\Config::getInstance()->getConf('ForwardingDomain') 转发域名
  21. * @param string $path 静态文件路径
  22. * @return string
  23. */
  24. function asset($path = ''){
  25. return \Conf\Config::getInstance()->getConf('ForwardingDomain') .'/'. $path;
  26. }
  27. }
  28. if (! function_exists('url')){
  29. /**
  30. * @param $path 基本的url跳转
  31. * @return string
  32. */
  33. function url($path){
  34. return 'http://' . \Core\Http\Request::getInstance()->getHeader('host')[0] . '/' . $path;
  35. }
  36. }
  37. if (! function_exists('currentUrl')){
  38. /**
  39. * 获取当前的url
  40. * @return \Core\Http\Message\Uri
  41. */
  42. function currentUrl(){
  43. return \Core\Http\Request::getInstance()->getUri();
  44. }
  45. }
  46. if (! function_exists('method_field')) {
  47. /**
  48. * Generate a form field to spoof the HTTP verb used by forms.
  49. *
  50. * @param string $method
  51. * @return \Illuminate\Support\HtmlString
  52. */
  53. function method_field($method)
  54. {
  55. return new HtmlString('<input type="hidden" name="_method" value="'.$method.'">');
  56. }
  57. }