Nella nostra applicazione CakePHP 3 abbiamo riscontrato un comportamento diverso. Siamo sicuri che ha funzionato bene in CakePHP 2, quindi suppongo che qualcosa sia cambiato nella nuova versione.Cakephp 3 reindirizza in beforeFiltro della classe madre
Quando l'utente visita questo URL: /b2controller/myMethod
, questi metodi funzionano:
AppController::beforeFilter()
BController::beforeFilter()
B2Controller::beforeFilter()
B2Controller::myMethod()
B2Controller::myMethod2()
allora l'utente viene reindirizzato a questo URL /ccontroller/myMethod10/
Ma abbiamo bisogno di questo:
Quando le visite degli utenti /b2controller/myMethod
e $isOk
condizione è true
, quindi reindirizzare l'utente a /ccontroller/myMethod10/
, senza eseguire BController::beforeFilter()
, B2Controller::beforeFilter()
, B2Controller::myMethod()
e BController::MyMethod2()
.
Il nostro codice minimo è come questo:
class AppController {
function beforeFilter(Event $event) {
// set $isOk variable
if ($isOk == TRUE) {
return $this->redirect('/ccontroller/myMethod10/');
}
$aa=1;
$ab=2;
}
}
class BController extends AppController {
function beforeFilter(Event $event) {
parent::beforeFilter($event);
$a=1;
$b=2;
}
function myOtherMethod() {
myOtherMethod2();
}
function myOtherMethod2() {
...
...
}
}
class B2Controller extends BController {
function beforeFilter(Event $event) {
parent::beforeFilter($event);
$m1=1;
$m2=2;
}
function myMethod() {
myMethod2();
}
function myMethod2() {
...
...
}
}
class CController extends AppController {
function beforeFilter(Event $event) {
parent::beforeFilter($event);
}
function myMethod10() {
...
...
...
}
}
Come posso fare all'utente di reindirizzare ad un altro azione di controllo, dal beforeFilter di classe principale? Si noti che si verifica il reindirizzamento. Ma l'utente viene reindirizzato dopo aver chiamato myMethod()
e myMethod2()
.
Si noti inoltre che esistono altri controller come CController
che utilizzano il comportamento di reindirizzamento beforeFilter.
Provare a restituire 'parent :: beforeFilter ($ event)' in 'BController'. 'Controller :: redirect' restituisce un oggetto' Response', se non lo si restituisce nella chiamata 'beforeFilter', Cake [non sarà in grado di rilevare] (http://api.cakephp.org/3.0/ source-class-Cake.Controller.Controller.html # _startupProcess) che si desidera eseguire un reindirizzamento. – Holt
Intendi questo? 'classe BController estende la funzione AppController { beforeFilter (Event $ event) { return parent :: beforeFilter ($ event); } } – trante
Sì. Non ne sono affatto sicuro, ma guardando l'origine di 'startupProcess', sembra che tu debba restituire qualcosa per fermare il processo di richiesta. – Holt