【问题标题】:How do I inject a static method call into a symfony service?如何将静态方法调用注入 symfony 服务?
【发布时间】:2020-04-24 22:45:47
【问题描述】:

我想把它变成一个服务:

        $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()".

【问题讨论】:

  • 在服务容器文档中查找工厂。
  • @Cerad 好的。这是有道理的,只是它必须是一个关联数组。据我所知,没有办法在 symfony 服务中做关联数组?还是我错了?

标签: php symfony protocol-buffers grpc


【解决方案1】:

我建议使用adapter


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'

您可以重构适配器以使用可配置的(主机)值,如下所示:

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)%'

【讨论】:

  • 我从这条路开始,但我不想要生成的类的包装器。我只是希望它以某种方式实例化。但感谢您的启发,我想出了一个适合我需要的解决方案。
【解决方案2】:

感谢@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']

【讨论】:

    猜你喜欢
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-04
    • 1970-01-01
    • 2013-02-15
    相关资源
    最近更新 更多