Laravel框架中自定义模板指令总结


Posted in PHP onDecember 17, 2017

介绍

最近在学习laravel,在Laravel框架中使用模板的一种方法就是通过控制器布局,通常我们在视图模板中编写复杂的逻辑,看上去显得很杂乱,那么使用自定义的模板Directives,可以简化你的视图逻辑,编写出更优雅的代码,Laravel Blade是一种将其特殊语法编译成PHP和HTML的模板引擎。其特殊语法指令,指令是加糖功能,在其后隐藏杂乱的代码。模板包含大量的内置指令,例如@foreach/@if/@section/@extends等等,内置的指令对于做一个简单的项目足以,但是当你在代码中编写重复复杂的功能时,那么自定义模板指令或许可以帮你优化你的视图结构。

下面话不多说了,来一起看看详细的介绍吧。

自定义一个简单的模板指令

$expression参数是可选的

\Blade::directive('directive_name', function ($expression) {
 return $expression;
});

视图中用法Demo

<p>@hello('World')</p>

声明自定义模板指令的位置AppServiceProvider.php

<?php
namespace App\Providers;
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
 /**
  * Perform post-registration booting of services.
  *
  * @return void
  */
 public function boot()
 {
  Blade::directive('hello', function ($expression) {
   return "<?php echo 'Hello ' . {$expression}; ?>";
  });
 }
 /**
  * Register bindings in the container.
  *
  * @return void
  */
 public function register()
 {
  //
 }
}

以这种方式定义的指令加载成功,可以在任何模板中使用

注意事项

第一点

不能直接访问自定义指令中传递的多个参数,需要将其遍历出来

<p>@greet('Hi', 'Hammad')</p>
\Blade::directive('hello', function ($expression) {
 list($greet, $name) = explode(', ', $expression);

 return "<?php echo {$greet} . ' ' . {$name}; ?>";
});

像 array() list() 这种并不是一个函数,而是一种语言结构

第二点

一定要时刻记住需要过滤输出,一般使用{{}}时候,Blade已经预先执行了过滤操作,为了避免恶意用户将js代码注入到站点,一定要转义HTML,可以使用Laravel自带的函数e(),也相当于htmlentities()

\Blade::directive('hello', function ($expression) {
 return "<?php echo 'Hello ' . e({$expression}); ?>";
});

第三点

每次添加或修改自定义模板指令之后,一定要先清除缓存视图模板,可以使用clear Artisan

php artisan view:clear

Laravel5.5新特性

在使用自定义的模板指令的时候,大多数只是某种形式的条件,这些要求我们需要注册三个独立指令,if/else/endif,目前Laravel5.5已经支持简化条件指令,例如下面的实例,模板可以使用admin/else/endadmin

public function boot()
{
 \Blade::if('admin', function () {
  return auth()->check() && auth()->user()->isAdmin();
 });
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
让你同时上传 1000 个文件 (二)
Oct 09 PHP
《PHP编程最快明白》第八讲:php启发和小结
Nov 01 PHP
php学习笔记 面向对象的构造与析构方法
Jun 13 PHP
php max_execution_time执行时间问题
Jul 17 PHP
php截取后台登陆密码的代码
May 05 PHP
PHP数组无限分级数据的层级化处理代码
Dec 29 PHP
php定义数组和使用示例(php数组的定义方法)
Mar 29 PHP
ThinkPHP分组下自定义标签库实例
Nov 01 PHP
PHP微信API接口类
Aug 22 PHP
PHP实现一维数组与二维数组去重功能示例
May 24 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
Dec 20 PHP
php设计模式之抽象工厂模式分析【星际争霸游戏案例】
Jan 23 PHP
PHP结合Vue实现滚动底部加载效果
Dec 17 #PHP
PHP7下协程的实现方法详解
Dec 17 #PHP
浅谈PHP实现大流量下抢购方案
Dec 15 #PHP
PHP实现数组的笛卡尔积运算示例
Dec 15 #PHP
PHP中OpenSSL加密问题整理
Dec 14 #PHP
利用PHP判断是手机移动端还是PC端访问的函数示例
Dec 14 #PHP
THINKPHP3.2使用soap连接webservice的解决方法
Dec 13 #PHP
You might like
PHP脚本中include文件出错解决方法
2008/11/20 PHP
大家在抢红包,程序员在研究红包算法
2015/08/31 PHP
PHP进行批量任务处理不超时的解决方法
2016/07/11 PHP
PHP-FPM运行状态的实时查看及监控详解
2016/11/18 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
2019/11/26 PHP
node.js中的path.join方法使用说明
2014/12/08 Javascript
JQuery中属性过滤选择器用法实例分析
2015/05/18 Javascript
window.onerror()的用法与实例分析
2016/01/27 Javascript
如何快速上手Vuex
2017/02/14 Javascript
详解angular 中的自定义指令之详解API
2017/06/20 Javascript
JS中把函数作为另一函数的参数传递方法(总结)
2017/06/28 Javascript
JS实现前端缓存的方法
2017/09/21 Javascript
如何在vue中使用ts的示例代码
2018/02/28 Javascript
jQuery时间戳和日期相互转换操作示例
2018/12/07 jQuery
微信小程序开发之map地图组件定位并手动修改位置偏差
2019/08/17 Javascript
微信小程序分包加载代码实现方法详解
2019/09/23 Javascript
javascript实现倒计时效果
2020/02/17 Javascript
Layer UI表格列日期格式化及取消自动填充日期的实现方法
2020/05/10 Javascript
[38:32]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第二局
2016/02/26 DOTA
Python中的__SLOTS__属性使用示例
2015/02/18 Python
python实现在windows下操作word的方法
2015/04/28 Python
在Python中使用正则表达式的方法
2015/08/13 Python
使用Python开发SQLite代理服务器的方法
2018/12/07 Python
Pytorch模型转onnx模型实例
2020/01/15 Python
pytorch使用tensorboardX进行loss可视化实例
2020/02/24 Python
详解numpy.ndarray.reshape()函数的参数问题
2020/10/13 Python
魔声耳机官方网站:Monster是世界第一品牌的高性能耳机
2016/10/26 全球购物
安全标准化实施方案
2014/02/20 职场文书
文明城市标语
2014/06/16 职场文书
学校社会实践活动总结
2014/07/03 职场文书
2014小学二年级班主任工作总结
2014/12/05 职场文书
小学生表扬稿范文
2015/05/05 职场文书
2015年第31个教师节致辞
2015/07/31 职场文书
药房管理制度范本
2015/08/06 职场文书
婚礼长辈答谢词
2015/09/29 职场文书
七年级之家长会发言稿范文
2019/09/04 职场文书