Laravel自定義模板指令小結

介紹

一般咱們在視圖模板中編寫複雜的邏輯,看上去顯得很雜亂,那麼使用自定義的模板Directives,能夠簡化你的視圖邏輯,編寫出更優雅的代碼,Laravel Blade是一種將其特殊語法編譯成PHP和HTML的模板引擎。其特殊語法指令,指令是加糖功能,在其後隱藏雜亂的代碼。模板包含大量的內置指令,例如@foreach/@if/@section/@extends等等,內置的指令對於作一個簡單的項目足以,可是當你在代碼中編寫重複複雜的功能時,那麼自定義模板指令或許能夠幫你優化你的視圖結構。php


自定義一個簡單的模板指令

$expression參數是可選的html

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

視圖中用法Demoexpress

<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()
    {
        //
    }
}

以這種方式定義的指令加載成功,能夠在任何模板中使用ide


注意事項

第一點

不能直接訪問自定義指令中傳遞的多個參數,須要將其遍歷出來函數

<p>@greet('Hi', 'Hammad')</p>

\Blade::directive('hello', function ($expression) {
    list($greet, $name) = explode(', ', $expression);

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

像 array() list() 這種並非一個函數,而是一種語言結構post

第二點

必定要時刻記住須要過濾輸出,通常使用{{}}時候,Blade已經預先執行了過濾操做,爲了不惡意用戶將js代碼注入到站點,必定要轉義HTML,能夠使用Laravel自帶的函數e(),也至關於htmlentities()優化

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

第三點

每次添加或修改自定義模板指令以後,必定要先清除緩存視圖模板,能夠使用clear Artisanspa

php artisan view:clear

Laravel5.5新特性

在使用自定義的模板指令的時候,大多數只是某種形式的條件,這些要求咱們須要註冊三個獨立指令,if/else/endif,目前Laravel5.5已經支持簡化條件指令,例以下面的實例,模板能夠使用admin/else/endadmincode

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

結尾說明

2017 ending! script maker!
相關文章
相關標籤/搜索