如何在 laravel 中将数组参数传递给中间件
How to pass array parameter to middleware in laravel
我不知道 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'] 这样的角色传递到角色
的中间件中
问题是我只能得到数组中的第一个值,其余的不存在
谁能帮我摆脱这个
我有过类似的情况,我想在访问路由之前检查用户是所有者还是管理员;所以我不需要重复的路由,并且需要传递一个数组而不是设置单个参数。
我沿着发送单个参数但使用 | 的路线走下去作为分隔符在中间位置展开 class。
在路线中,我为路线组设置了这个
Route::group(['middleware' => ['checkRole:admin|owner']], function () {
然后在中间我用了explode
$roles = explode('|', $permitted_roles);
Simple 遍历角色数组以检查用户是否具有其中一个角色:)希望这有帮助。简单易行,满足我的需求。
我不知道 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'] 这样的角色传递到角色
的中间件中问题是我只能得到数组中的第一个值,其余的不存在 谁能帮我摆脱这个
我有过类似的情况,我想在访问路由之前检查用户是所有者还是管理员;所以我不需要重复的路由,并且需要传递一个数组而不是设置单个参数。
我沿着发送单个参数但使用 | 的路线走下去作为分隔符在中间位置展开 class。
在路线中,我为路线组设置了这个
Route::group(['middleware' => ['checkRole:admin|owner']], function () {
然后在中间我用了explode
$roles = explode('|', $permitted_roles);
Simple 遍历角色数组以检查用户是否具有其中一个角色:)希望这有帮助。简单易行,满足我的需求。