繁体   English   中英

在Laravel中授权Request方法的对象

[英]Object to authorize method of Request in Laravel

当我们创建新的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有此$postpublic function authorize(Posts $post)

我不知道是否有可能以某种方式在授权方法中获得它,我一直在寻找,但我认为这是不可能的,但我可能是错的,这就是为什么我问

我的意思是在这个authorize()方法中,通过该参数获取口才模型,就像Controllers一样。

例如

public function authorize(Users $user)

网址: /like/15

通过ID 15获取的用户模型

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

喜欢

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

其中$ user是用户口才模式

不确定要实现什么目标。 请求类不应解析模型,因为这不是他们的职责。

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

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

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

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

现在,您有两个选择:

  • a)如果需要在方法的参数中加载实体=>,则必须创建类似解析器访问方法的类。 您可以尝试使用__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)另一种方法是创建附件

-

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);
   }
}

当然,必须对此进行调整,但是您应该明白这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM