将接口绑定到 Eloquent 关系中的实现
Binding Interfaces to Implementations in Eloquent relationships
根据“binding-interfaces-to-implementations”,可以将接口与其实现绑定,如下所示:
$this->app->bind(
'App\SharedContext\Userable',
'App\Modules\Core\User'
);
所以当我调用下一行时,我会得到一个 User
对象:
$user = $this->app->make(Userable::class);
但是... 当我尝试对 Eloquent 关系执行相同的过程时:
/**
* Returns the user who created this... whatever. (I wish it worked! )
*
* @return Illuminate\Database\Eloquent\Builder
*/
public function creatorUser()
{
return $this->belongsTo(Userable::class, 'created_by');
}
它,显然,给我以下错误:
⛔⛔⛔ Cannot instantiate interface App\SharedContext\Userable
如果我尝试如下实例化一个接口,同样的错误:
$anInterfaceCannotBeInstantiateFool = new Userable();
我认为应该有一种方法可以委托给抽象(接口)而不是使用具体的class。这样一来,应用程序的模块化和解耦就容易多了。
有人在 Laravel 做过类似的事情吗?
我相信你可以通过静态函数调用实现你想要的,放置在你的应用程序的某个地方。
public static getClass () {
return get_class(resolve(Userable::class));
}
这将解决您的问题,因为您现在可以绑定 class 并在 运行 时解决它。
根据“binding-interfaces-to-implementations”,可以将接口与其实现绑定,如下所示:
$this->app->bind(
'App\SharedContext\Userable',
'App\Modules\Core\User'
);
所以当我调用下一行时,我会得到一个 User
对象:
$user = $this->app->make(Userable::class);
但是... 当我尝试对 Eloquent 关系执行相同的过程时:
/**
* Returns the user who created this... whatever. (I wish it worked! )
*
* @return Illuminate\Database\Eloquent\Builder
*/
public function creatorUser()
{
return $this->belongsTo(Userable::class, 'created_by');
}
它,显然,给我以下错误:
⛔⛔⛔ Cannot instantiate interface App\SharedContext\Userable
如果我尝试如下实例化一个接口,同样的错误:
$anInterfaceCannotBeInstantiateFool = new Userable();
我认为应该有一种方法可以委托给抽象(接口)而不是使用具体的class。这样一来,应用程序的模块化和解耦就容易多了。
有人在 Laravel 做过类似的事情吗?
我相信你可以通过静态函数调用实现你想要的,放置在你的应用程序的某个地方。
public static getClass () {
return get_class(resolve(Userable::class));
}
这将解决您的问题,因为您现在可以绑定 class 并在 运行 时解决它。