Как передать параметр массива в промежуточное ПО в laravel - PullRequest
0 голосов
/ 28 апреля 2018

я не знаю синтаксис 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);
    }
}

// usermodel

<?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'] что-то вроде этого в промежуточное ПО роли

проблема в том, что я могу получить только первое значение в массиве, а остальные нет может кто-нибудь вытащить меня из этого

1 Ответ

0 голосов
/ 08 августа 2018

У меня была похожая ситуация, когда я хотел проверить, является ли пользователь владельцем или администратором перед посещением маршрута; поэтому мне не нужны были дублирующиеся маршруты, и мне нужно было передавать массив вместо установки отдельных параметров.

Я пошел по пути отправки одного параметра, но с помощью | в качестве разделителя, чтобы взорваться на среднем классе.

В маршруте у меня было это для группы маршрутов Route::group(['middleware' => ['checkRole:admin|owner']], function () {

и затем в середине, где я использовал взорваться

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

Простой цикл по массиву ролей, чтобы проверить, была ли у пользователя одна из ролей :) Надеюсь, это поможет. Просто и легко для того, что мне нужно.

...