美文网首页
Laravel 5.5.22 自定義 Blade 模板條件指令

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

作者: RayC9223 | 来源:发表于2017-12-07 19:28 被阅读0次

    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 指令組

    <div class="content">
        <div class="title m-b-md">
            Laravel
        </div>
    
        @admin
            Welcome, Administrator {{ Auth::user()->name }}
        @else
            Welcome to Laravel
        @endadmin
    </div>
    

    6. 測試

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


    normal_user.png

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

    向 roles 表添加一條數據:

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

    刷新


    admin.png

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

    By RayC 2017-12-7

    相关文章

      网友评论

          本文标题:Laravel 5.5.22 自定義 Blade 模板條件指令

          本文链接:https://www.haomeiwen.com/subject/cfpjixtx.html