Magento 2: передача змінних від дії контролера до "Перегляду"


12

У Magento 1, якщо ви хочете передати дані з вашої дії контролера до "Перегляду" (тобто блоку в макеті, ви можете)

  1. Додайте значення / об'єкт до глобального реєстру через Mage::register

  2. Безпосередньо отримати об’єкт блоку та встановити властивості даних на вилученому об’єкті блоку після запуску loadLayout

  3. Методи виклику блокових об'єктів у phtmlфайлах, а об'єкти блоків використовують шар моделі / бази даних для зчитування раніше збережених даних у дії контролера

Використання методів блокових об’єктів для зчитування з бази даних все ще працює в Magento 2 - що підходить для певних видів операцій. Однак,

  1. У Magento 2 більше немає глобального реєстру (або він є?)

  2. Тепер система компонування працює, створюючи об’єкт сторінки через фабрику, і ви не можете захопити посилання блоків так само, як це можливо в Magento 1

Чи можливо в Magento 2 передавати дані безпосередньо від дії контролера до перегляду? Або це занадто прямий зразок для сміливого нового дизайну Magento World ™ ™? Якщо це занадто пряма закономірність, що робити, якщо є якась обчислена інформація, яку ми хочемо відобразити в шаблоні, але ми не хочемо зберігати цю інформацію в стані (тобто ми не хочемо зберігати її в база даних)

Я можу придумати кілька різних способів зламати це разом самостійно - але мене цікавить, як Magento 2 хоче , щоб ти це зробив.

Примітка . Я розумію, що можна отримати екземпляр блоку в дії контролера, використовуючи щось подібне

$resultPage = $this->resultPageFactory->create();    
$block = $resultPage->getLayout()->getBlock('catalog.wysiwyg.js');        

var_dump(spl_object_hash($block));

Основний код Magento 2 робить це часто. Однак - об'єкт блоку, отриманий в об'єкті контролера, здається, є іншим об'єктом, ніж це доступно в phtmlшаблоні через $thisабо $block((колишній ( $this) видається об'єктом, який фактично надає шаблон, тоді як пізніше ( $block) здається, що це екземпляр типу Magento Block).

#File: path/to/template.phtml
var_dump(spl_object_hash($block));
var_dump(spl_object_hash($this));

Я кажу "здається, що", тому що якщо я встановив дані методом дії контролера, це не доступно в phtmlшаблоні - і якщо я порівняю spl_object_hashрезультати вище, я отримаю три різних хеша. Однак я достатньо новий у всьому цьому, що вищезгадане може бути якоюсь іншою помилкою, яку я зробив - тому, якщо ви змогли встановити дані на блоки та отримати їх у шаблоні, я хотів би почути про це !

Відповіді:


17

Щодо №1, реєстр все ще існує, дуже схожий на те, що ви знаєте з Magento 1. Він просто переміщений. Побачити:\Magento\Framework\Registry

Додайте його до свого конструктора за допомогою введення залежності, а потім ви можете використовувати свої знайомі $registry->register($key, $value)та $registry->registry($key)методи для зберігання / доступу до даних.

Я б рекомендував розібратися навколо простору імен \ Magento \ Framework, якщо ви ще цього не зробили. Багато з того, що було доступно раніше від Mage або App, все ще існує, просто розкололося.

Що стосується найкращих практик, я не можу відповісти на це, але я сподіваюся, що відповідь полягатиме в тому, щоб якомога більше логіки залишалося поза контролером. Дивлячись на ядро ​​- це, мабуть, найкраща ставка. Наприклад, див. Сторінку редагування адреси клієнта: Основний контролер ; обширний блок - включаючи витягнення ідентифікатора адреси та завантаження, якщо необхідно. Вони обробляють це безпосередньо в блоці; вони не роблять цього в контролері, а потім передають його навколо.


2
Трюк, звичайно, полягає в тому, щоб знати, які частини для ядра слід подивитися, а які ігнорувати :) Дякую за покажчики, +1 за корисну інформацію!
Алан Шторм

1
+1 за останній абзац. Якщо вам потрібно поділити якесь обчислене значення, покладіть обчислювальну поведінку на окремий об'єкт і викликайте його з блоків, які потребують цього значення. Реєстр не відсторонений, тому що це глобальний стан, що змінюється, і ви ніколи не знаєте, що звідти отримаєте. Пряма адресація блоків від дії також не відлякує, оскільки ви ніколи не впевнені, що блок присутній на сторінці (макет може вбити його)
Антон Кріль,

@AntonKril як щодо помічників візуалізації сторінки? Помічник сторінки CMS, помічник перегляду продукту, це призначений для відокремлення візуалізації від HTTP-запиту?
Іван Чепурний

5

Ви не повинні передавати змінні з дії контролера в режим перегляду. Використовуйте блок для для передачі змінних до перегляду (механізм шаблону).


Чому? Як ви могли передати параметри get / post від блоку до перегляду? Хіба не сама логіка передає їх від контролера до перегляду?
LucScu

Використовуйте Запит об’єкта в блоках. Якщо ви блокуєте отримання даних від контролера через Реєстр, ви не можете використовувати його блоки з іншими контролерами. Це називається тимчасове з'єднання та його погані практики
Кенді

Я використовую $ block-> assign (), щоб передати параметри запиту від контролера до блоку. Це також погана практика?
LucScu

Безпосередня адресація блоків від дії також не відлякує, оскільки ви ніколи не впевнені, що блок присутній на сторінці.
KAndy

У моєму випадку я впевнений, тому що це власний сценарій, коли контролер, макет і блок контролюються тільки моїм кодом, тому я думаю, що це параметри логіки передачі запитів від контролера до блоку. Thx для ваших відповідей!
LucScu
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.