Laravel验证站点属于用户

时间:2016-04-22 03:19:04

标签: laravel

我的User.php

class User extends Authenticatable
{
    public function sites()
    {
        return $this->hasMany(Site::class);
    }
}

我的Site.php

class Site extends Model
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

我的routes.php

Route::resource('site', 'SiteController');

我的SiteController.php

class SiteController extends Controller
{
    public function edit(int $id)
    {
        $site = Auth::user()->sites()->find($id);

        return view('site.edit', compact('site'));
    }
}

如何验证该网站属于用户?据我所知,如果网站不属于用户,$site变量将为空。但是我想要更多的声明式方式,比如laravel请求,因为我需要在showupdatedestroy方法中进行相同的检查。但是我不能使用laravel请求,因为检查是这样的

$siteId = Route::current()->param('site');
$ids = Auth::user()->sites()->pluck('id')->toArray();
$result = in_array($siteId, $ids);

有人可以建议如何实现我的目标吗?

1 个答案:

答案 0 :(得分:0)

由于我使用laravel 5.2,因此不推荐使用路由过滤器的解决方案。相反,路由过滤器我们应该使用中间件 应用程序/ HTTP /中间件/ RestrictPermission.php

class RestrictPermission
{
    public function handle($request, Closure $next)
    {
        $siteId = Route::current()->parameter('site');

        if (!Auth::user()->sites()->find($siteId)) {
            abort(403);
        }

        return $next($request);
    }
}

应用程序/ HTTP / Kernel.php

class Kernel extends HttpKernel
{
    protected $routeMiddleware = [
        'restrict.permission' => RestrictPermission::class,
    ];
}

SiteController.php

class SiteController extends Controller
{
    public function __construct()
    {
        $this->middleware('restrict.permission', ['except' => [
            'index', 'create', 'store',
        ]]);
    }

    public function edit(int $id)
    {
        $site = Auth::user()->sites()->find($id);
        return view('site.edit', compact('site'));
    }
}