Laravel - 定义存储库覆盖

时间:2015-11-20 16:26:41

标签: php laravel repository overrides

我正在使用Laravel 5.1并设置了一个Repository模式。我将我的repos的具体实现注入到我的控制器中。我意识到你支持注入接口,但这会使我的API变得复杂并且无法解决我的问题。我有一个客户端配置,只包含一个字符串,如''我已经使用全局使用模型覆盖,如果它们存在。

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

我正在为我的存储库做同样的事情。我希望能够在Overrides / Yahoo / Repos / UserRepository.php中放置一个覆盖文件,并且在注入时它将使用基本用户存储库或覆盖(如果存在)。

关于如何实现这一目标的任何想法?我意识到你可以注入一个存储库接口并使用绑定但我想在全局范围内执行此操作。如果您可以告诉我如何抽象该功能以基于客户端配置自动绑定正确的接口实现,我会接受。

1 个答案:

答案 0 :(得分:1)

您可以通过您使用的配置解决具体实现,但它要求您使用接口。

示例配置(GROUP BY primary_key_column):

config/client.php

在AppServiceProviders <?php return [ 'users' => [ 'repository' => \App\Overrides\Yahoo\Repos\UserRepository::class, ], ]; 方法中:

register

在Yahoo UserRepository中,您可以直接注入Yahoo User模型:

/**
 * Register any application services.
 *
 * @return void
 */
public function register()
{
    $this->app->bind(
        UserRepositoryInterface::class,
        config('client.users.repository')
    );
}

最后,在您的UserController中,您可以注入UserRepositoryInterface,它将根据您的配置绑定具体实现:

<?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

}

一开始看起来有点矫枉过正,但是一旦你设置了所有内容,添加新的替换就很容易了。

您甚至可以创建UserRepository的基本具体实现,并使每个覆盖存储库都从它继承。这样您就不必重新实现接口所需的所有方法,但是当用户存储库使用不同的数据库技术时,您保持灵活性(SQL,MondoDB ......)