我应该如何静态访问此方法?

时间:2018-09-17 19:34:20

标签: php laravel eloquent

我有一个雄辩的模型Person,它具有以下功能

public function findRecordByIdm($idm)
{
   $record =  Person::find($idm);
   return $record;
}

在一个完全独立的控制器ProspectController中,我想调用该函数以获取$ idm返回的Person记录。如果我在没有声明它为静态方法的情况下执行此操作,则会得到

non static method should not be called statically

我知道由于测试困难,我不应该简单地将方法声明为静态方法。相反,我应该如何使该功能可从ProspectController访问?

2 个答案:

答案 0 :(得分:1)

Find不是Model上的方法,它实际上是Builder类上的实例方法。由于Model::__callStatic的定义,Model::find(或任何其他不存在的方法)被传递给Builder类的新实例。这是您可以同时进行静态和非静态调用查找的唯一原因,因为Model::find实际上并不存在。

您可以使用模型的实例,如u_mulder所建议的那样,但是在这种情况下,我认为静态方法很好。这遵循与工厂模式类似的设计,在工厂模式中,此静态方法的全部目的是准备并返回模型的实例。

答案 1 :(得分:-1)

这个问题肯定会引起不同的意见,因为我们都偏爱一种模式而不是另一种模式,但采用Laravel方式,您应该在控制器而不是模型中进行这种操作。
在ProspectController.php

public function findRecordByIdm($idm)
{
   $record =  Person::find($idm);
   return $record;
}

如果您打算在其他地方重用该功能,则应考虑使用服务和存储库...