首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Laravel 5.6自定义中间件打破模型绑定

Laravel 5.6自定义中间件打破模型绑定
EN

Stack Overflow用户
提问于 2018-08-30 04:39:26
回答 2查看 536关注 0票数 0

这是我的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);
}

编辑: My 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行时,模型绑定工作得很好。

我哪里做错了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-30 06:03:29

好吧,我不知道这是不是一个好的做法,但我解决了它。如果任何人也有这个问题,我会发布我的解决方案:

CheckPermission中间件中,我通过调用return $next($request)中间件替换了SubstituteBindings,如下所示:

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

编辑:

另一种解决问题的方法是在CheckPermission中间件中使用$request->route()->uri,而不是像Ross Wilson在评论中所说的那样通过Router找到它。现在不再需要__construct(Router $router)和调用SubstituteBindings中间件。

票数 1
EN

Stack Overflow用户

发布于 2018-08-30 04:44:49

我相信这是因为您需要使用在app\Http\Kernel.php中为中间件创建的别名。

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

(如果需要,不要忘记使用import语句)

然后在你的路线中使用;

'middleware' => 'checkPermissions'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52085747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档