我有一个雄辩的模型Person,它具有以下功能
public function findRecordByIdm($idm)
{
$record = Person::find($idm);
return $record;
}
在一个完全独立的控制器ProspectController中,我想调用该函数以获取$ idm返回的Person记录。如果我在没有声明它为静态方法的情况下执行此操作,则会得到
non static method should not be called statically
我知道由于测试困难,我不应该简单地将方法声明为静态方法。相反,我应该如何使该功能可从ProspectController访问?
答案 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;
}
如果您打算在其他地方重用该功能,则应考虑使用服务和存储库...