您可以通过您使用的配置来解决您的具体实现,但这需要您使用接口。
配置示例(config/client.php):
<?php
return [
'users' => [
'repository' => \App\Overrides\Yahoo\Repos\UserRepository::class,
],
];
在您的 AppServiceProviders register 方法中:
/**
* Register any application services.
*
* @return void
*/
public function register()
{
$this->app->bind(
UserRepositoryInterface::class,
config('client.users.repository')
);
}
在您的 Yahoo UserRepository 中,您可以直接注入 Yahoo User 模型:
<?php
namespace App\Overrides\Yahoo\Repos;
use App\Repos\UserRepositoryInterface;
use App\Overrides\Yahoo\Models\User;
class UserRepository implements UserRepositoryInterface
{
private $user;
public function __construct(User $user)
{
$this->user = $user;
}
// TODO: Implement UserRepositoryInterface methods
}
最后,在你的 UserController 中,你可以注入 UserRepositoryInterface,它会根据你的配置绑定具体的实现:
<?php
namespace App\Http\Controllers;
use App\Repos\UserRepositoryInterface;
class UserController extends Controller
{
private $users;
public function __construct(UserRepositoryInterface $users)
{
$this->users = $users;
}
}
一开始可能看起来有点矫枉过正,但是一旦你设置好所有东西,添加新的覆盖就很容易了。
您甚至可以创建 UserRepository 的基本具体实现,并使每个覆盖存储库都继承自它。这样您就不必重新实现接口所需的所有方法,但是当用户存储库使用不同的数据库技术(SQL、MondoDB...)时,您可以保持灵活性