Ho lavorato con CakePHP 1.3, ma questa è la mia prima incursione nelle eccezioni di CakePHP 2.0 e PHP, quindi portatemi se la mia domanda sembra prolissa.CakePHP 2.0 - beforeFilter() non eseguito su cakeErrorController?
Nel mio AppController
beforeFilter()
ho impostato un paio di variabili tramite $this->set()
per l'utilizzo nel modello di visualizzazione.
Nel mio UsersController
codice che ho che assomiglia più o meno in questo modo:
public function beforeFilter() {
parent::beforeFilter();
if (userDeniedAccess()) {
throw new ForbiddenException();
}
}
dove la funzione ipotetica userDeniedAccess()
incapsula i miei controlli di autorizzazione.
Tutto funziona correttamente e ottengo l'errore 403 quando me lo aspetto. Tuttavia, quando viene generata l'eccezione, le variabili di visualizzazione impostate in AppController::beforeFilter()
non vengono più impostate, causando errori dal modello di visualizzazione. Quando l'eccezione è non generata, le variabili sono impostate correttamente.
È possibile codificare le variabili mancanti se necessario, ma mi piacerebbe davvero sapere che cosa causa questo comportamento. Entrambi i miei UsersController
e CakeErrorController
estendono AppController
. Naturalmente, mi aspetto che quando viene lanciata l'eccezione e venga creata l'istanza CakeErrorController
, genererebbe per me le stesse variabili di visualizzazione.
Tuttavia, sembra che il metodo Controller::startupProcess()
(che include la chiamata a beforeFilter()
) non venga mai chiamato su CakeErrorController
. A quanto ho capito, questo viene eseguito dal dispatcher per richieste regolari, ma il ciclo di vita del controller degli errori è diverso.
Ho visto descrizioni (like this one) di comportamento simile in CakePHP 1.3, ma ovviamente il codice di gestione degli errori di CakePHP è stato completamente revisionato in 2.0.
Quindi, o:
- Si tratta di un bug nella gestione delle eccezioni di default di CakePHP,
- Il comportamento è come previsto e io proprio non capisco, o
- vado dadi.
So che non si può fare a meno del caso 3, ma se uno dei primi due si applica, apprezzerei l'input di qualcuno che ne sa più di me.
Grazie!
MODIFICA: L'impostazione delle variabili di visualizzazione in beforeRender()
risolve il problema. Tuttavia, mi chiedo ancora se sia intenzionale che beforeFilter()
non venga mai chiamato su CakeErrorController
.
+1 per "Potrei essere pazzo" di auto-diagnosi. –