Использование страницы фабричного класса в magento2

19

Какова цель рендеринга страницы пользовательского модуля в Magento2 с использованием \Magento\Framework\View\Result\PageFactoryкласса фабрики результатов, введенного в конструктор, и создания страницы для отображения

$resultPage = $this->resultFactory->create(ResultFactory::TYPE_PAGE);

вместо того, чтобы делать это ниже вид дисплея, который такой же, как в подходе Magento 1.x

$this->_view->loadLayout();

$this->_view->renderLayout();
Ниранджан Б
источник

Ответы:

16

На самом деле не нужно возвращать экземпляр \Magento\Framework\View\Result\Page. execute, Как ожидается, возвращает экземпляр класса , который реализует интерфейс \Magento\Framework\Controller\ResultInterface.

\Magento\Framework\View\Result\Pageэто только один возможный возврат.
Другие возможные возвраты

  • \Magento\Framework\Controller\Result\Redirect
  • \Magento\Framework\Controller\Result\Raw
  • \Magento\Framework\View\Result\Layout
  • \Magento\Framework\Controller\Result\Forward
  • \Magento\Framework\Controller\Result\Json

и могут быть другие.
взгляните на метод Magento\Framework\App\Action\Action::dispatch().
Это должно вернуть экземпляр \Magento\Framework\Controller\ResultInterfaceи в зависимости от результата предпринять различные действия, снова вызывая методы, объявленные в ResultInterface.
Этот dispatchметод вызовы , $result = $this->execute();который является executeметодом от действия контроллера. Поэтому я предполагаю, что это для согласованности и упрощения введения другого поведения для действия контроллера. Вам просто нужно добавить новый класс, который реализует, ResultInterfaceи все это будет обрабатываться фреймворком.

Мариус
источник
3

Я считаю, что идея заключалась в том, чтобы возвращать данные / модели с контроллеров, но текущая реализация выглядит для меня тоже странно

Лично я ожидаю, что контроллеры ничего не вернут, возможно, просто перенаправят на другой URL. К макету страницы нужно добавить маршрут, по которому с этой страницы будет доступен.

<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="admin-login">
     <route url="login"/>
    <body>
    </body>
</page>

JSON будет доступен из остальных API

Канди
источник