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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM