#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.