php Laravel调用方法(一旦加载模型)

ikfrs5lh  于 2023-01-24  发布在  PHP
关注(0)|答案(3)|浏览(158)

我试图签入一个模型的构造函数,如果当前已验证的用户被允许访问给定的模型,但是我发现来自构造函数上下文的$this是空的。在Laravel中,分配给模型的属性在哪里?当所有属性都被加载后,我应该如何调用一个方法?

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

}

提前干杯

t98cgbkg

t98cgbkg1#

正如在其他回答和评论中所述,有更好的方法来实现这个问题的目标(至少在现代Laravel中)。在这种情况下,我将参考文档的Authorization章节,该章节同时涉及门和策略。
然而,要回答如何在加载模型属性后调用方法的特定问题-您可以侦听Eloquent retrieved事件。在类中完成此操作的最简单方法是在类booted()方法中使用闭包。

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

您也可以使用监听器以常规方式监听这些事件。请参阅Eloquent事件的文档。

jbose2ul

jbose2ul2#

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

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

从构造函数将属性绑定到模型
Model.php

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

uinbv5nw3#

正如Rory所提到的,retrieved事件负责此操作。此外,它可以通过事件/侦听器方法以更干净和OOP的方式形成,特别是如果您需要编写大量代码或只有很少的处理程序。
如这里所述,您可以只为Model创建一个事件,如下所示

protected $dispatchesEvents = [
        'retrieved' => UserLoaded::class,
    ];

您需要创建这个类,雄辩事件默认接受模型:

class UserLoaded
{
    protected User $user;

    public function __construct(User $user)
    {
        $this->user = $user;
    }
}

下面介绍如何为该事件声明监听器,应该在EventListenerProvider中的某个位置,如下所示:

protected $listen = [
        UserLoaded::class => [
            UserLoadedListener::class
        ],
    ];

侦听器应该只实现方法handle()(检查文章),如下所示:

public function handle(UserLoaded $event)
    {
        // your code
    }

另一种可能性是注册模型Observer,如这里所述

相关问题