промежуточное ПО для нескольких контроллеров, использующее те же методы в Laravel 5.2

Я пытаюсь использовать некоторые методы одного и того же контроллера с различными промежуточными программами, например, позволить администратору и пользователю использовать методы index и создавать в одном контроллере. Таким образом, я сделал админа охранять пользователя.

Это мой AdminMidleware

<?php

namespace App\Http\Middleware;

use Closure;
use Auth;

class AdminMidleware
{

public function handle($request, Closure $next)
{
if (Auth::guard('admin')->guest()) {
if ($request->ajax() || $request->wantsJson()) {
return response('Unauthorized.', 401);
} else {
return redirect()->guest('/');
}
}

return $next($request);
}
}

My UserMiddleware

<?php

namespace App\Http\Middleware;

use Closure;
use Auth;

class UserMiddleware
{

public function handle($request, Closure $next)
{
if (Auth::guard('user')->guest()) {
if ($request->ajax() || $request->wantsJson()) {
return response('Unauthorized.', 401);
} else {
return redirect()->guest('/');
}
}

return $next($request);
}
}

Они оба находятся в kernel.php в $ routeMiddleware

'admin' => \App\Http\Middleware\AdminMidleware::class,
'user' => \App\Http\Middleware\UserMiddleware::class,

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

public function __construct(){
$this->middleware('admin', ['only' => [
'index',
'create',
]]);
}

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

public function __construct(){
$this->middleware(['admin', 'user'], ['only' => [
'index',
'create',
]]);
}

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

1

Решение

Поскольку ваше промежуточное программное обеспечение идентично, за исключением guard б, вы можете попытаться сделать auth промежуточное ПО, которое имитирует auth промежуточное ПО, которое поставляется с более новыми версиями Laravel. Это позволит вам передавать несколько охранников в качестве параметров промежуточному программному обеспечению.

public function handle($request, Closure $next)
{
// get guards or use 'null' (default guard)
$guards = array_slice(func_get_args(), 2) ?: [null];

// spin through guards to find one that checks out
foreach ($guards as $guard) {
if (Auth::guard($guard)->check()) {
// if we have a guard name, not null
if ($guard) {
// use this guard as the default
Auth::shouldUse($guard);
}

// we have an authed user from some guard move along
return $next($request);
}
}

// handle no authed user
if ($request->ajax() || $request->wantsJson()) {
return response('Unauthenticated.', 401);
}

return redirect()->guest('/');
}

Он будет проходить через всех пройденных охранников, и если кто-либо из них разрешит пользователя, этот охранник станет защитником по умолчанию, который Auth буду использовать.

$this->middleware('thatmiddleware:user,admin');

Нечто подобное должно работать.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]