Nella precedente lezione abbiamo visto come impostare delle regole sulle rotte per abilitare l'accesso a specifiche aree dell'applicazione a specifici ruoli attraverso l'access_control
.
Con un'applicazione articolata è facile spendere molto tempo nel debug di regole e rotte per capire perché essa non si comporta come ci aspettiamo. Lo stesso problema possiamo averlo anche nella creazione delle rotte; capita spesso che venga caricato il controller sbagliato, o peggio restituito un 404, nonostante abbiamo impostato una regola di routing.
Vediamo come eseguire il debug delle rotte attraverso la console di Symfony per risolvere facilmente eventuali problemi che possiamo incontrare durante lo sviluppo.
La prima verifica che possiamo effettuare consiste nel controllare che la rotta creata sia registrata tra le rotte. Il comando è:
$ bin/console debug:router
-------------------------- -------- -------- ------ -----------------------------------
Name Method Scheme Host Path
-------------------------- -------- -------- ------ -----------------------------------
_preview_error ANY ANY ANY /_error/{code}.{_format}
_wdt ANY ANY ANY /_wdt/{token}
_profiler_home ANY ANY ANY /_profiler/
_profiler_search ANY ANY ANY /_profiler/search
_profiler_search_bar ANY ANY ANY /_profiler/search_bar
_profiler_phpinfo ANY ANY ANY /_profiler/phpinfo
_profiler_search_results ANY ANY ANY /_profiler/{token}/search/results
_profiler_open_file ANY ANY ANY /_profiler/open
_profiler ANY ANY ANY /_profiler/{token}
_profiler_router ANY ANY ANY /_profiler/{token}/router
_profiler_exception ANY ANY ANY /_profiler/{token}/exception
_profiler_exception_css ANY ANY ANY /_profiler/{token}/exception.css
app_login ANY ANY ANY /login
app_logout ANY ANY ANY /logout
index ANY ANY ANY /
-------------------------- -------- -------- ------ -----------------------------------
bin/console debug:router
restituisce tutte le rotte registrate e possiamo notare le 3 rotte finora definite nell'applicazione: login, logout e home page. Possiamo poi passare il parametro --show-controllers
per stampare anche il nome del controller chiamato.
Possiamo passare al comando il nome della rotta per vederne i dettagli:
$ bin/console debug:router app_login
+--------------+---------------------------------------------------------+
| Property | Value |
+--------------+---------------------------------------------------------+
| Route Name | app_login |
| Path | /login |
| Path Regex | #^/login$#sDu |
| Host | ANY |
| Host Regex | |
| Scheme | ANY |
| Method | ANY |
| Requirements | NO CUSTOM |
| Class | Symfony\Component\Routing\Route |
| Defaults | _controller: App\Controller\SecurityController::login |
| Options | compiler_class: Symfony\Component\Routing\RouteCompiler |
| | utf8: true |
+--------------+---------------------------------------------------------+
I primi 2 comandi possono dare indicazioni sul fatto che la regola compaia (e quindi non abbiamo sbagliato ad esempio a inserirla nella configurazione) e che richiami il controller e le regole giusti. Un caso comune di configurazione errata è quando si richiama una rotta che risponde solo con POST con metodi differenti, soprattutto GET.
Qualora non avessimo risolto il problema possiamo richiamare l'URI della rotta che non funziona per vedere il nome della rotta che fa match:
$ bin/console router:match /login
[OK] Route "app_login" matches
+--------------+---------------------------------------------------------+
| Property | Value |
+--------------+---------------------------------------------------------+
| Route Name | app_login |
| Path | /login |
| Path Regex | #^/login$#sDu |
| Host | ANY |
| Host Regex | |
| Scheme | ANY |
| Method | ANY |
| Requirements | NO CUSTOM |
| Class | Symfony\Component\Routing\Route |
| Defaults | _controller: App\Controller\SecurityController::login |
| Options | compiler_class: Symfony\Component\Routing\RouteCompiler |
| | utf8: true |
+--------------+---------------------------------------------------------+