用于在Laravel中授权Request方法的对象

时间:2017-08-07 13:23:16

标签: php laravel request

当我们创建新的FormRequest时,我们有方法

public function authorize()
{
    return 1;
}

我的问题是,我可以在这里找到一些形式,任何雄辩的模型对象吗?

public function authorize(Posts $post)

我意识到我可以通过以下方式读取请求数据: $this->content

但我可以发送整个对象吗?

让我们知道我们有post集合。

我有表格

如果我有类似

的话

<form method="post" action="{{ route('temat.post.like', $post) }}">

在此路线的控制器方法public function post_like(LikePost $request)

然后在名为class LikePost extends FormRequest的授权方法中,$post就像public function authorize(Posts $post)

一样

我不知道是否有可能以某种方式在授权方法中得到它,我寻找这个并且我认为这不可能但我可能错了,这就是我问的原因

我的意思是在此authorize()方法中使用此参数获取的Eloquent模型,就像控制器一样。

e.g。

public function authorize(Users $user)

url:/like/15

通过id 15

获取用户模型

在方法中我们可以使用它。

public function authorize(Users $user)
    {
        return $user->status;
    }

其中$ user是User Eloquent Model

1 个答案:

答案 0 :(得分:1)

不确定你想要达到什么目标。 请求类不应该解析模型,因为它不是他们的职责。

  • 创建控制器以使用请求并管理所有实体和业务逻辑执行(实体,存储库访问,使用管理器类创建资源)
  • 请求类应仅管理与特定服务请求(检查,验证,格式化,访问)相关的所有方面

如果您需要,我建议创建一个带有getter的FormRequest单例,它将识别您的模型绑定。

您必须注册模型绑定才能解析方法上的特定模型 - 请求参数必须与具体类相关

FormRequest::bind('user_id', function ($value) {
    return User::where('id', $value)->firstOrFail();
});

现在您有两个选择:

  • a)如果你需要在方法的params =&gt;中加载实体你必须创建类似解析器访问方法的东西。你可以尝试在__call()方法中这样做。自从
  在对象上下文中调用不可访问的方法时会触发

__ call()。

你必须包装像这样的绑定

class FormRequest {
   public funciton authorize(User $user);
}

class FormRequestCaller { 
    private $formRequest;

    public function __call($name, $arguments) {
        $entity = FormRequest::resolve($name, $arguments);
        return $this->$name($entity);
    } 

    public static function resolve($bindingName, $data) {
        return call_user_func_array($bindings[$bindingName], $data);
    }
}
  • b)另一种方法是创建accesso

-

class FormRequest {

   public funciton authorize() {
       $user = $this->getUser(); 
   }

   public function __call($name, $arguments) {
     return FormRequest::resolve(ucfirst(str_replace('get','',$name), $arguments));
   }

   public static function resolve($bindingName, $data) {
        return call_user_func_array($bindings[$bindingName], $data);
   }
}

当然,这应该进行调整,但你应该明白这一点。