Всем привет! Подскажите, как в симфони правильно использовать стратегию? У меня

есть три класса-стратегии, которые нужно вызывать в зависимости от условий. У каждого из этих классов в конструкторе инициализируются разные сервисы, которые нужны для работы конкретно этому классу.
Кроме этого у меня есть фабрика, которая в зависимости от условий возвращает одну из стратегий.
Вот тут проблема: чтобы из фабрики вернуть стратегию, мне нужно или прокинуть все стратегии в конструкторе фабрики, например так:
class Factory
{
private StrategyOne;
private StrategyTwo;
public function __construct(StrategyOne $strategyOne, private StrategyTwo)
{
$this->strategyOne = $strategyOne;
$this->strategyTwo = $strategyTwo;
}

public function create(string $condition)
{
if ($condition === 1) {
return $this->strategyOne;
} elseif ($condition === 2) {
return $this->strategyTwo;
}
}
}

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

3 ответов

7 просмотров

Если вопрос только в lazy loading сервисов то можно воспользоваться Service Locator от симфы, но скорее всего можно забить болт ибо вряд ли ты что-то выиграешь этим

Не уверен, но вроде если закинуть через теги (как итератор), то сервисы будут подрубаться через lazy

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

Похожие вопросы

Обсуждают сегодня

Ты просто гитлеровскую эстетику плохо понимаешь. Он же всё под Цезаря делал. А это как бы запрещённый приём в политике. Пиджаки они зачем все носят? Чтобы показать что они тип...
Ivan Kropotkin
4
'frakturBold' => ['𝖆', '𝖇', '𝖈', '𝖉', '𝖊', '𝖋', '𝖌', '𝖍', '𝖎', '𝖏', '𝖐', '𝖑', '𝖒', '𝖓', '𝖔', '𝖕', '𝖖', '𝖗', '𝖘', '𝖙', '𝖚', '𝖛', '𝖜', '𝖝', '𝖞', '𝖟', '𝕬', '𝕭', '𝕮', '𝕯'...
Roma
4
Добрый день, не подскажите, если в OC-V3 поменять страндартную директорию /storage/ на /storage2/ - не будет сильно много проблем ?
Max Dubovsky
32
Всем привет. Нужна платная консультация от тех, кто сталкивался с октябрём в кластере или шарит оч хорошо в цмс. Проблема следующая: после переноса в кластер октябрь начал ...
wl
8
Каким то образом можно определить ширину экрана пользователя перед загрузкой partial-а? Надо рассчитать ширину кадров слайдера для ресайза картинок для container-fluid.
Point 111
22
а я честно сказать не понимаю - нахуя идти учиться на вышку или еще куда-либо и при этом нихуя не делать, типа зачем ? просто корку получить, а нахуй она нужна тогда ?
Eugene Неелов
7
А сколько часов мак держит зарядку в рабочем режиме? Например мой Redmi Mac (просто наклейка от айфона осталась, налепил) по началу держал часов 5 с парой открытых штормов и ...
Ross
8
хотя нет, на нескольких акках есть звезды, а где их выводить то? я слепой?
Roma
1
Ребят, а вот такой вопрос: если я владелец бота анонимного чата, в котором, например, имеются подписки, используя какую-нибудь ЮКассу (или тому подобное, в общем с налогами, в...
Eugene Неелов
8
Ребят, было ли у вас так, что переменные в WebApp —tg-viewport-height, —tg-viewport-stable-height после метода expand не обновляются, а остаются в размерах, как было до expand...
Black
3
Карта сайта