Laravel-定义存储库覆盖


Laravel - Defining repository overrides

我使用的是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…)时,您可以保持灵活。