Как вызвать два класса с циклом и с разными параметрами в конструктив Symfony - PullRequest
0 голосов
/ 18 июня 2019

У меня есть цикл для просмотра 2 класса, но проблема в том, что у него нет той же подписи один принимает входные данные конструктора 2, а другой - один вход как я могу исправить, зная, что я вынужден сделать цикл для

Я действительно не нахожу решение

это моя функция, куда я ставлю петлю для

  */
    public function run()
    {
        if (is_null($this->input) || empty($this->input)) {
            throw new EmptyDataException("No data or empty data");
        }

        foreach ($this->extensions as $extension) {
            $extensionProcess = "App\\Analyser\\Extension\\" . $extension->getCategory() . "\\" . $extension->getName();
            $instance = new $extensionProcess($this->ruleManager, $this->analyseRuleManager);
            $instance->setAnalyse($this->analyse);
            $instance->input($this->input);
            $instance->run();
        }
    }

это класс 1

/**
     * Constructor.
     *
     * @param RuleManager $ruleManager
     * @param AnalyseRuleManager $analyseRuleManager
     */
    public function __construct(RuleManager $ruleManager,
                                AnalyseRuleManager $analyseRuleManager)
    {
        $this->ruleManager = $ruleManager;
        $this->analyseRuleManager = $analyseRuleManager;
    }

это контракт 2

/**
     * Constructor.
     *
     * @param AnalyseManager $analyseManager
     */
    public function __construct(AnalyseManager $analyseManager)
    {
        $this->analyseManager = $analyseManager;
    }

1 Ответ

0 голосов
/ 18 июня 2019

У вас есть базовая проблема с внедрением зависимостей Symfony, я рекомендую вам шаг за шагом прочитать документацию о сервисном контейнере , это базовая возможность Symfony (и других фреймворков) и очень важно.

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

<?php

declare(strict_types=1);


namespace App\Analyser\Extension;

class AnalyserExtensionFactory
{
    public function __construct(Class1 $class1, Class2 $class2)
    {
        $this->class1 = $class1;
        $this->class2 = $class2;
    }

    public function getByExtension(Extension $extension) : ?ClassInterface
    {
        switch ($extension->getName()) {
            case 'class1':
                return $this->class1;
            case 'class2':
                return $this->class2;
        }
        return null;
    }
}

И после использования этот завод в вашей функции run().

ClassInterface должен быть реализован в ваших Class1 и Class2 (и иметь методы setAnalyse, input и run)

Расширенный совет: эту фабрику можно сделать чище с помощью служебной метки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...