Как вызвать два класса с циклом и с разными параметрами в конструкции symfony

У меня есть цикл для просмотра 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;
    }
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
24
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас есть базовая проблема с внедрением зависимостей в 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)

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

Другие вопросы по теме