laravel学习笔记(三)视图渲染

1、模板继承

  1)定义模板

    示例如下

   a)主模板(resources/views/common/layout.blade.php):

<html>
    <head>
        <title>@yield('title')</title>
    </head>
    <body>
        @section('topbar')
            主页面顶部内容
        @show

        <div class="container">
            @yield('content')
        </div>
    </body>
</html>

  其中@section('xxx')...@show和@yield('xxx')都是用来显示继承模板中指定块的内容的,只是@section('xxx')...@show之间的内容可以被继承模板通过@parent的方式获取

  b)继承模板(resources/views/home/home.blade.php):

@extends('common.layout')

@section('title', '标题')

@section('topbar')
    @parent
    <p>子页面顶部内容</p>
@stop
@section('content') 
  <p>子页面主体内容</p>
@stop

  其中@extends指令用来指定子页面所继承的布局,@section('xxx', '内容')和@section('xxx')...@stop用来定义指定块的内容,@parent用来追加主模板中指定块原有的内容

2、包含子视图

  Blade的@include指令允许在一个视图中包含另一个Blade视图,所有父级视图中变量在被包含的子视图中依然有效,如下:

<div>
    @include('文件夹.子视图')

    <form>
        <!-- Form Contents -->
    </form>
</div>

  如果需要传递额外的变量,可以通过如下方式

@include('文件夹.子视图', ['参数名' => '参数值'])

  如果要包含一个有可能不存在的视图,可以使用 @includeIf 指令,如下:

@includeIf('文件夹.子视图', ['参数名' => '参数值'])

  如果包含的视图取决于一个给定的布尔条件,可以使用 @includeWhen 指令:

@includeWhen($boolean, '文件夹.子视图', ['参数名' => '参数值'])

  要包含给定数组中的第一个视图,可以使用 @includeFirst 指令:

@includeFirst(['文件夹1.子视图1', '文件夹2.子视图2'], ['参数名' => '参数值'])

  如果要循环引入多个局部视图,可以使用 @each 指令:

@each('文件夹.子视图', $参数数组, '子视图中的参数名')

  在子视图中,可以通过$子视图中的参数名获取$参数数组中对应的值,且可以通过key变量访问当前迭代的键值,如在$参数数组为空时,需要引用其他子视图的话,可以增加第四个变量,如下:

@each('文件夹.子视图', $参数数组, '子视图中的参数名','文件夹.为空时的子视图')

3、堆栈

  Blade 允许你推送内容到命名堆栈,以便在其他视图或布局中渲染。这方便在子视图中引入指定JavaScript和css库,如下:

@push('scripts')
    <script src="/example.js"></script>
@endpush

  推送次数不限,要渲染完整的堆栈内容,传递堆栈名称到 @stack 指令即可:

<head>
    @stack('scripts')
</head>

4、服务注入

  @inject指令可以用于从服务容器中获取服务,传递给 @inject 的第一个参数是服务对应的变量名,第二个参数是要解析的服务类名或接口名:

@inject('metrics', 'App\Services\MetricsService')

<div>
    Monthly Revenue: {{ $metrics->monthlyRevenue() }}.
</div>

5、Blade其他指令

  1)可以使用 @if , @elseif , @else 和 @endif 来构造 if 语句,这些指令的功能和 PHP 相同,如下:

@if (count($records) === 1)
    I have one record!
@elseif (count($records) > 1)
    I have multiple records!
@else
    I don't have any records!
@endif

  2)为方便起见,Blade 还提供了 @unless...@endunless 指令,表示除非,如下:

@unless (1==1)
    1!=1
@endunless

  3)此外,Blade 还提供了 @isset...@endisset、@empty...@endempty、@switch...@endswitch、@case、@break、@default、@for...@endfor、@foreach...@endforeach、@forelse...@empty...@endforelse、@while...@endwhile等方法,起到判断和循环的作用,如在循环中,可以通过$loop变量判断当前循环的状态,$loop变量的属性如下:

  

 6、自定义blade指令

  如需自定义blade指令,可以在app/Providers/AppServiceProvider.php的boot方法中增加如下代码:

\Blade::directive('datetime', function($expression) {
	return "<?php echo date('Y-m-d H:i:s', $expression); ?>";
});

  然后在blade模板中通过如下方式引用:

@datetime(1508888888)

  注:更新完 Blade 指令逻辑后,必须删除所有的 Blade 缓存视图。缓存的 Blade 视图可以通过 Artisan 命令 view:clear 移除。

  如还想自定义if语句,可以在boot方法中通过Blade::if 方法定义:

\Blade::if('env', function ($environment) {
	return app()->environment($environment);
});

  在blade模板中使用方式如下:

@env('local')
    The application is in the local environment...
@else
    The application is not in the local environment...
@endenv

  

posted @ 2019-01-11 12:25  fengzmh  阅读(1377)  评论(1编辑  收藏  举报