2013-03-29 2 views
0

Я прошел DBAL соединения от контроллера к классу, который выполняет большое количество запросов и расчетов, как вВвести услугу с несколькими параметрами конструкции?

$conn = $this->get('database_connection'); 
$stats = new Statistics($conn, $criteria); 

Является ли это собственно? Создание службы для соединения, похоже, не помогает, так как мне нужно вызвать класс с двумя параметрами. Есть ли лучший или более правильный способ достичь той же цели? Этот метод, по крайней мере, работает.

ответ

0

У вас есть контроль над классом Statistices?

Если это так, то удалите критерии из конструктора и либо реализуйте метод setCriteria, либо передайте критерии как часть ваших getResults или любого другого метода.

Что @Venu показывает, что вам было сложно передавать данные с использованием параметров. Если ваш массив критериев можно настроить заранее, вы можете его использовать. Но я предполагаю, что критерии строятся во время запроса.

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

+0

Вы правы: '$ критерии 'определяются запросом. Поэтому я буду придерживаться того, что у меня есть. Это упражнение показывает мне, однако, что у меня все еще есть способы, чтобы полностью понять инъекцию зависимости. – geoB

2

Лучший способ - создать сервис и загрузить через контейнер обслуживания.

Services.yml

Acme.demo.statics: 
     class:  Acme\DemoBundle\Handler\Statistics 
     arguments: [@database_connection, { param1: %param1%, param2: %param1%}] 

Statistics.php

use Doctrine\DBAL\Connection; 

class Statistics 
{ 
    protected $connection; 
    protected $parameters; 

    public function __construct(Connection $connection, array $parameters) 
    { 
     $this->connection = $connection; 
     $this->parameters = $parameters; 
    } 
+0

Спасибо. Как перевести '{param1:% param1%, param2:% param1%}' для использования в моем приложении? Два именованных параметра, каждый с одинаковым значением? Мне нужно передать '$ критерии' в класс статистики. – geoB

+0

Ну, вы имеете в виду динамические параметры? если это так, у вас может быть метод setter? -> setCriteria ($ критериев); Но таким образом он не позволяет делать инициализации в конструкторе. FYI: http://symfony.com/doc/2.1/components/dependency_injection/types.html#setter-injection – Venu

Смежные вопросы