在laravel中将一个服务注入到另一个服务中

gijlo24d  于 2022-12-24  发布在  其他
关注(0)|答案(1)|浏览(161)

背景

你好,
我继承了一个laravel的代码库。有一些第三方API被用于各种各样的数据服务,我试图使软件更易于测试。其中一些API调用是通过客户端处理的,并使用服务共享。
为了继续测试,一些服务需要调用其他服务。我也尝试依赖注入它们。我在做这件事时遇到了问题。

设置

  • laravel/框架:"^8.0.0

问题

以下服务需要能够在函数中依赖注入另一个服务。

namespace App\Services\ExampleService;

use App\Services\ExampleDependantService;

class SyncProfile
{
    // ...
}

我已尝试在函数级别注入(这是首选):

public function sync(ExampleDependantService $exampleDependantService, /*...*/)
    {
        // ...
    }

我还尝试在类/构造函数级别进行设置:

protected ExampleDependantService $exampleDependantService;

    public function __construct(ExampleDependantService $exampleDependantService)
    {
        $this->exampleDependantService = $exampleDependantService;
    }

在测试时,这两种方法都无法解析ExampleDependantService,并给出如下错误:

  • ArgumentCountError : Too few arguments to function App\Services\ExampleService\SyncProfile::__construct(), 0 passed in [..]/SyncProfileTest.php on line 96 and exactly 1 expected ..

需要说明的是,ExampleDependantService注册在config/app.php

'providers' => [
    // ...
    App\Services\ExampleDependantService::class
    // ...

理想情况

  • 我应该能够在正常使用中调用$exampleService->sync()
  • 我应该能够在测试使用中调用$exampleService->sync($mockedExampleDependantService)

有人能帮忙吗?
先谢了

6gpjuf90

6gpjuf901#

我建议在AppServiceProviderregister()方法中传递参数。
您还需要在那里设置依赖项,如下所示:

$this->app->bind(SyncProfile::class, function (Application $app) {
        return new SyncProfile($app->make(ExampleDependantService::class));
    });

这样,依赖项就可以在服务的构造函数中使用。

相关问题