gpt4 book ai didi

php - Cakephp 3在父类的beforeFilter中重定向

转载 作者:行者123 更新时间:2023-12-03 01:44:14 25 4
gpt4 key购买 nike

在我们的 CakePHP 3 应用程序中,我们发现了不同的行为。我们确信它在 CakePHP 2 中运行良好,所以我认为新版本中发生了一些变化。

当用户访问此网址:/b2controller/myMethod时,这些方法将运行:

AppController::beforeFilter()  
BController::beforeFilter()
B2Controller::beforeFilter()
B2Controller::myMethod()
B2Controller::myMethod2()

然后用户被重定向到此网址 /ccontroller/myMethod10/

但是我们需要这个:

当用户访问时/b2controller/myMethod$isOk 条件为 true,然后将用户重定向到 /ccontroller/myMethod10/,无需运行 BController::beforeFilter()B2Controller::beforeFilter()B2Controller::myMethod()BController::MyMethod2 ().

我们的最小代码是这样的:

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() {
...
...
...
}
}

如何让用户从主类的 beforeFilter 重定向到另一个 Controller 操作?请注意,会发生重定向。但用户在调用 myMethod()myMethod2() 后被重定向。

另请注意,还有其他 Controller (例如 CController)使用 beforeFilter 重定向行为。

最佳答案

这里有 3 种有效的方法:

方法 1 - 覆盖 Controller 中的 startupProcess

重写AppControllerstartupProcess方法:

// In your AppController
public function startupProcess() {
// Compute $isOk
if ($isOk) {
return $this->redirect('/c/myMethod10');
}
return parent::startupProcess();
}

这是一种简短且相当干净的方法,所以如果可以的话我会选择这个。如果这不符合您的需求,请参阅下文。

注意:如果您使用此方法,当您计算 $isOk 时,您的组件可能不会初始化,因为初始化是由 parent::startupProcess< 完成的.

方法 2 - 从 AppController 发送响应:

一种简单但不是很干净的方法可能是从 AppController::beforeFilter 发送响应:

public function beforeFilter(\Cake\Event\Event $event) {
// Compute $isOk
if ($isOk) {
$this->response = $this->redirect('/c/myMethod10');
$this->response->send();
die();
}
}

方法 3 - 使用 Dispatcher Filters

更“干净”的方法是使用 Dispatcher Filters :

src/Routing/Filter/RedirectFilter.php中:

<?php

namespace App\Routing\Filter;

use Cake\Event\Event;
use Cake\Routing\DispatcherFilter;

class RedirectFilter extends DispatcherFilter {

public function beforeDispatch(Event $event) {
// Compute $isOk
if ($isOk) {
$response = $event->data['response'];
// The code bellow mainly comes from the source of Controller.php
$response->statusCode(302);
$response->location(\Cake\Routing\Router::url('/c/myMethod10', true));
return $response;
}
}
}

config/bootstrap.php中:

DispatcherFactory::add('Redirect');

您可以删除 AppController 中的重定向。如果您能够从 DispatcherFilter 计算 $isOk,这可能是最干净的方法。

请注意,如果您有 beforeRedirect 事件,则此方法不会触发这些事件。

<小时/>

编辑:这是我之前的答案,如果您有多个类似于 B 的 Controller ,则效果不佳。

您需要返回由$this->redirect()返回的Response对象。实现这一目标的一种方法是执行以下操作:

class BController extends AppController {

public function beforeFilter(\Cake\Event\Event $event) {
$result = parent::beforeFilter($event);
if ($result instanceof \Cake\Network\Response) {
return $result;
}
// Your stuff
}

}

仅当没有重定向时才会执行 if 下面的代码(parent::beforeFilter($event) 未返回 Response 对象)。

注意:我不知道你如何计算isOk,但如果你调用$this->redirect(),请小心无限重定向循环code> 调用 /ccontroller/mymethod10 时。

关于php - Cakephp 3在父类的beforeFilter中重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32177050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com