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