Как стать автором
Обновить

Комментарии 4

В Вашем примере с сессиями данные засетаются в дефолтный неймспейс, что не совсем правильно.

Более прикладной пример был бы
— с использованием существующих менеджеров (Checkout, Customer...)
— либо декларацией виртуального типа стореджа черезе di.xml с кастомным неймспейсом и подкидывание этого стореджа вашему session Manager `у и уже использование его в коде

Например:
       <virtualType name="Magento\Newsletter\Model\Session\Storage" type="Magento\Framework\Session\Storage">
        <arguments>
            <argument name="namespace" xsi:type="string">newsletter</argument>
        </arguments>
    </virtualType>
    <type name="Magento\Newsletter\Model\Session">
        <arguments>
            <argument name="storage" xsi:type="object">Magento\Newsletter\Model\Session\Storage</argument>
        </arguments>
    </type>


И по регистру, если вы его используете, то, возможно, стоит посмотреть на код и подумать «Возможно здесь что-то не так?»

Спасибо за коммент. Данная статья задумывалась как краткая сводка доступных способов промежуточного сохранения информации не в БД. Да, имплементаций интерфейса SessionManagerInterface достаточно много (навскидку, штук 10), но полезных рекомендаций по их использованию я дать не могу — я так глубоко не копал. Могу только сказать, что такой механизм существует, что я и сделал (информация действительно сохраняется между запросами, я проверял).


А по регистру — я посмотрел, но не понял, что именно может быть "не так"? Регистр (реестр) позволяет сохранять данные на все время своей жизни (в пределах одного запроса). Через DI доступен практически в любом классе. Если в Magento 2 есть какой-то другой механизм для выполнения таких же задач, было бы интересно о нем узнать. Сообщите, пожалуйста, о нем, и я дополню статью.

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

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

Спсибо за пояснения, внесу правки в текст статьи.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории