Пользовательское промежуточное ПО Laravel 5.6 ломает привязку модели - PullRequest
0 голосов
/ 29 августа 2018

Это мой routes/api.php

Route::group([
    'middleware' => 'jwt.auth',
], function ($router) {

    //Route group with my custom middleware
    Route::group([
        'middleware' => CheckPermission::class
    ], function ($router) {

        Route::group([
            'prefix' => 'permissions'
        ], function($router) {

            Route::resources([
                'users' => 'UserPermissionController'
            ]);
        });

    });

});

И это мой метод контроллера, который я пытаюсь использовать:

public function update(Request $request, User $user)
{
    dd($user);
}

EDIT: Мое промежуточное ПО CheckPermission:

namespace App\Http\Middleware;

use Closure;

use Illuminate\Support\Facades\Auth;

use Illuminate\Routing\Router;

use App\MethodModuleUser;

class CheckPermission
{

    protected $router;

    public function __construct(Router $router)
    {
        $this->router = $router;
    }

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {

        $method = $request->method();
        $path = $this->router->getRoutes()->match($request)->uri;
        $path = str_replace('api/', '', $path);

        $permissions = MethodModuleUser::with([
            'user',
            'module',
            'method'
        ])->whereHas('user', function($query) {
            $query->where('id', Auth::id());
        })->whereHas('module', function($query) use ($path) {
            $query->where('url', $path);
        })->whereHas('method', function($query) use ($method) {
            $query->where('name', strtoupper($method));
        })->count();

        if($permissions <= 0) {
            return response()->json([
                'message' => 'No tiene los privilegios para realizar esta acción'
            ], 403);
        }

        return $next($request);
    }
}

Когда я использую свое собственное промежуточное ПО, привязка модели не работает, а $user - это просто пустая модель, но когда я комментирую строку 'middleware' => CheckPermission::class, привязка модели работает хорошо.

Что я делаю не так?

Ответы [ 2 ]

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

Хорошо, я не знаю, хорошая ли это практика, но я исправил ее. Я опубликую свое решение, если у кого-то тоже есть эта проблема:

В промежуточном программном обеспечении CheckPermission я заменил return $next($request), вызвав промежуточное программное обеспечение SubstituteBindings следующим образом:

return app(\Illuminate\Routing\Middleware\SubstituteBindings::class)
    ->handle($request, function($request) use ($next) {
        return $next($request);
    });

EDIT:

Другим способом решения проблемы было использование $request->route()->uri в промежуточном программном обеспечении CheckPermission, а не поиск его с помощью Router, как сказал Росс Уилсон в комментарии. Теперь __construct(Router $router) и вызов промежуточного программного обеспечения SubstituteBindings больше не требуются.

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

Я считаю, что это происходит, потому что вам нужно использовать псевдоним, который вы создаете для своего промежуточного программного обеспечения в app\Http\Kernel.php.

 protected $routeMiddleware = [
        ...
        'checkPermissions' => CheckPermissions::class,

(не забудьте использовать инструкцию импорта, если необходимо)

Тогда в ваших маршрутах используйте;

'middleware' => 'checkPermissions'
...