За последние 24 часа нас посетил 17001 программист и 1699 роботов. Сейчас ищут 1104 программиста ...

Где пробрасывается атрибут шаблона?

Тема в разделе "Сделайте за меня", создана пользователем Вероломство, 1 сен 2023.

  1. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    626
    Симпатии:
    24
    PHP:
    1. return function (Container $container) {
    2.     $container->set(Twig::class, function () use ($container) {
    3.         $twigSettings = $container->get('settings')['twig'];
    4.         $appSettings = $container->get('settings')['app'];
    5.  
    6.         $twig = new Twig(new FilesystemLoader($twigSettings['path']), $twigSettings['options']);
    7.  
    8.         $twig->offsetSet('app_name', $appSettings['name']); // кое-что нужно передать в шаблон заранее
    9.  
    10.         return $twig;
    11.     });
    12. };
    мозг смущается: а не предназначена ли сборка сервиса всего лишь для его сборки

    Атрибут можно при сборке передавать или для этого промежуточное нужно создать и там его передать?

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

    И ещё нужно заголовок страницы передать:

    PHP:
    1. class HomeAction
    2. {
    3.     private Twig $twig;
    4.  
    5.     public function __construct(Twig $twig)
    6.     {
    7.         $this->twig = $twig;
    8.  
    9.         // может быть тут заголовок собрать?
    10.     }
    11.  
    12.     public function __invoke(Request $request, Response $response): Response
    13.     {
    14.         $this->twig->offsetSet('page_title', 'Домашняя страница'); // заголовок страницы
    15.      
    16.         return $this->twig->render($response, 'guest/home.twig');
    17.     }
    18. }
    есть ли разница: в конструкторе заголовок собрать или уже именно в методе?

    p.s. балуюсь со slim-ом немного, непривычно после самописек
     
    #1 Вероломство, 1 сен 2023
    Последнее редактирование: 1 сен 2023
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.800
    Симпатии:
    1.331
    Адрес:
    Лень
    PHP:
    1. namespace App\Controller;
    2.  
    3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
    4. use Symfony\Component\HttpFoundation\Response;
    5.  
    6. class UserController extends AbstractController
    7. {
    8.     // ...
    9.  
    10.     public function notifications(): Response
    11.     {
    12.         // получить информацию пользователя и уведомления каким-то образом
    13.         $userFirstName = '...';
    14.         $userNotifications = ['...', '...'];
    15.  
    16.         // путь шаблона - это относительн путь файла из `templates/`
    17.         return $this->render('user/notifications.html.twig', [
    18.             // этот массив определяет переменные, переданные шаблону, где ключ - это
    19.             // имя переменной, а значение - значение переменной
    20.             // (Twig рекомендует использование имен переменных snake_case : 'foo_bar' вместо 'fooBar')
    21.             'user_first_name' => $userFirstName,
    22.             'notifications' => $userNotifications,
    23.         ]);
    24.     }
    25. }
    --- Добавлено ---
    HomeAction не наследует родительский класс, у которого имеется фасадные методы по рендеру и т.д.
    И момент почему ты фанатеешь от магии __инвока, когда у нас дергаются обычные публичные методы после обработки роутера и исходя от правила map карты роутинга, я хз.
    В результате по первому впечатлению у тебя сейчас каша логическая. Где-то, когда-то подхватил "ухты" фишку и везде стал применять.
    --- Добавлено ---
    Вопрос: а если я захочу N страниц со своей микро-логикой сделать и в одном классе описать методы?
     
  3. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    626
    Симпатии:
    24
    @MouseZver а зачем читать вопрос, правильно?

    и каждом роуте я буду передавать постоянную переменную app_name как дурачок

    я знаю, как передать пременные третьим параметром метода Twig::render, я шаблонизатор сам могу написать за полчаса, меня интересует просто, в какой момент атрибуты нужно передавать, я всегда передаю при сборке, но так как в данный момент своего занятия моим хобби я колупаю Middleware, поэтому и спрашиваю: а не передавать ли их в middleware

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

    я вопросы всегда задаю с предоставлением ПРИМЕРНОГО кода, я не могу сюда захуярить всесь свой проект чтобы ты зубоскалил не читая сути вопроса
     
    #3 Вероломство, 2 сен 2023
    Последнее редактирование: 2 сен 2023
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.800
    Симпатии:
    1.331
    Адрес:
    Лень
    Нет, ты даже не понимаешь как устроен Container и об существовании Lazy подгрузки, а после инициализации не взрыхливает снова кишки в пакете Twig::class, он далее использует лишь только instance result этого содержимого. Поэтому дурачек тут ты, думающий что app_name будет снова перезаписываться да и вовсе Twig класс пересоздаваться. Берешь и var_dump туда лепишь и смотришь:
    Кто из нас тут дурачек, аааа ?

    А если постоянно у тебя дергается внутренности этого пакета, то уважаемый, у вас самодельный говнокод, а не Container.

    Поэтому у тебя все остальные вопросы исходят от - грязного фундамента.


    --- Добавлено ---
    Хуярь
    --- Добавлено ---
    В твоем контроллере не должно быть конструктора точка
    В твоем контроллере каждый публичный метод полностью отвечает за свою страницу, от заголовка до вывода
    --- Добавлено ---
    Роуты ладно. Ты 98 контроллеров создашь ? :D