SlideShare a Scribd company logo
NON PERDERE LA BUSSOLA
MAGENTO 2: ROUTING E CONTROLLERS
SEGUIAMO IL
FLUSSO
MAGENTO 2: ROUTING
E CONTROLLERS
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()
FRONT
CONTROLLER
MAGENTO 2: ROUTING
E CONTROLLERS
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
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;
}
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.
ROUTER
MAGENTO 2: ROUTING
E CONTROLLERS
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
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
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.
CONTROLLER
MAGENTO 2: ROUTING
E CONTROLLERS
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
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.
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
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
AIUTACI MAGICENTO
SEI LA NOSTRA
UNICA SPERANZA

More Related Content

Similar to MAGENTO 2: Routing e Controllers - Paolo Vecchiocattivi

Mageploy presentato al Mage::day() 2013
Mageploy presentato al Mage::day() 2013Mageploy presentato al Mage::day() 2013
Mageploy presentato al Mage::day() 2013Alessandro Ronchi
 
Come Drupal costruisce le tue pagine
Come Drupal costruisce le tue pagineCome Drupal costruisce le tue pagine
Come Drupal costruisce le tue paginesparkfabrik
 
How To React - Aspetti avanzati della gestione dello stato
How To React - Aspetti avanzati della gestione dello statoHow To React - Aspetti avanzati della gestione dello stato
How To React - Aspetti avanzati della gestione dello statoAldoNoschese
 
Sviluppo web con Ruby on Rails
Sviluppo web con Ruby on RailsSviluppo web con Ruby on Rails
Sviluppo web con Ruby on Railsjekil
 
Laravel from scratch
Laravel from scratchLaravel from scratch
Laravel from scratchMarioTraetta
 
OCA: da Oggi Contribuisco Anch'io!
OCA: da Oggi Contribuisco Anch'io!OCA: da Oggi Contribuisco Anch'io!
OCA: da Oggi Contribuisco Anch'io!Alex Comba
 
PostgrSQL 9.3&9.4 - DjangoVillage
PostgrSQL 9.3&9.4 - DjangoVillagePostgrSQL 9.3&9.4 - DjangoVillage
PostgrSQL 9.3&9.4 - DjangoVillageMiriade Spa
 
02 Struts Actions3016
02 Struts Actions301602 Struts Actions3016
02 Struts Actions3016DavideBos
 
02 Struts Actions3016
02 Struts Actions301602 Struts Actions3016
02 Struts Actions3016DavideBos
 

Similar to MAGENTO 2: Routing e Controllers - Paolo Vecchiocattivi (20)

Angular js: routing
Angular js: routingAngular js: routing
Angular js: routing
 
Yagwto
YagwtoYagwto
Yagwto
 
Mageploy presentato al Mage::day() 2013
Mageploy presentato al Mage::day() 2013Mageploy presentato al Mage::day() 2013
Mageploy presentato al Mage::day() 2013
 
3DD 1e Reconfig
3DD 1e Reconfig3DD 1e Reconfig
3DD 1e Reconfig
 
Come Drupal costruisce le tue pagine
Come Drupal costruisce le tue pagineCome Drupal costruisce le tue pagine
Come Drupal costruisce le tue pagine
 
introduzione a symfony 2
introduzione a symfony 2 introduzione a symfony 2
introduzione a symfony 2
 
Introduzione a Struts
Introduzione a StrutsIntroduzione a Struts
Introduzione a Struts
 
How To React - Aspetti avanzati della gestione dello stato
How To React - Aspetti avanzati della gestione dello statoHow To React - Aspetti avanzati della gestione dello stato
How To React - Aspetti avanzati della gestione dello stato
 
MVC2: non solo tecnologia
MVC2: non solo tecnologiaMVC2: non solo tecnologia
MVC2: non solo tecnologia
 
TYPO3 CMS 7.6 - Le novita
TYPO3 CMS 7.6 - Le novitaTYPO3 CMS 7.6 - Le novita
TYPO3 CMS 7.6 - Le novita
 
Sviluppo web con Ruby on Rails
Sviluppo web con Ruby on RailsSviluppo web con Ruby on Rails
Sviluppo web con Ruby on Rails
 
Laravel from scratch
Laravel from scratchLaravel from scratch
Laravel from scratch
 
OCA: da Oggi Contribuisco Anch'io!
OCA: da Oggi Contribuisco Anch'io!OCA: da Oggi Contribuisco Anch'io!
OCA: da Oggi Contribuisco Anch'io!
 
05 OCA, da Oggi Contribuisco Anch'io!
05 OCA, da Oggi Contribuisco Anch'io!05 OCA, da Oggi Contribuisco Anch'io!
05 OCA, da Oggi Contribuisco Anch'io!
 
Rx - ReactiveX
Rx - ReactiveXRx - ReactiveX
Rx - ReactiveX
 
Thesis
ThesisThesis
Thesis
 
PostgrSQL 9.3&9.4 - DjangoVillage
PostgrSQL 9.3&9.4 - DjangoVillagePostgrSQL 9.3&9.4 - DjangoVillage
PostgrSQL 9.3&9.4 - DjangoVillage
 
02 Struts Actions3016
02 Struts Actions301602 Struts Actions3016
02 Struts Actions3016
 
02 Struts Actions3016
02 Struts Actions301602 Struts Actions3016
02 Struts Actions3016
 
02 Struts Actions
02  Struts  Actions02  Struts  Actions
02 Struts Actions
 

MAGENTO 2: Routing e Controllers - Paolo Vecchiocattivi

  • 1. NON PERDERE LA BUSSOLA MAGENTO 2: ROUTING E CONTROLLERS
  • 2. SEGUIAMO IL FLUSSO MAGENTO 2: ROUTING E CONTROLLERS
  • 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()
  • 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. 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. 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.
  • 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. 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. 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.
  • 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. 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. 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. 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. AIUTACI MAGICENTO SEI LA NOSTRA UNICA SPERANZA