W naszej aplikacji CakePHP 3 znaleźliśmy inne zachowanie. Jesteśmy pewni, że działa to dobrze w CakePHP 2, więc przypuszczam, że coś zmieniło się w nowej wersji.Przekierowanie Cakephp 3 przedFiltrem klasy nadrzędnej
Gdy użytkownik odwiedza ten URL: /b2controller/myMethod
te metody run:
AppController::beforeFilter()
BController::beforeFilter()
B2Controller::beforeFilter()
B2Controller::myMethod()
B2Controller::myMethod2()
następnie użytkownik jest przekierowywany do tego adresu URL /ccontroller/myMethod10/
Ale musimy to:
Gdy użytkownik odwiedza /b2controller/myMethod
i $isOk
stan to true
, a następnie przekieruj użytkownika do /ccontroller/myMethod10/
, bez uruchamiania BController::beforeFilter()
, B2Controller::beforeFilter()
, B2Controller::myMethod()
i BController::MyMethod2()
.
Nasz minimalny kod jest tak:
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() {
...
...
...
}
}
Jak mogę zrobić użytkownik, aby przekierować do innego działania kontrolera, z beforeFilter głównej klasie? Zwróć uwagę, że występuje przekierowanie. Ale użytkownik jest przekierowywany po wywołaniu myMethod()
i myMethod2()
.
Należy również zauważyć, że istnieją inne kontrolery, takie jak CController
, które używają funkcji przekierowania przed filtrem.
Spróbuj zwrócić 'parent :: beforeFilter ($ event)' w 'BController'. 'Controller :: redirect' zwraca obiekt' Response', jeśli nie zwróci go w wywołaniu 'beforeFilter', Cake [nie będzie w stanie wykryć] (http://api.cakephp.org/3.0/ source-class-Cake.Controller.Controller.html # _startupProcess), które chcesz wykonać przekierowanie. – Holt
Masz na myśli? 'class BController rozszerza funkcję AppController { beforeFilter (Event $ event) { return parent :: beforeFilter ($ event); } } ' – trante
Tak. Nie jestem pewien, ale patrząc na źródło 'startupProcess', wygląda na to, że musisz coś zwrócić, aby zatrzymać proces żądania. – Holt