将接口绑定到 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 并在 运行 时解决它。