Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

MAGENTO 2: Routing e Controllers - Paolo Vecchiocattivi

Come non perdere la bussola con il routing e i controller di Magento 2.
MageSpecialistContest - 30/11/2015

  • Login to see the comments

MAGENTO 2: Routing e Controllers - Paolo Vecchiocattivi

  1. 1. NON PERDERE LA BUSSOLA MAGENTO 2: ROUTING E CONTROLLERS
  2. 2. SEGUIAMO IL FLUSSO MAGENTO 2: ROUTING E CONTROLLERS
  3. 3. CONTROLLER Controller::execute() HTTP APP App:launch() MAGENTO 2: ROUTING E CONTROLLERS SEGUIAMO IL FLUSSO BOOTSTRAP Bootstrap::run() ROUTING Router::match(() FRONT CONTROLLER FrontController::dispatch() RENDERING View::loadLayout() View::renderLayout() OUTPUT Response::sendResponse() INDEX.PHP CONTROLLER Controller::execute() ROUTING Router::match(() FRONT CONTROLLER FrontController::dispatch()
  4. 4. FRONT CONTROLLER MAGENTO 2: ROUTING E CONTROLLERS
  5. 5. MAGENTO 2: ROUTING E CONTROLLERS FRONT CONTROLLER ▸ Simile a Magento 1 ▸ Esegue il dispatch della richiesta http ▸ È responsabile dell’individuazione del router corretto per la richiesta corrente
  6. 6. MAGENTO 2: ROUTING E CONTROLLERS FRONT CONTROLLER public function dispatch(RequestInterface $request) { MagentoFrameworkProfiler::start('routers_match'); $routingCycleCounter = 0; $result = null; while (!$request->isDispatched() && $routingCycleCounter++ < 100) { /** @var MagentoFrameworkAppRouterInterface $router */ foreach ($this->_routerList as $router) { try { $actionInstance = $router->match($request); if ($actionInstance) { $request->setDispatched(true); $actionInstance->getResponse()->setNoCacheHeaders(); $result = $actionInstance->dispatch($request); break; } } catch (MagentoFrameworkExceptionNotFoundException $e) { $request->initForward(); $request->setActionName('noroute'); $request->setDispatched(false); break; } } } MagentoFrameworkProfiler::stop('routers_match'); if ($routingCycleCounter > 100) { throw new LogicException('Front controller reached 100 router match iterations'); } return $result; }
  7. 7. MAGENTO 2: ROUTING E CONTROLLERS FRONT CONTROLLER ▸ L’elenco dei Router viene gestito dalla classe RouterList che ne gestisce l’ordinamento e l’iterazione ▸ La lista viene esaminata in un ciclo foreach finché non viene trovato un Router che corrisponde al match. ▸ Il ciclo viene eseguito più volte finché: • la richiesta non è segnata come dispatched • non vengono eseguite 100 iterazioni ▸ Se c’è un eccezione di non trovato, il ciclo prosegue comunque fino al dispatched.
  8. 8. ROUTER MAGENTO 2: ROUTING E CONTROLLERS
  9. 9. MAGENTO 2: ROUTING E CONTROLLERS ROUTER ▸ Esistono diversi tipi di router • Base Router (frontname/actionpath/action/ params/) • CMS Router (pageid) • URL Rewrite Router • Default Router (404 Router, NoRouteHandlers) • Custom Router
  10. 10. MAGENTO 2: ROUTING E CONTROLLERS BASE ROUTER ▸ Simile a Magento 1, risponde a un url del tipo frontname/actionpath/action/params/ ▸ frontname viene definito dentro il routes.xml del modulo e risolve in namespace/modulo ▸ actionpath è la directory che contiene gli action controllers. ▸ Il controller risultante viene cercato in:
 Namespace/Modulo/Controller/Actionpath/Action.php
  11. 11. MAGENTO 2: ROUTING E CONTROLLERS CUSTOM ROUTER ▸ Si possono creare nuovi Router aggiungendoli alla classe MagentoFrameworkAppRouterList ▸ La route generata può essere di qualsiasi tipo (es. cerca una o più parole nella route) ▸ Solitamente il risultato del match è di settare frontname, controller, e action e fare il forward verso il base router, altrimenti bisogna eseguire manualmente un dispatch.
  12. 12. CONTROLLER MAGENTO 2: ROUTING E CONTROLLERS
  13. 13. MAGENTO 2: ROUTING E CONTROLLERS CONTROLLER ▸ Non esistono più i metodi someAction ma ogni controller è un azione separata ▸ I due metodi principali sono dispatch e execute ▸ Tutti i dati vengono passati per DI durante il __construct ▸ Altri metodi importanti sono forward e redirect ▸ Esistono due tipi di controller: frontend e backend. I controller backend hanno in più i metodi per il controllo dei permessi implementati con una riscrittura del dispatch
  14. 14. MAGENTO 2: ROUTING E CONTROLLERS ACTION WRAPPER ▸ Mette a disposizione una logica comune per i controller nello stesso actionpath ▸ È una classe astratta da cui erediteranno gli altri controller. ▸ Es. MagentoCatalogControllerProduct è il wrapper per i controller dei catalogo e implementa i metodi per inizializzare il prodotto, la categoria, etc.
  15. 15. MAGENTO 2: ROUTING E CONTROLLERS MODIFICARE UN CONTROLLER ESISTENTE 1. Preference - tramite di.xml, è un rewrite completo del controller 2. Plugin - modifica solo i metodi necessari 3. After/Before - come su Magento 1, modifica la posizione in cui viene cercato il front name
  16. 16. MAGENTO 2: ROUTING E CONTROLLERS CREARE UN NUOVO CONTROLLER 1. Creare il file routes.xml dentro etc/frontend o etc/ adminhtml. 2. Inserire i parametri del controller: ‣ router: id – standard(frontend)/admin ‣ route: id – identificatore univoco ‣ route: frontName - prima parte della url ‣ module name – il nome del modulo 3. Creare il file del controller nella directory del modulo
 Controller/Actionpath/Actionclass.php
  17. 17. AIUTACI MAGICENTO SEI LA NOSTRA UNICA SPERANZA

×