我使用的是Laravel 5.1,并且已经建立了一个Repository模式。我已经将我的repo的具体实现注入到我的控制器中。我意识到您应该注入接口,但这使我的API过于复杂,无法解决我的问题。我有一个客户端配置,它只包含一个字符串,比如",我已经在全局使用它来使用模型覆盖(如果存在的话)。
因此,例如,如果我有客户端"yahoo",并且他们在我的Overrides/yahoo/Models/User.php中有一个覆盖,那么它将使用这个User.php。它是基本用户模型的扩展还是一个全新的实现取决于我。
我正在尝试为我的存储库做同样的事情。我希望能够在Overrides/Yahoo/Reports/UserRepository.php中放置一个覆盖文件,在注入时,它将使用基本用户存储库或覆盖(如果存在)。
有什么我能做到的想法吗?我意识到您可以注入存储库接口并使用绑定,但我想在全局范围内这样做。如果你能告诉我如何抽象该功能,以便根据客户端配置自动绑定接口的正确实现,我会接受的。
您可以通过使用的配置来解析具体实现,但这需要使用接口。
配置示例(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')
);
}
在您的雅虎用户库中,您可以直接注入雅虎用户模型:
<?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…)时,您可以保持灵活。