3

i don't know the syntax of php 7 i'm actually new to it i'm trying to pass roles like ['admin','user','cmc'] to route middleware like shown below how do i do it properly

this is my route

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

//how do i pass array of roles in it

//role middleware

<?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();
    }

}

how do i pass role like ['admin','user','cmc'] some thing like this into the middleware of role

the problem is i can only get the first value in the array and the rest is not there can some one get me out of this

2 Answers 2

6

I had a similar situation where I wanted to check if a user is an owner or admin before visiting a route; so I didn't need duplicate routes, and needed to pass an array instead of set single parameters.

I went down the route of sending a single paramter but using an | as a delimiter to explode on the middlewhere class.

In the route I had this for the route group Route::group(['middleware' => ['checkRole:admin|owner']], function () {

and then in the middlewhere I used explode

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

Simple looped through the roles array to check if the user had one of the roles :) Hope this helps. Simple and easy for what I needed.

Sign up to request clarification or add additional context in comments.

Comments

0

You can send your parameters separated with comma (which means you're sending more than one parameters):

Route::middleware('my_middleware:param1,param2');

And then get them in the handle function of the middleware as variable function arguments:

public function handle(Request $request, Closure $next, ...$param_array): Response
{
    //use $param_array as an array consisting of parameters sent
    //example: if(in_array($request->param, $param_array)) {do some logic}
}

Credits

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.