Alexey Mishurovskiy
Konstantin
добавляете базовый язык (руками или экспорт из твиг-шаблонов), дальше пушите в краудин. ждете пока переведут, потом пулл
Руслан 🇲🇨
Здраствуйте!
Symfony 5.4.6. При попытке выполнить:
return $this->redirect('http://symfony.com/doc');
получаю ошибку:
Attempted to call an undefined method named "redirect" of class "App\Controller\DefaultController".
В версии 5.4.6 уже нет такой функции?
Konstantin
качественный вопрос от серьезного специалиста. у вас IDE нету, чтобы прокликать иерархию классов? вы в блокноте кодите, который не в состоянии подсветить вам метод?
Konstantin
метод на месте
Konstantin
https://github.com/symfony/symfony/blob/6.1/src/Symfony/Bundle/FrameworkBundle/Controller/AbstractController.php#L128
Руслан 🇲🇨
А почему тогда ошибка возникает?
Konstantin
я очень извиняюсь, но потому что руки из жопы, скорее всего
Kirill
А зачем использовать метод редирект, когда можно вернуть редирект респонз?
Konstantin
нууу, это короче писать?
Kirill
Зато наследование от ненужного абстракт контроллера)
Kirill
А так все чистенько и явно
Konstantin
там все равно есть часть полезной херни, типа generateUrl
Konstantin
forward, что там ещё
Kirill
Ну это урл генератор
Konstantin
флеши, рендер/рендерВью
Kirill
Подсосать через DI делов на 10 секунд
Kirill
Konstantin
ну мне не очень нравится писать сотню раз
Konstantin
protected function addFlash(string $type, mixed $message): void
{
try {
$this->container->get('request_stack')->getSession()->getFlashBag()->add($type, $message);
} catch (SessionNotFoundException $e) {
throw new \LogicException('You cannot use the addFlash method if sessions are disabled. Enable them in "config/packages/framework.yaml".', 0, $e);
}
}
Kirill
ну зависимость от контейнера и его состояния - это дичь
Vlad
абстрактный контроллер в симфе это гавно
Kirill
Во, контейнер гет...
Vlad
лучше его не использовать
Kirill
За контейнер гет вызовы надо тоже осуждать)
Konstantin
Kirill
Шо
Kirill
Да в любом коде это говнокод, кроме парам резолверов или автовайринга самописного разве что)
Konstantin
конкретно этот addFlash я вызываю сотни раз в коде контроллеров, может тысячи даже. шорткат addFlash удобен и экономит 3-5 строчки шаблонного кода каждый раз. ради чего от него отказывать? потому что Кирилл в чяте сказал что это говнокод?
Kirill
Да пиши
Kirill
Только не говнокод ом это не станет от этого)
Konstantin
я пока вижу одну проблему: "я не хочу наследоваться от АбстрактКонтроллера потому что наследование это плохо"./
но я спокойно отношусь к секте "истеричных адептов запрета наследования", и особых минусов у наследования конкретно контроллеров не вижу, у них там особо иерархии наследования не бывает чтобы общий предок в виде абстракт контроллера мешалось.
окей, во всяких апишных контроллерах, наверное, и нет смысла, но вот в обычных, старых-добрых контроллерах сайтов - которые шаблоны рендерят там, формы, вот это всё, абстракт контроллер экономит приличное количество бойлерплейт-кода
Vlad
не потому что наследование это плохо, а потому что ето помойка методов, которая работает через get контейнера
Konstantin
ты можешь мне объяснить в чем это выражается? кроме того, что тебе не нравится. техническим языком, такие-то и такие-то проблемы сопутствуют этому подходу
Konstantin
аргумент "помойка ненужных методов" в целом ставит под сомнение необходимость в симфони, прикинь сколько там в секурити одном "лишних методов", из которых ты 98% не юзаешь
Konstantin
ты же не пишешь юнит(!)-тесты на контроллер-методы, я уверен. тогда чем тебе это мешает?
Vlad
Иван
Konstantin
значит разные задачи, всё ок. одни люди колбасят чисто апишки, там и правда это не надо. а если у тебя обычный старый сайт, который рендерит шаблоны-формы и вот это всё - уже не очень хорошо живётся
Konstantin
да стоит один раз выебать овцу и всё
ну дядь, это не аргумент 🙂 ты код кеша симфонивского видел? коля-грека там таких овец напереебал, простите, что кровь из глаз льётся
Konstantin
а однако же все юзают и особо не парятся, главное что снаружи оно имеет удобоваримую обёртку
Иван
Валентин на стриме про трейты показывал
говно говна
но это не значит, что надо писать так, как там внутре
Konstantin
ну или там вот это - https://github.com/symfony/translation/blob/6.1/Translator.php#L295
Konstantin
разве это нормально? не особо, мягко говоря. разве это повод не юзать транслятор? да нифига
Иван
вот, например, друпал
внутре всё вызывает всё, чтобы контриботня могла переопределять другую контриботню
но когда дело доходит до финальной разработки, лучше избегать механизма хуков и альтеров
Gleb
Konstantin
event driven обычно всем хорош, кроме того, что хер концы сыщешь при дебаге. и ответа на вопрос "какая же сволочь вызвала вот это и почему" часто и не найти
Иван
Gleb
Пасиб, а то каждый практически день с этим работаю со стороны того, кто эти данные меняет и как-то не задумывался.
Иван
это не уведомление, что удалили пользователя, надо удалить все его материалы
это - а вот кто хочет изменить только что загруженную ноду, мы её рендерить будем, налетай
Gleb
Спасибо) Ключевая мысль - событие событию рознь. Но общую проблему похода я понял.
Kirill
Kirill
Тоже не очень, конечно...
Kirill
Тоже превратится в помойку в перспективе
Kirill
И даже будет хуже, чем сейчас)
Konstantin
будет хуже, ага, потому что его наследовать будет криво
Konstantin
трейт сделать - так в нем тоже самое будет, тоже контейнер нужен
Konstantin
ну либо смириться с помойкой и делать как быстрее 🙂
Vlad
Vlad
основная проблема
Vlad
Вот к примеру getDoctrine() https://github.com/symfony/symfony/blob/5.4/src/Symfony/Bundle/FrameworkBundle/Controller/AbstractController.php#L384 понятно,что он депрейкетнут и вырезали. По твоему хорошо доставать так доктрину?
Vlad
Konstantin
Konstantin
ну или сервисе, в котором репозиторий, или как-то еще - не суть
Vlad
Иван
Kirill
Kirill
trait ProvidesXHelpers
{
abstract protected function getServiceX(): ServiceInterface;
protected function doSomething() { ... }
protected function doSomethingElse() { ... }
protected function doSomethingElseMatter() { ... }
}
Kirill
class ExampleController
{
use ProvidesXHelpers;
public function __construct(
private ServiceInterface $service,
) { ... }
protected function getServiceX(): ServiceInterface
{
return $this->service;
}
}
Konstantin
это по мне еще хуже
Konstantin
уж лучше в трейте сделать метод инжекта с #[Required]
Konstantin
а то получается херня какая-то - мало того что трейт подключи, так еще и в конструктор твоего контроллера пропихни два десятка зависимостей
Konstantin
и будет у тебя каждый контроллер выглядеть вот так
Konstantin
https://cdn.weblab.pro/uplg0.png