Laravel Blade

  • Laravel默认使用Blade作为模板引擎,Blade中可使用原生PHP代码输出。
  • Blade模板使用.blade.php作为文件扩展名。
  • Blade模板最终都将被“编译”(正则替换)成原生PHP代码并缓存,除非模板文件被修改否则不会重新编译。

模板引擎需要完成最基本三项功能:

  • 引入继承
  • 变量输出
  • 流程控制

模板引入

Blade提供@include指令以便于在一个视图中引入另一个视图,所有父视图中变量均在被引入子视图中可用。可向被包含的视图传递额外数据。

@include('view.head', ['data'=>'list'])

模板继承

Blade提供模板继承和部件可使不同页面使用统一的布局,当定义子视图时,使用@extends指令指定子视图需继承的父视图,使用@section指令向布局的部件中注入内容。

指令描述
@section指令定义内部的部件
@yield指令为给定部件展示内容
@extends指令指定子视图所需继承的父视图

视图的布局通常都会拥有一个统一的模板,可建立统一的基础布局模板layout.blade.php,让其他视图文件都来继承自它。

$ vim resources/view/layout.blade.php
<!doctype html>
<html lang="{{$setting['lang']}}">
<head>
    <meta charset="{{$setting['charset']}}">
    <title>@{{$title}}</title>
</head>
<body>
      @yield('content')
</body>
</html>
$ vim resources/views/index.blade.php
@extends('layout')

@section('content')
<h1>index page</h1>
@stop

例如:使用带有侧边栏的布局

$ vim resources/view/layout.blade.php
<!doctype html>
<html lang="{{$setting['lang']}}">
<head>
    <meta charset="{{$setting['charset']}}">
    <title>@{{$title}}</title>
</head>
<body>
      <div class="sidebar">
      @section('sidebar')
      <h3>控制面板</h3>
      @show
      </div>
      <div class="content">
      @yield('content')
      </div>
</body>
</html>
$ vim resources/views/child.blade.php
@extends('layout')

@section('sidebar')
@parent
<ul>
  <li>菜单条目</li>
  <li>菜单条目</li>
  <li>菜单条目</li>
</ul>
@endsection

@section('content')
<h1>demo page</h1>
@endsection

变量输出

  • {{{...}}}用于转义输出
  • {{$name or 'defualt_value'}} 默认值输出
  • {{isset($name)?$name:''}} 三元条件判断

{{$var}}之间是要输出的变量内容,此种方式会与某些JS框架发生冲突,例如在AngularJS中采用{{}}进行数据绑定,因此可使用@{{ $var }}语法告知Blade渲染引擎表达式保留原样。

在Blade中@打头的都是指令,例如流程控制的输出@if...@ifend

默认使用{{$var}}语法会自动传递给PHP的htmlentities()来对变量进行HTML实体化处理以避免XSS攻击。使用{!! $var !!}可避免htmlentities()处理,进而原样输出。

流程控制

  • 条件分支
  • 循环分支

条件控制

  • 使用@if...@elseif...@else...@endif指令创建条件分支表达式。
  • 使用@unless(bool)...@endunless指令,表示除非条件满足则执行。

循环控制

  • 使用@for($i=0; $i<$length;$i++)...@endfor
  • 使用@foreach($list as $item)...@endforeach
  • 使用@forelse($list as $item)...@empty...@endforelse
  • 使用@while(true)...@endwhile

结束循环或跳出当前循环

@foreach ($list as $item)
    @if ($item->status== 1)
        @continue
    @endif
 
    <li>{{ $item->name }}</li>
 
    @if ($item->count >= 100)
        @break
    @endif
@endforeach

把条件和指令声明放在同一行

@foreach ($list as $item)
    @continue($item->status == 1)
    <li>{{ $item->name }}</li>
    @break($item->count >= 100)
@endforeach

循环变量$loop的属性对于循环控制提供了很好的帮助。

@foreach ($list as $item)
    @if ($loop->first)
        迭代第一条
    @endif
 
    @if ($loop->last)
        迭代最后一条
    @endif
 
    <p>{{ $item->name }}</p>
@endforeach
循环迭代描述
$loop->index以索引值0开始当前循环迭代的位置下标
$loop->iteration当前循环迭代从1开始
$loop->remaining循环中剩余的迭代
$loop->count数组中要迭代的条目总数
$loop->first是否为循环中第一次迭代
$loop->last是否为循环中最后一次迭代
$loop->depth当前循环嵌套的层级
$loop->parent嵌套循环中父级循环的$loop变量

生成URL

  • 使用url()辅助函数生成路由
{{url('admin/login')}}

url()辅助函数的Facade外观方法为URL::to()方法

{{URL::to('admin/login')}}
  • 若注册路由时指定别名可通过route()辅助函数以路由别名为参数生成URL

在路由中注册时使用别名

$ vim route/web.php
Route::prefix('admin')->group(function() {
    Route::get('/login', 'LoginController@index')->name("login");
    Route::post('/login/signin', 'LoginController@signin')->name("signin");
    Route::get('/', 'HomeController@index')->name("home");
});

在模板引擎中使用路由别名生成URL

<form class="m-t" role="form" method="post" action="{{route('signin')}}">
</form>

route()辅助函数的Facade外观方法为URL::route()

<form class="m-t" role="form" method="post" action="{{URL::route('signin')}}">
</form>
  • 若注册路由时没有指定别名可使用action()辅助函数以控制器与方法作为参数生成URL
{{action('UserController@index', ['id'=>1])}}

辅助函数action()的Facade外观方法为URL::action()方法

{{URL::action('UserController@index', ['id'=>1])}}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值