Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在Laravel中扩展多个类_Php_Laravel_Extends_Revisionable - Fatal编程技术网

Php 在Laravel中扩展多个类

Php 在Laravel中扩展多个类,php,laravel,extends,revisionable,Php,Laravel,Extends,Revisionable,由于Php本机不允许扩展多个类,我一直在使用laravel模型与数据交互,并希望使用两个不同的包来扩展它的功能 我试图使用一个验证器来维护更新历史,但我不确定如何在我的模型中扩展这两个类 任何帮助都将不胜感激 正如您所说,PHP不支持多重继承,因此您没有很多选择。尽管它很丑陋,但您可能不得不求助于类似的方法,它使用了\uu call()魔术方法。正如您所知,PHP不支持多重继承,不幸的是,这是一个PHP缺陷,是热心且可修改的包开发人员造成的问题。以Sentry为例,您可以使用您想要的Eloque

由于Php本机不允许扩展多个类,我一直在使用laravel模型与数据交互,并希望使用两个不同的包来扩展它的功能

我试图使用一个验证器来维护更新历史,但我不确定如何在我的模型中扩展这两个类


任何帮助都将不胜感激

正如您所说,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一样进行了雄辩的扩展,但两者似乎并没有融合