我目前有两个模型:A
→hasOne
→B
B
代表一个基类,A
是它的一个扩展类,所以有时我想通过A
访问B
的属性/方法,就好像它是自己的一样。
一个经典的BaseMonster
-SpecificMonster
视频游戏用例:我的BaseMonster
模型有一些属性,如颜色等和一些方法,如行走等,我想从我的SpecificMonster
模型访问这些属性和方法。
我该怎么做呢?
我研究了DelegatesToResource
trait以获得一些提示/线索,但我认为它太有边界/与API调用和东西相关。
我正在研究如何在不破坏任何雄辩的现有逻辑的情况下,将__get
魔法方法与我的A
模型相关联,但没有运气。
好的,这就是我的结果:
- 对于属性,它是对属性是否存在的基本检查。
它依赖于扩展模型没有与基本模型共有的属性,所以我只是检查null
值,因为如果属性不存在,也不存在于基本模型原始行为将返回null
。 - 对于方法,我必须在调用基本模型之前捕获
BadMethodCallException
,以确保所调用的方法不存在于当前模型实例中,也不存在于Eloquent魔术方法中。
public function __get($key)
{
$x = $this->getAttribute($key);
if (null === $x) {
return $this->baseModel->getAttribute($key);
}
return $x;
}
public function __call($method, $parameters)
{
try {
if (in_array($method, ['increment', 'decrement'])) {
return $this->$method(...$parameters);
}
if ($resolver = (static::$relationResolvers[get_class($this)][$method] ?? null)) {
return $resolver($this);
}
return $this->forwardCallTo($this->newQuery(), $method, $parameters);
} catch (BadMethodCallException $e) {
return $this->forwardCallTo($this->baseModel, $method, $parameters);
}
}
我注意到这个解决方案与我的个人用例有关,因此可能可以改进为更通用并成为可重用的特性。