- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我们的 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 种有效的方法:
startupProcess
重写AppController
的startupProcess
方法:
// In your AppController
public function startupProcess() {
// Compute $isOk
if ($isOk) {
return $this->redirect('/c/myMethod10');
}
return parent::startupProcess();
}
这是一种简短且相当干净的方法,所以如果可以的话我会选择这个。如果这不符合您的需求,请参阅下文。
注意:如果您使用此方法,当您计算 $isOk
时,您的组件可能不会初始化,因为初始化是由 parent::startupProcess< 完成的
.
AppController
发送响应:一种简单但不是很干净的方法可能是从 AppController::beforeFilter
发送响应:
public function beforeFilter(\Cake\Event\Event $event) {
// Compute $isOk
if ($isOk) {
$this->response = $this->redirect('/c/myMethod10');
$this->response->send();
die();
}
}
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/
我正在尝试使用谷歌浏览器的 Trace Event Profiling Tool分析我正在运行的 Node.js 应用程序。选择点样本后,我可以在三种 View 之间进行选择: 自上而下(树) 自上而
对于一个可能是菜鸟的问题,我们深表歉意,但尽管在 SO 上研究了大量教程和其他问题,但仍找不到答案。 我想做的很简单:显示一个包含大量数据库存储字符串的 Android ListView。我所说的“很
我已经开始了一个新元素的工作,并决定给 Foundation 5 一个 bash,看看它是什么样的。在创建带有水平字段的表单时,我在文档中注意到的第一件事是它们使用大量 div 来设置样式。所以我在下
我有一个 Windows 窗体用户控件,其中包含一个使用 BeginInvoke 委托(delegate)调用从单独线程更新的第 3 方图像显示控件。 在繁重的 CPU 负载下,UI 会锁定。当我附加
我有一堆严重依赖dom元素的JS代码。我目前使用的测试解决方案依赖于 Selenium ,但 AFAIK 无法正确评估 js 错误(addScript 错误不会导致您的测试失败,而 getEval 会
我正在制作一款基于滚动 2D map /图 block 的游戏。每个图 block (存储为图 block [21][11] - 每个 map 总共 231 个图 block )最多可以包含 21 个
考虑到以下情况,我是前端初学者: 某个 HTML 页面应该包含一个沉重的图像(例如 - 动画 gif),但我不想强制客户缓慢地等待它完全下载才能享受一个漂亮的页面,而是我更愿意给他看一个轻量级图像(例
我正在设计一个小软件,其中包括: 在互联网上获取资源, 一些用户交互(资源的快速编辑), 一些处理。 我想使用许多资源(它们都列在列表中)来这样做。每个都独立于其他。由于编辑部分很累,我想让用户(可能
我想比较两个理论场景。为了问题的目的,我简化了案例。但基本上它是您典型的生产者消费者场景。 (我关注的是消费者)。 我有一个很大的Queue dataQueue我必须将其传输给多个客户端。 那么让我们
我有一个二元分类问题,标签 0 和 1(少数)存在巨大不平衡。由于测试集带有标签 1 的行太少,因此我将训练测试设置为至少 70-30 或 60-40,因此仍然有重要的观察结果。由于我没有过多地衡量准
我是一名优秀的程序员,十分优秀!