雄辩的模型委托给相关模型



我目前有两个模型:AhasOneB

B代表一个基类,A是它的一个扩展类,所以有时我想通过A访问B的属性/方法,就好像它是自己的一样。

一个经典的BaseMonster-SpecificMonster视频游戏用例:我的BaseMonster模型有一些属性,如颜色等和一些方法,如行走等,我想从我的SpecificMonster模型访问这些属性和方法。

我该怎么做呢?

我研究了DelegatesToResourcetrait以获得一些提示/线索,但我认为它太有边界/与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);
}
}

我注意到这个解决方案与我的个人用例有关,因此可能可以改进为更通用并成为可重用的特性。

最新更新