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