laravel repository 求解?

假设:通过配置文件可以切换数据存储驱动,比如数据存放在 mysql,然后修改配置文件变为 redis。
目前我的伪代码如下:

1:建立一个接口

<?php

namespace App\Repositories\Interfaces;

Interface CategoryInterface
{
    public function getAll();

    public function setData();
}

2:建立两个 Repository,分别对应mysql,redis数据库操作。

<?php

namespace App\Repositories\Implement;

use App\Repositories\Interfaces\CategoryInterface;

class CategoryMysqlRepository implements CategoryInterface
{
    public function getAll()
    {
        // TODO: Implement getAll() method.
    }

    public function setData()
    {
        // TODO: Implement setData() method.
    }

}
<?php

namespace App\Repositories\Implement;

use App\Repositories\Interfaces\CategoryInterface;

class CategoryRedisRepository implements CategoryInterface
{
    public function getAll()
    {
        // TODO: Implement getAll() method.
    }

    public function setData()
    {
        // TODO: Implement setData() method.
    }

}

3:进行绑定

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind('App\Repositories\Interfaces\CategoryInterface',
            'App\Repositories\Implement\CategoryMysqlRepository');
    }
}

如何更改绑定方式,达到上述目的。谢谢。

阅读 2.1k
1 个回答

通过读取数据库驱动来动态绑定,比如

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        // 假设key 为 database.driver, 值可能是 redis/mysql
        $dbDriver = ucfirst(config('database.driver')); 

        $this->app->bind('App\Repositories\Interfaces\CategoryInterface',
            "App\Repositories\Implement\Category{$dbDriver}Repository");
    }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题