Utilisation de la classe d'usine de page dans magento2

19

Quel est le but du rendu de la page de module personnalisé dans Magento2 en utilisant la \Magento\Framework\View\Result\PageFactoryclasse d' usine de résultat injectée dans le constructeur et en rendant la page à afficher

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

plutôt que de faire ces types d'affichage ci-dessous qui sont les mêmes que dans l'approche Magento 1.x

$this->_view->loadLayout();

$this->_view->renderLayout();
Niranjan B
la source

Réponses:

16

En fait, il n'est pas nécessaire de renvoyer une instance de \Magento\Framework\View\Result\Page. Le executedevrait renvoyer une instance d'une classe qui implémente l'interface \Magento\Framework\Controller\ResultInterface.

\Magento\Framework\View\Result\Pagen'est qu'un retour possible.
D'autres retours possibles sont

  • \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

et il peut y en avoir d'autres.
jetez un oeil à la méthode Magento\Framework\App\Action\Action::dispatch().
Cela devrait renvoyer une instance de \Magento\Framework\Controller\ResultInterfaceet en fonction du résultat, différentes actions sont prises, encore une fois en appelant les méthodes déclarées dans le ResultInterface.
Cette dispatchméthode appelle $result = $this->execute();qui est la executeméthode de l'action du contrôleur. Je suppose donc que c'est pour la cohérence et pour faciliter l'introduction d'un comportement différent pour une action de contrôleur. Vous avez juste besoin d'ajouter une nouvelle classe qui implémente ResultInterfaceet tout sera géré par le framework.

Marius
la source
3

Je crois que cette idée était de renvoyer des données / modèles des contrôleurs, mais l'implémentation actuelle me semble étrange aussi.

Personnellement, je m'attends à ce que les contrôleurs ne retournent rien, peut-être simplement rediriger vers une autre URL. La mise en page doit ajouter un itinéraire avec cette page sera disponible.

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

JSON sera disponible depuis l'api de repos

KAndy
la source