我的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请求,因为我需要在show
,update
和destroy
方法中进行相同的检查。但是我不能使用laravel请求,因为检查是这样的
$siteId = Route::current()->param('site');
$ids = Auth::user()->sites()->pluck('id')->toArray();
$result = in_array($siteId, $ids);
有人可以建议如何实现我的目标吗?
答案 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'));
}
}