gpt4 book ai didi

laravel - 如何在 Laravel 中创建一个 Controller 构造函数,它接受同一接口(interface)的两个具体实现?

转载 作者:行者123 更新时间:2023-12-04 02:58:39 29 4
gpt4 key购买 nike

背景

注意:本文使用的是Laravel 5.3,请勿妄加评判。

我们正在尝试对我们的 Laravel Controller 使用依赖注入(inject),并将尽可能多的业务逻辑推送到在 Controller 实例化时注入(inject)到 Controller 的存储库中。

我们已经有了这个功能示例:

class AcmeController extends Controller
{
protected $repository;

public function __construct(AcmeInterface $repository)
{
$this->repository = $repository;
}
}

在 app/Providers/RepositoryServiceProvider.php 中我们进行绑定(bind):

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

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

/**
* Register the application services.
*
* @return void
*/
public function register()
{
$this->app->bind(\App\Repositories\Contracts\AcmeInterface::class, \App\Repositories\OpCity\AcmeRepo::class);
}
}

然后 AcmeRepo 自然地实现了 AcmeInterface:

class AcmeRepo implements AcmeInterface

问题

现在我们遇到这样一种情况,相同 模型的一些数据持久保存在内存类型存储 (redis) 中,其余数据持久保存在关系数据库存储 (psql) 中。我们希望有两个单独的存储库,其中每个存储库都特定于其存储类型,即 RedisAcmeRepo 和 SqlAcmeRepo

如何在 AcmeController 构造函数中执行此操作?

public function __construct(AcmeInterface $sqlRepo, AcmeInterface $redisRepo)
{
$this->sqlRepo = $sqlRepo;
$this->redisRepo = $redisRepo;
}

最佳答案

例如你可以这样做:

$this->app->bind(AcmeController::class, function ($app) {
return new AcmeController($app->make(sqlRepo::class), $app->make(redisRepo::class));
});

或者这个:

$this->app->when(AcmeController::class)
->needs('$sqlRepo')
->give($app->make(sqlRepo::class));

$this->app->when(AcmeController::class)
->needs('$redisRepo')
->give($app->make(redisRepo::class));

关于laravel - 如何在 Laravel 中创建一个 Controller 构造函数,它接受同一接口(interface)的两个具体实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51426025/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com