According to “binding-interfaces-to-implementations” it is possible to bind an interface with its implementation, as follows:
$this->app->bind(
'AppSharedContextUserable',
'AppModulesCoreUser'
);
So when I call the next line, I will get an User
object: ????????
$user = $this->app->make(Userable::class);
However… when I try to do the same process with an Eloquent relationship:
/**
* Returns the user who created this... whatever. (I wish it worked! ????)
*
* @return IlluminateDatabaseEloquentBuilder
*/
public function creatorUser()
{
return $this->belongsTo(Userable::class, 'created_by');
}
it, obviously, gives me the following error: ????
⛔⛔⛔ Cannot instantiate interface AppSharedContextUserable
The same error if I try to instance an interface as follow:
$anInterfaceCannotBeInstantiateFool = new Userable();
I think there should be a way to delegate to an abstraction (interface) instead of using a concrete class. In this way it would be much easier to modularize the application and make it more decoupled.
Has anyone done something similar in Laravel?
Advertisement
Answer
I believe you can achieve what you want with a static function call, placed somewhere in your app.
public static getClass () {
return get_class(resolve(Userable::class));
}
This will solve your problem, as you can now bind the class and resolve it at run time.