Php 在Laravel中扩展多个类
由于Php本机不允许扩展多个类,我一直在使用laravel模型与数据交互,并希望使用两个不同的包来扩展它的功能 我试图使用一个验证器来维护更新历史,但我不确定如何在我的模型中扩展这两个类Php 在Laravel中扩展多个类,php,laravel,extends,revisionable,Php,Laravel,Extends,Revisionable,由于Php本机不允许扩展多个类,我一直在使用laravel模型与数据交互,并希望使用两个不同的包来扩展它的功能 我试图使用一个验证器来维护更新历史,但我不确定如何在我的模型中扩展这两个类 任何帮助都将不胜感激 正如您所说,PHP不支持多重继承,因此您没有很多选择。尽管它很丑陋,但您可能不得不求助于类似的方法,它使用了\uu call()魔术方法。正如您所知,PHP不支持多重继承,不幸的是,这是一个PHP缺陷,是热心且可修改的包开发人员造成的问题。以Sentry为例,您可以使用您想要的Eloque
任何帮助都将不胜感激 正如您所说,PHP不支持多重继承,因此您没有很多选择。尽管它很丑陋,但您可能不得不求助于类似的方法,它使用了
\uu call()
魔术方法。正如您所知,PHP不支持多重继承,不幸的是,这是一个PHP缺陷,是热心且可修改的包开发人员造成的问题。以Sentry为例,您可以使用您想要的Eloquent的任何实现,您只需在config.php中设置所需的实现。不幸的是,Laravel被束缚住了手脚,因为它是所有这些包的基类。在我看来
所以你有一些选择:
1) 在两个包git repositories上都提交一个问题,并希望其中一个包的更改不仅支持从\elount继承,而且支持从用户的任何类继承,从而扩展elount模型抽象类
您甚至可以更改其中一个包的代码,并向存储库发送请求。如果这是一个好的变化,你可能会看到它发生
2) 使用repository模式,通过创建一个从Eloquent扩展而来的类,将两个包都作为依赖项,并在其中调用这些包中所需的任何内容。这不是小菜一碟,因为Eloquent是一个复杂的类,如果使用\uu call()
,则必须将所有需要转发的方法映射到包中,这样就不会有破坏Eloquent自身动态调用的风险:
use Ardent;
use Revisionable;
class User extends Eloquent {
private $ardent;
privave $revisionable;
public function __construct(Ardent $ardent, Revisionable $revisionable)
{
$this->ardent = $ardent;
$this->revisionable = $revisionable;
}
public function doWhatever()
{
return $this->ardent->do();
}
public function __call($name, $arguments)
{
if($this->isArdentMethod($name))
{
return call_user_func_array(array($this->ardent,$name), $arguments);
}
else
if($this->isRevisionableMethod($name))
{
return call_user_func_array(array($this->revisionable,$name), $arguments);
}
else
{
return parent::__call($name, $arguments);
}
}
}
请注意,此调用
return parent::__call($name, $arguments);
确保所有调用都将重定向到雄辩类,如果它们不是由其他调用之一执行的
事实上,你甚至可以选择其中的一种,比如Ardent作为你的主要课程:
class User extends Ardent {}
并将其作为依赖项进行修改:
public function __construct(Revisionable $revisionable)
然后将可修改的调用转发给注入的依赖项。因为,最终,这些类都是有说服力的,并且可以有许多有说服力的模型指向相同的表
如果你看一下可修改的源代码,你会发现你真正需要考虑的唯一调用是save()
,因为它会覆盖它,而其他所有调用都可以调用Ardent
我知道这听起来有点太多了,但它是可行的。最近我一直在做大量工作,使可修改成为一种特性 因此,您将能够
使用它,如下所示:
class User extends Ardent {
use \Venturecraft\Revisionable\RevisionableTrait;
}
它目前在dev分支中,但在将其合并到master之前,我希望得到一些测试帮助:
[编辑]这现在在主分支中,可供公众使用。这将使Laravely变得一团糟这就是问题所在,因为laravel在幕后做了很多事情,这将在我开始使用Relationship的那一刻变成真正的一团糟,而不是如果你映射ardent和/或可修改的方法。这些类是由雄辩的方法组成的,从一个或另一个方法调用一个方法不会有任何区别,当然,除非它不是雄辩的方法。在Revisionable中提出了一个问题:这很好,但我认为laravel应该从内部解决这个问题这是PHP的缺陷,是由热心且可修改的包开发人员造成的问题。以Sentry为例,您可以使用您想要的Eloquent的任何实现,您只需在config.php中设置所需的实现。不幸的是,Laravel被束缚住了手脚,因为它是所有这些包的基类。在我看来。当然,我会检查它,并开始玩它,因为我有一个实时的想法在我的脑海中,我可以测试它的所有场景,并将报告在任何情况下的问题神奇的是,有相当多的线程在github的问题上,所以请随时跳进来参与。希望这个新的实现也能“解决”这个问题。有人使用带有venturecraft/revisionable的way/database包吗?尽管way/database像laravelbook/ardent一样进行了雄辩的扩展,但两者似乎并没有融合