Laravel 5.5.22 自定義 Blade 模板條件指令

Laravel 5.5 中新增了 @auth@guest 條件指令
我們在 Blade 模板中可以用以下指令針對 已登入與未登入用戶 作區分顯示

@auth
    Welcome {{ user()->name }}!
@endauth

@guest
    Welcome Guest!
@endguest

但是對於管理員用戶 ( 或訂閱用戶 ), 只能用類似以下的條件判斷

@if(auth()->check() && auth()->user()->isAdmin())
    #authenticated and user is admin
@else
    #normal user or not logged in
@endif

其中 isAdmin() 是 User Model 中的自定義方法, 後面會講到

只用一次還好, 如果頁面中多處需要判斷就會變得很不方便

welcome.blade.php 頁面加上

@admin
    Welcome, Administrator {{ Auth::user()->name }}
@else
    Welcome to Laravel
@endadmin

結果出錯, 那是因為 Blade 模板不能正確識別 @admin 這個條件指令

下面我們一步一步來自定義 Blade 模板條件指令

1. 創建登錄套件

命令行輸入:

php artisan make:auth

本例使用 Laravel 附帶的用戶驗證功能

2. 創建 Role Model 和遷移文件

php artisan make:model Role -m

3. users 表和 roles 表字段如下

#users表
Schema::create('users', function (Blueprint $table) {
    $table->increments('uid');
    $table->string('name')->unique();
    $table->string('email')->unique();
    $table->string('password');
    $table->rememberToken();
    $table->timestamps();
});

#roles表
Schema::create('roles', function (Blueprint $table) {
    $table->increments('role_id');
    $table->integer('uid');
    $table->string('roles');
    $table->string('description');
    $table->timestamps();
});

調整 User Model 和 Role Model 的 $primaryKey 屬性

#User Model
protected $primaryKey = 'uid';
#Role Model
protected $primaryKey = 'role_id';

生成數據表

php artisan migrate

調整 LoginController 和 RegisterController 的 $redirectTo 屬性為根目錄

protected $redirectTo = '/';

4. User Model 加入自定義方法 isAdmin( )

use Auth;
use App\Role;

public function isAdmin(){
    if(Auth::user()){
        $rs = Role::where('uid', Auth::user()->uid)->value('roles');
        return $rs == 'admin' ? true : false;
    }
}

5. 讓 Blade 模板識別自定義指令

打開 AppServiceProvider.php, 加入以下內容:

use Illuminate\Support\Facades\Schema;
#當 MySQL 版本低於 5.7.7 時, 為能使其正確創建索引, 需要使用 Schema Facades將字段默認長度手動配置為191
public function boot()
{
    \Blade::if('admin', function(){
        return auth()->check() && auth()->user()->isAdmin();
    });

    Schema::defaultStringLength(191);
}

打開 welcome.blade.php, 在 Laravel 字樣下面加入 @admin 指令組

Laravel
@admin Welcome, Administrator {{ Auth::user()->name }} @else Welcome to Laravel @endadmin

6. 測試

註冊一個新用戶, 成功後會跳轉至歡迎頁面, 但卻不是我們想象中的結果


Laravel 5.5.22 自定義 Blade 模板條件指令_第1张图片
normal_user.png

那是因為, 我們的 roles 表仍然是空的, 剛剛註冊的這個用戶只是普通用戶

向 roles 表添加一條數據:

INSERT INTO roles (uid, roles, description) VALUES (1, 'admin', 'Administrator');

刷新


Laravel 5.5.22 自定義 Blade 模板條件指令_第2张图片
admin.png

至此, Laravel 5.5.22 自定義 Blade 模板條件指令全部完成

By RayC 2017-12-7

你可能感兴趣的:(Laravel 5.5.22 自定義 Blade 模板條件指令)