如何继承雄辩的';在普通PHP对象上的功能

如何继承雄辩的';在普通PHP对象上的功能,php,inheritance,laravel,eloquent,solid-principles,Php,Inheritance,Laravel,Eloquent,Solid Principles,如何让第三方软件包中的普通php对象继承Laravels雄辩模型的所有优点?见下文: 下面的模型类来自第三方软件包。它是框架和ORM不可知的,用普通PHP编写。我不能改变它,只能扩展它。(仅示例) 这是我对这个模型课的一个很有说服力的版本。我需要从这门课上扩展雄辩的内容。我还需要从上面的VanillaPHPModel进行扩展,这样它就可以继承Eloquent的方法。我看不出有什么办法可以解决这个问题 class MyEloquentModelVersion extends Eloquent .

如何让第三方软件包中的普通php对象继承Laravels雄辩模型的所有优点?见下文:


下面的模型类来自第三方软件包。它是框架和ORM不可知的,用普通PHP编写。我不能改变它,只能扩展它。(仅示例)

这是我对这个模型课的一个很有说服力的版本。我需要从这门课上扩展雄辩的内容。我还需要从上面的VanillaPHPModel进行扩展,这样它就可以继承Eloquent的方法。我看不出有什么办法可以解决这个问题

class MyEloquentModelVersion extends Eloquent ... extends APlainPHPModelFromLibrary { // ??

    $guarded = [
        'EloquentGoodness',
        'EloquentGoodness'
    ];

    public function belongsTo()
    {
        //...Eloquent goodness
    }

    public function hasMany()
    {
        //,..Eloquent Goodness
    }
}   

这只是一个建议。你或许可以用多种其他方法来解决这个问题

ThirdPartyServiceProvider.php

<?php
    class ThirdPartyServiceProvider extends \Illuminate\Support\ServiceProvider {
        public function register() {
            $this->app->bind('ThirdPartyService', function($app, $third_party_model) {
                return new ThirdPartyService($third_party_model, new MyEloquentModelVersion());
            });
        }
    }
<?php
    class ThirdPartyService {
       public $third_party_model         = null;
       public $my_eloquent_model_version = null;

       function __construct(APlainPHPModelFromLibrary $third_party_model, MyEloquentModelVersion $my_eloquent_model_version) {
          $this->third_party_model         = $third_party_model;
          $this->my_eloquent_model_version = $my_eloquent_model_version;
        }

        function translate() {
            // conversion code

            return $this;
        }
    }

感谢上帝PHP提供了多重继承。。。不,真的。您不能这样做,除非可以更改普通对象,使其扩展
Eloquent\Model
。否则,您只能使用
trait
将其特性c-p到另一个类中,以扩展雄辩,但我怀疑这对您是否有效。因此,真的没有办法解决这一问题。。。除了修改原始存储库之外,您可以做的是创建一个服务提供程序,该服务提供程序的构造函数中包含两个参数,一个是
APlainPHPModelFromLibrary
,另一个是
Eloquent
模型的新实例。然后在构造中,将
APlainPHPModelFromLibrary
对象的属性转换为雄辩的模型。这样的话,你就可以按照应该的方式利用拉威尔美丽的IoC概念。但是我会放弃
APlainPHPModelFromLibrary
拥有的所有方法,不是吗?你能给我举个例子吗?也许我遗漏了什么?是的,你会失去方法。也许你可以使用所有你需要的方法,然后进行翻译?我不确定您想如何执行此操作,我尊重您的选择,您不愿意告诉我们您正在使用的确切的第三方库。
<?php
    class ThirdPartyService {
       public $third_party_model         = null;
       public $my_eloquent_model_version = null;

       function __construct(APlainPHPModelFromLibrary $third_party_model, MyEloquentModelVersion $my_eloquent_model_version) {
          $this->third_party_model         = $third_party_model;
          $this->my_eloquent_model_version = $my_eloquent_model_version;
        }

        function translate() {
            // conversion code

            return $this;
        }
    }
$tpsp = App::make('ThirdPartyServiceProvider', $third_party_model);

$tpsp->translate()->my_eloquent_model_version;