【问题标题】:How to pass array parameter to middleware in laravel如何将数组参数传递给laravel中的中间件
【发布时间】:2018-10-08 22:12:08
【问题描述】:

我不知道 php 7 的语法我实际上是新手 我正在尝试将 ['admin','user','cmc'] 之类的角色传递给路由中间件,如下所示我该怎么做

这是我的路线

  Route::get('/dashboard','HomeController@dashboard')->name('dashboard')->middleware("roles:['admin','user']");

//我如何在其中传递角色数组

//角色中间件

<?php

namespace App\Http\Middleware;

use Closure;
use App\Role;
use Illuminate\Support\Facades\Log;


class Roles
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next,$role)
    {
        Log::info($role);
        if($request->user()==null){
            return response('unauthorised Access detected',401);
        }
        //check for any role passed from array 
        if($request->user()->hasAnyRole($role)){
            return $next($request);
        }        
        return response('unauthorised Access detected',401);
    }
}

//用户模型

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Laravel\Passport\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];
    public function role(){
        return $this->hasMany(Role::class);
    }
    public function hasANyRole($roles){
        if(is_array($roles)){
            foreach($roles as $role){
                if($this->hasRole($role)){
                    return true;
                }
            }return false;
        }else{
            if($this->hasRole($roles)){
                return true;
            }
            return false;
        }
    }
    public function hasRole($role){
        if($this->role()->where('role',$role)->first()){
            return true;
        }
        return false;
    }
    public function getRole(){
    return $this->role()->select('role')->get();
    }

}

我如何将像 ['admin','user','cmc'] 这样的角色传递给角色的中间件

问题是我只能得到数组中的第一个值,其余的都不存在 有人能帮我解决吗

【问题讨论】:

    标签: php laravel laravel-middleware


    【解决方案1】:

    我有类似的情况,我想在访问路线之前检查用户是所有者还是管理员;所以我不需要重复的路由,并且需要传递一个数组而不是设置单个参数。

    我沿着发送单个参数的路线走,但使用 |作为在中间类爆炸的分隔符。

    在路线中,我为路线组提供了这个 Route::group(['middleware' =&gt; ['checkRole:admin|owner']], function () {

    然后在中间我用了explode

    $roles = explode('|', $permitted_roles);
    

    Simple 循环遍历角色数组以检查用户是否具有角色之一 :) 希望这会有所帮助。简单易行,满足我的需要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-29
      • 2020-12-24
      • 1970-01-01
      相关资源
      最近更新 更多