是否有可能在laravel 5.2x中创建一个中间件,只为特定的user_id返回控制器中的数据,而不是在任何地方输入类似
的内容->where('access_gallery','=',true)
例如,我的网页上有一个图库,用户可以上传照片裁剪等等。
我通过中间件检查他们的payment_datetime<当前数据时间,如果下一步是真的。
在下一步中我想返回/编辑/删除/裁剪/ ...,只有特定用户的照片,通常我必须使用@up代码创建查询,因为我们不希望user_1到编辑user_2页面。
将它复制到任何地方都有点烦人,如果我创建一个Admin帐户来访问所有内容,我必须为每个函数创建下一个查询以返回所有数据。
如果无法在中间件中创建类似的功能,是否可以在控制器中使用?
答案 0 :(得分:2)
我认为你所寻找的是范围 - 甚至是全球范围。 https://laravel.com/docs/5.2/eloquent#global-scopes
在Scopes
下创建一个App
目录。像这样创建一个文件:
<?php
namespace App\Scopes;
use Illuminate\Database\Eloquent\Scope;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
class UserGallery implements Scope
{
/**
* Query if user has gallery
*
* @return void
*/
public function apply(Builder $builder, Model $model)
{
return $builder->where('access_gallery','=',true);
}
}
然后在您的模型中(您也希望应用此范围),将boot
函数添加到模型类的开头:
use App\Scopes\UserGallery;
/**
* The "booting" method of the model.
*
* @return void
*/
protected static function boot()
{
parent::boot();
static::addGlobalScope(new UserGallery);
}
您甚至可以将范围放在trait
级别......在我看来,看起来更清晰,更容易注入您的模型。
PS:限制放在中间件类中的逻辑数量。将中间件视为进入主要逻辑集的一扇门。该门打开或锁定以供用户访问。