引言
从控制器内组装好的数据渲染到视图文件,上一章我们演示了简单的单变量数值访问。laravel的模板系统,还提供了很多常用的编程语言的语法结构,其实是PHP的变体,可以让编程人员更好地掌控HTML输出。
本期就来说说模板内的程序结构的高阶用法。
转义 or 不转义
首先是单变量的值,我们在控制器内有可能并没有为该变量赋值,或者并未声明和传递该变量,在模板内直接引用,会抛出 变量未定义
的异常,造成无法渲染。
laravel给了一个简洁的判空的方式,就是 or 语法,很直观,代码用起来如下:
Welcome, {{ $name or 'Laravel Member' }}!
我们上一章介绍过,使用双大括号会在模板解析的时候,生成下面的PHP代码:
<?php echo $variable; ?>
这对常规变量无害,可是对于非法的操作,比如是用户输入的内容,直接展示的话,有可能造成文件和数据库等等的风险,所以对变量要做一次转义,将其内容原封不动地用字符串的方式展现出来,这样做其实非常有必要。
对变量结果进行转义,使用如下的语法:
{!! 'My list <script>alert("spam spam spam!")</script>' !!}
大家看到了,如果上面的内容直接输出到HTML,就会触发js的注入。可是,使用转义之后,就是原文输出,不会被浏览器解析。
循环结构
通常动态数据由数组方式构成,我们不可能在模板内一个一个地书写,那样就造成了重复劳动。模板内要是有循环判断结构,效果就好多了,写一次,无论来多少数据,都只需写一次结构。
laravel模板是支持循环结构的,我们下面演示一下。首先从路由的声明开始:
Route::get('events', 'EventsController@index');
然后在控制器内实现该方法:
我们组装了一个字符串数组,并且发送到视图。在视图内使用循环结构将 $events 的值遍历输出。模板内代码如下:
访问该路由地址之后,生成的HTML页面内容如下:
当然了,对于数组我们免不了使用判空的条件,模板语法如下:
判断条件
有了循环结构,判断条件也不能少。特别是类似RBAC的权限访问控制,那些用户对于哪些菜单,哪些路由地址,拥有权限;而哪些用户没有,这就需要if条件判断。
我们对上一节的示例代码添加条件判断,如果数组 $events 的元素内含有 Laravel 字符,则追加输出 (sweet framework)。
直接上代码:
注意模板内使用 @if ... @endif
包裹判断条件主体内容。在浏览器内访问路由,可以看到输出的HTML内容如下:
对于多层嵌套的 if ... elseif ... else
这样的语法,模板也是支持的,所能形成的判断逻辑也更为复杂,上述代码我们再加点“料”:
执行结束后生成的HTML内容如下:
写在最后
本文我们介绍了MVC模式中的V部分,在视图内使用了简单的条件判断和循环语法。在业务代码中,哪些逻辑放在C内完成,哪些放在V内完成,需要我们灵活使用。总而言之一个宗旨,V视图内不能放太多逻辑代码。
Happy coding
我是@程序员小助手,专注编程知识,圈子动态的IT领域原创作者
发表评论