Laravel - 定义存储库覆盖

Laravel - Defining repository overrides

我正在使用 Laravel 5.1 并设置了存储库模式。我将回购协议的具体实现注入到我的控制器中。我意识到您应该注入接口,但这使我的 API 变得过于复杂并且无法解决我的问题。我有一个客户端配置,它只包含一个字符串,例如 '' 并且我已经在全局使用它来使用模型覆盖(如果它们存在)。

因此,例如,如果我有客户 'yahoo' 并且他们在我的 Overrides/Yahoo/Models/User.php 中有覆盖,那么它将使用此 User.php。它是基本用户模型的扩展还是全新的实现取决于我。

我正在尝试为我的存储库做同样的事情。我希望能够在 Overrides/Yahoo/Repos/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')
    );
}

在您的 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...)时您可以保持灵活性