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.