Как внедрить вызов метода stati c в сервис symfony? - PullRequest
0 голосов
/ 25 апреля 2020

Я хочу превратить это в сервис:

        $grpcClient = new MyGrpcClient($_ENV['GRPC_HOST'], [
            'credentials' => \Grpc\ChannelCredentials::createInsecure(),
        ]);

Я пробовал это:

    MyNamespace\MyGrpcClient:
        public: true
        arguments:
            $hostname: '127.0.0.1:44001'
            $opts: ['@Grpc\ChannelCredentials::createInsecure()']

Но это не работает.

    The service "MyNamespace\MyGrpcClient" has a dependency on a non-existent service "Grpc\ChannelCredentials::createInsecure()".

Ответы [ 2 ]

1 голос
/ 25 апреля 2020

Я предлагаю использовать адаптер .


namespace Foo\Bar;

class MyGrpcClientAdapter
{
    private $grpcClient;

    public function __construct()
    {
        $this->grpcClient = new MyGrpcClient($_ENV['GRPC_HOST'], [
            'credentials' => \Grpc\ChannelCredentials::createInsecure(),
        ]);
    }

    public function doSomethingAdaptive(): void
    {
        //...
    }
}

, который можно настроить для отложенной загрузки в контейнер Symfony с помощью:

Foo\Bar\MyGrpcClientAdapter:
    class: 'Foo\Bar\MyGrpcClientAdapter'

You можно реорганизовать адаптер для использования настраиваемых (хост) значений следующим образом:

public function __construct(string $host)
{
    $this->grpcClient = new MyGrpcClient($host], [
        'credentials' => \Grpc\ChannelCredentials::createInsecure(),
    ]);
}

Передача (например) значения .env.

Foo\Bar\MyGrpcClientAdapter:
    class: 'Foo\Bar\MyGrpcClientAdapter'
    arguments:
        - '%env(APP_HOSTNAME)%'
0 голосов
/ 25 апреля 2020

Благодаря идеям @Jeroen van der Laan и @Cerad мне удалось найти решение:

<?php

namespace App\Proto;

use MyNamespace\MyGrpcClient;
use Grpc\ChannelCredentials;

class GrpcClientFactory
{
    public static function create()
    {
        return new MyGrpcClient($_ENV['GRPC_HOST'], [
            'credentials' => ChannelCredentials::createInsecure(),
        ]);
    }
}
// services.yml
    MyNamespace\MyGrpcClient:
        public: true
        factory: ['App\Proto\GrpcClientFactory', 'create']
...