Symfony запустить сервис с зависимостями без объявления его в аргументах метода

bars80081

Новичок
Добрый день,

не могу осилить казалось бы простую вещь в Symfony 4.
Мне в метод класса прилетает переменная, из неё получаю имя класса, который следует запустить. Класс существует, наследует нужный интерфейс, создаётся через new.

PHP:
    public function indexAction($class) {
        if(
            !empty($class)
            && class_exists($class)
            && in_array(DirectPerformerInterface::class, class_implements($class))
        ) {
            /** @var DirectPerformerInterface $obj */
            $obj = new $class;//$this->get($class);
            $response = $obj->run();
        }
    }
Всё работает.
Проблема такова, что в конструкторе у запускаемого класса могут быть перечислены зависимости. Соответственно, при new их надо передавать явно (а классы ведь разные могут быть) или попытаться как-то запустить его через зависимости. В теории, раз уж я в контроллере, то должно было хватить:
PHP:
            /** @var DirectPerformerInterface $obj */
            $obj = $this->get($class);
однако, имею ошибку:
Service "имя класса" not found: even though it exists in the app's container, the container inside "***\Controller\DirectPerformerController" is a smaller service locator that only knows about the "doctrine", "form.factory", "http_kernel", "parameter_bag", "request_stack", "router", "security.authorization_checker", "security.csrf.token_manager", "security.token_storage", "serializer", "session", "templating" and "twig" services. Try using dependency injection instead.
то же самое, если $obj = $this->container->get($class);. То есть, либо мой класс таки надо заявить как-то более явно, либо сделать через какой другой контейнер.
Однако, документация всё водит за нос и не даёт нужного ответа (видимо, потому что не могу задать нужный вопрос).

Прошу помочь осилить шайтан-машину
 

bars80081

Новичок
а иным способом нельзя дотянуться? потому что теряется весь смысл мобильности.
быстро склепал класс, закинул через веб-интерфейс, запустил одной кнопкой, получил результат и успокоился.
а так придётся прописывать в сервисах, выгружать обязательно через гит, перезапускать композер, дабы всё встало. на коленке это уже не сделаешь. проще рисовать кнопку на каждый новый сервис и спокойно вставлять его в аргументы метода контроллера
 

Фанат

oncle terrible
Команда форума
если все это так сложно , то зачем вам Симфони?
Есть много других фреймворков заточеных под парадигму тяп-ляп - и в продакшен
 

bars80081

Новичок
не совсем понял построения вашей фразы. наверное, если всё сложно, то Симфони как раз к месту.
к сожалению, не я определяю на чём работать. заказчик говорит: "прыгать", мы спрашиваем: "как высоко?". но опять же не понял, почему Симфони должна быть обделена рядом решений. у вас претензии к этому фреймворку?
каюсь, не умею писать на 100% корректный код, который будет работать под любым соусом, принимать любые данные и выдерживать любые коррекции в окружающих сервисах. каюсь, что и мои сотрудники не обладают даром быть на 100% правильными, а также быстро реагировать на возникающие сбои в системе. также признаюсь в слабости, что большую часть времени не присутствую на работе, зачастую по причине сна, а иногда и по причине отъезда. и хотя из дому у меня есть возможность корректировать код также быстро, как и на рабочем месте, находясь в затяжных вояжах к оздоровительным водам зачастую стеснён в средствах.
до сих пор памятна ситуация, когда сидя в отеле на Дунае получил посредством мессенджера, присосавшегося к местному вайфаю, извещение о сбое. и понимая насколько долго я буду пытаться достать своих компаньонов и пытаться с ними прояснить ситуацию, исправил проблему сам, имея в распоряжении вайфай отеля, планшет для чтения книжек, блокнот на нём (совсем не ++) и развёрнутый веб- файловый менеджер на сайте, а также систему прямого исполнения кода из окружения системы. мне при этом не требовалось иметь ни среду разработки, ни установленных ключей, ни консоли, ни прочих веб-утилит на руках, ни даже паролей к БД на удалённом сайте.
извиняюсь ещё раз, но мне по прежнему хочется господствовать на кодом, и иметь репутацию человека, способного выручить в любом случае, а не быть его жалким рабом и иметь бледный вид перед собственниками, терпящими убытки. согласен, что вопроса бы не возникало, если бы мы были совершенны в написании кода, умели бы видеть изменения в проекте на десять лет вперёд, а сотрудники были беспорочными существами.
к сожалению, се ля ви

но я бы хотел вернуться к вопросу, нет ли возможности решить задачу? или беседа и должна закончится на нетоллерантном оффтопе, словно сие есть единственная радость для старожилов?

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

fixxxer

К.О.
Партнер клуба
И к чему эта многословная тирада?
Главная проблема собственников в том, что они нанимают таких балаболов, успешно скрывающих за разглагольствованиями свою некомпетентность, о которой, впрочем, в полном соответствии с эффектом Даннинга-Крюгера и не догадываются.
 

AmdY

Пью пиво
Команда форума
Странно что вы не связываете проблемы с временем, стеснённость в средствах и частые падения с тем, что работаете на коленке и пишете код на костылях. Добавить 2-3 строчки в конфиг DI явно не строит прерванного отпуска.
 

fixxxer

К.О.
Партнер клуба
Странно что вы не связываете проблемы с временем, стеснённость в средствах и частые падения с тем, что работаете на коленке и пишете код на костылях. Добавить 2-3 строчки в конфиг DI явно не строит прерванного отпуска.
Да у него там "через гит" и "композер". Наверное, на продакшене git pull делает и composer install (или даже update) запускает. И думает, что это нормально. Потому и придумал "решение" "попроще". )))

Ну и если уж костылять, фабрику-то с полноценным контейнером внутрях написать не проблема, конечно ;)
 

AmdY

Пью пиво
Команда форума
Да у него там "через гит" и "композер". Наверное, на продакшене git pull делает и composer install (или даже update) запускает. И думает, что это нормально. Потому и придумал "решение" "попроще". )))

Ну и если уж костылять, фабрику-то с полноценным контейнером внутрях написать не проблема, конечно ;)
Судя про загрузку через веб интерфейс и редактирование в блокноте на проде, ты слишком хорошо думаешь.
 

bars80081

Новичок
ну вот как с вами общаться? пять ваших последних сообщений - ни одного по существу.
тирада была попыткой объяснить реальную сложность мира в котором живёшь (что вообще-то должно быть очевидным), чтобы хоть кто-то начал думать над проблемой, а не над тем, как наругать позлее
 

Valick

Новичок
"Всего-то надо никогда не спорить с говорящим
И он почувствует себя учёным настоящим
Всецело возомнит себя оратором и гением
Пренебрегая этикетом и моим терпением"

"Искать вину в других - не лучший способ:
Скорбь получаешь к истине в довесок.
И тот, кто мне вручал дорожный посох,
Остерегал клевать на мелких бесов"
 

WMix

герр M:)ller
Партнер клуба
пять ваших последних сообщений - ни одного по существу.
а что услышать то хочешь? ну да, провайдеры, сервисы и прочая injectable дрянь имеет зависимости, в наше время используют di для создания instance. писать new внутри аппликации для подобных классов, не то чтоб не удобно, это просто стать зависимым от всех кишков инфраструктуры.
Service "имя класса" not found:
там не имя класса, а наименование сервиса, которое может совсем не совпадать с именем класса (если что) "supper.pupper.❤.provider.hooper" к примеру, то как ты его в конфиге определил

new пишут только для newable - обьекты данных
PHP:
$service->create( new Order(100500, [new Position(22,34), new Position(2223,5)]));
 
Последнее редактирование:

AmdY

Пью пиво
Команда форума
ну вот как с вами общаться? пять ваших последних сообщений - ни одного по существу.
тирада была попыткой объяснить реальную сложность мира в котором живёшь (что вообще-то должно быть очевидным), чтобы хоть кто-то начал думать над проблемой, а не над тем, как наругать позлее
Я тебе же в первом посте дал ответ со ссылкой. Но тебе лес валить надо прямо сейчас http://phpfaq.ru/humor/anecdotes#saw

п.с. У меня товарищи SEOшники, периодически дергали из-за шаред хостинов с их странными настройками. Годами их уговоривал перейти на нормальный хостинг, года два удалось посадить на докер. Теперь мало того, что гемор отпал, так ещё и оба имеют со своих облаков средненькую по стране зарплату.
 

bars80081

Новичок
а что услышать то хочешь?
эмм, всякий раз рассчитываю на конструктивную беседу. я задаю вопрос. если кто может по существу сказать - отлично. остальным вроде как имеет смысл пройти мимо, это же не бла-бла чат? а тут столько оффтопика развели.

ну да, провайдеры, сервисы и прочая injectable дрянь имеет зависимости, в наше время используют di для создания instance. писать new внутри аппликации для подобных классов, не то чтоб не удобно, это просто стать зависимым от всех кишков инфраструктуры.
ну, вот поэтому и хотелось сделать так, чтобы система подтягивала любой класс. а так пришлось захардкодить, получается.

там не имя класса, а наименование сервиса, которое может совсем не совпадать с именем класса (если что) "supper.pupper.❤.provider.hooper" к примеру, то как ты его в конфиге определил
да, знаю. просто не очень удачно заменил.

Я тебе же в первом посте дал ответ со ссылкой
по ссылке, я увидел, что в конечном счёте сервис надо прописывать в конфиге. что противоречит идее. на это я и ответил:
а иным способом нельзя дотянуться? потому что теряется весь смысл мобильности.
 

Фанат

oncle terrible
Команда форума
Я хочу голову засунуть в холодильник, потому что вокруг жарко, но жопу оставить снаружи, потому что учу бальные танцы.
Как мне реализовать задуманное?
Отвечать строго по существу, без оффтопика!
 

WMix

герр M:)ller
Партнер клуба
ну, вот поэтому и хотелось сделать так, чтобы система подтягивала любой класс. а так пришлось захардкодить, получается.
3 раза написано тут https://ru.wikipedia.org/wiki/Внедрение_зависимости
с классами просто, рекурсивно на reflection можно собрать что угодно, но тебе вроде DirectPerformerInterface нужен был, как это автоматически разрулить?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Процитирую @tonsky:

Когда тебе пять лет, ты воспринимаешь мир как данность, не ставишь ничего под сомнение и просто запоминаешь, как что работает. Тебя научили ходить в туалет самостоятельно, но в какой-то момент неизбежно случается страшное: заканчивается туалетная бумага. Ты паникуешь и бежишь к маме/папе, которые спокойно показывают тебе шкафчик в ванной, где лежат запасные рулоны. Ты запоминаешь этот факт, начинаешь пользоваться и живешь спокойно дальше.

В десять лет ты оказываешь в гостях, страшное случается снова, но знакомый рецепт уже не работает: либо бумаги нет в шкафчике, либо вообще нет того самого шкафчика на привычном месте. Твой кругозор невероятно расширяется, ты понимаешь, что у других людей мир бывает устроен и по-другому.

В пятнадцать лет ты уже живешь один, и когда заканчивается бумага, ты понимаешь, что знаешь каждый шкафчик в квартире и ни в одном из них бумага волшебным образом не материализуется. Ты идешь в магазин и покупаешь ее первый раз в жизни самостоятельно, что опять же, сильно расширяет твое понимание, как работает мир.

В двадцать пять ты уже взрослый, у тебя свои дети, работа, друзья, хобби, куча забот. Жена звонит, что закончилась бумага, ты хватаешь первую попавшуюся пачку в магазине, забегаешь домой на пять минут в перерыве между курсами французского и барквизом с друзьями, перехватываешь на кухне сосиску, суешь в первый попавшийся ящик купленные по дороге восемь рулонов бумаги и убегаешь дальше. В этот же день у сына случается ситуация, и мама показывает ему: смотри, как мир устроен, бумага всегда лежит вот тут.

Это пост про программирование, кто не понял.
 
  • Like
Реакции: WMix
Сверху