【问题标题】:Laravel - Defining repository overridesLaravel - 定义存储库覆盖
【发布时间】:2015-11-20 16:26:40
【问题描述】:

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

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

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

有什么想法可以做到这一点吗?我意识到您可以注入存储库接口并使用绑定,但我想全局执行此操作。如果您能告诉我如何抽象该功能以根据客户端配置自动绑定接口的正确实现,我会接受。

【问题讨论】:

    标签: php laravel repository overriding


    【解决方案1】:

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

    配置示例(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...)时,您可以保持灵活性

    【讨论】:

      猜你喜欢
      • 2011-08-17
      • 2011-09-12
      • 2011-09-15
      • 1970-01-01
      • 2017-02-05
      • 2018-02-26
      • 2018-07-21
      • 2011-10-06
      相关资源
      最近更新 更多