2012-01-27 15 views
8

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 AppControllerbeforeFilter() 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:

  1. Si tratta di un bug nella gestione delle eccezioni di default di CakePHP,
  2. Il comportamento è come previsto e io proprio non capisco, o
  3. 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

+1 per "Potrei essere pazzo" di auto-diagnosi. –

risposta

4

Effettuare le chiamate a $this->set() nella richiamata beforeRender(). In questo modo, saranno sempre impostati anche quando lanci un'eccezione.

Ho avuto lo stesso problema con alcune variabili di layout personalizzate, come con DebugKit la mia pagina sarebbe stata riempita con avvisi di variabili non dichiarate ogni volta che si verificava un errore. Utilizzando beforeRender() invece risolto.

+0

+1 per una risposta perspicace - ma non sono sicuro che questo lavoro per me, dal momento che 'BeforeRender()' viene eseguito dopo la logica dell'azione. Poiché eseguo controlli di autorizzazione, non voglio che la logica di azione venga eseguita se falliscono. – eaj

+0

Ripensandoci, questo non ha senso. Naturalmente posso lanciare la mia eccezione in 'beforeFilter()' e impostare le variabili di visualizzazione in 'beforeRender()'. Ho accettato questa risposta poiché risolve il mio problema immediato, ma mi piacerebbe comunque sapere se si tratta di un bug che "beforeFilter()" non viene chiamato sul controller degli errori. – eaj

3

è possibile sovrascrivere CakeErrorController.php copiandolo su App/Controller/ e quindi aggiungere parent :: beforeFilter() nel costruttore.

+0

Grazie, questa è certamente un'opzione utile. Sembra un po 'schifoso, però. A questo punto ho il mio codice che fa quello che deve fare. Vorrei ancora capire perché il processo di gestione delle eccezioni non chiama mai 'startupProcess()' 'sulle CakeErrorController' nello stesso modo il dispatcher chiama su altri controller. – eaj

Problemi correlati