Symfony 3.4: использование параметров приложения в службе с созданием экземпляра

#symfony #dependency-injection #symfony-3.4 #elastica

Вопрос:

Я не уверен, что то, чего я пытаюсь достичь, возможно или является хорошей практикой.

Я работаю над приложением Symfony 3.4, которое использует пакет Elastica для привязки своей базы данных SQL к Elasticsearch. Порт, хост, пароль для Elasticsearch хранятся в app/config/parameters.yml .

Я создал службу, которая выполняет ряд операций с Elastica, включая выполнение запроса GET к кластеру elasticsearch. Для того, чтобы это сделать, мне нужно host и port определено app/config/parameters.yml .

Я попытался привязать эти параметры, как указано в файле services.yml конфигурации:

 MyBundleMyToolboxQueryGenerator:
    arguments:
        $elasticHost: '%elastic_host%'
        $elasticPort: '%elastic_port%'
 

Для того, чтобы передать их в конструктор моего сервиса как такового:

 <?php

namespace MyBundleMyToolbox;

use Elastica as Elastica;

class QueryGenerator extends ElasticaQuery
{
    private ElasticaClient $client;
    private $host;
    private $port;

    public function __construct($elasticHost, $elasticPort)
    {
        parent::__construct();
        $this->client = new ElasticaClient();
        $this->host = $elasticHost;
        $this->port = $elasticPort;
    }
}
 

Когда я хочу использовать метод этой службы и попытаться создать его экземпляр, я получаю TypeError :

 $qg = new QueryGenerator();
$qg->someMethod();
 
 Type error: Too few arguments to function MyBundleMyToolboxQueryGenerator::__construct()
 

Мне определенно чего-то не хватает, но я не вижу чего…
Спасибо вам за вашу помощь!

Комментарии:

1. На самом деле это удивительно распространенное заблуждение, что новый оператор PHP каким-то образом знает о контейнере DI Symfony. Это не. Никакой связи между этими двумя понятиями нет. Вам нужно внедрить генератор запросов туда, где он необходим. Или, в худшем случае, впрысните контейнер и вытащите из него генератор. Прочитайте еще раз начало документации по сервису Symfony, пока не поймете основное использование контейнера DI.