我有一个接口,声明了实现需要的方法,如find,findOrFail等,基本上是Laravel雄辩的方法。
我在界面中声明了这些方法,因为并非所有实现接口的方法都会扩展,所以我在界面中声明它们,所以我的应用程序总是知道方法会在那里。
我想知道的是,除了在模型中有一堆public function find($id){return parent::find($id)}
类型方法做扩展雄辩模型之外,有一种简单的方法让界面知道该方法是通过__call
?
答案 0 :(得分:6)
虽然关于这种设计的清洁度可能存在更大的问题,但您可以通过使用实现界面方法的特征来完成类似于此的事情:
interface FindableContract {
public function find($id);
}
trait MagicFindableTrait {
public function find($id) {
return static::__call(__FUNCTION__, func_get_args());
}
}
class MagicalParent {
public function __call($method, $args) {
if ($method == 'find') {
return "User " . $args[0] . " is a witch! May we burn her?!";
}
}
}
class User extends MagicalParent implements FindableContract {
use FindableTrait;
}
class NonmagicalUser implements FindableContract {
public function find($id) {
return "User $id was found to be nonmagical. Let's burn him anyway.";
}
}
print (new User)->find(123);
print (new NonmagicalUser)->find(321);
答案 1 :(得分:3)
不,这不会奏效。虽然__call()
对于动态编码风格非常好,但它的缺点是您无法在界面中强制执行动态方法的签名,并且您将无法获得它的自动文档。
但我认为如果您想要为这些方法创建接口,则不再需要使用__call()
。我只是硬编码方法。