【问题标题】:Laravel call method once model loaded模型加载后的 Laravel 调用方法
【发布时间】:2015-07-18 23:14:26
【问题描述】:

我正在尝试检查模型的构造函数是否允许当前经过身份验证的用户访问给定模型,但我发现构造函数上下文中的 $this 为空。在 Laravel 中分配给模型的属性在哪里?一旦加载了所有属性,我应该如何调用方法?

public function __construct(array $attributes = [])
{
    parent::__construct($attributes);
    var_dump($this); // empty model
    $this->checkAccessible();

}

提前干杯

【问题讨论】:

  • 你可以使用这个laravel.io/bin/7wJ6D。但问题是 - 为什么要在模型中这样做?
  • @JarekTkaczyk 谢谢,我最终做了类似的事情。我想在模型中这样做的原因是我可以只做 Model::find($id);在控制器和基础模型类中会担心当前经过身份验证的用户是否被允许访问资源。

标签: php laravel eloquent


【解决方案1】:

您可以使用控制器过滤器来检查用户是否登录,然后调用任何模型函数。

public function __construct(array $attributes = []){     
  $this->beforeFilter('auth', array('except' => 'login')); //login route

   if(Auth::user()){
        $user_id = Auth::user()->user_id;
        $model = new Model($attributes);
        //$model = User::find($user_id);
   }
 }

从构造函数绑定属性到模型

模型.php

public function __construct(array $attributes = array())
{
    $this->setRawAttributes($attributes, true);
    parent::__construct($attributes);
}

【讨论】:

  • 用户已通过身份验证。 checkAccessible 方法根据 Auth::user()->id 检查模型上的“created_by”属性。如果它们不相等,则会引发异常。
【解决方案2】:

正如其他答案和 cmets 中所述,有更好的方法来实现问题的目标(至少在现代 Laravel 中)。在这种情况下,我会参考文档中的 Authorization 章节,该章节通过了大门和政策。

但是,要回答加载模型属性后如何调用方法的具体问题 - 您可以监听 Eloquent retrieved 事件。在类中执行此操作的最简单方法是在类 booted() 方法中使用闭包。

protected static function booted()
{
    static::retrieved(function ($model) {
        $model->yourMethod() //called once all attributes are loaded
    });
}

您还可以使用侦听器以正常方式侦听这些事件。请参阅Eloquent events 的文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 2019-07-17
    • 1970-01-01
    • 2020-12-23
    • 2018-12-24
    • 1970-01-01
    • 2017-01-12
    相关资源
    最近更新 更多