调度程序过滤器,在配置定义为类名时,应该扩展类DispatcherFilter提供路由CakePHP的目录。让我们创建一个简单的滤波器响应特定的URL文本“Hello World”:
如前所述,当您只能使用过滤器类定义的顺序运行使用美元的优先级属性在类,默认值是10,如果属性声明,这意味着它将执行_after_路由器类解析请求。我们不希望这样的事情发生在我们的前面的例子,因为很可能你没有任何控制器设置为回答这个URL,因此我们选择9作为我们的首要任务。
DispatcherFilter暴露两种方法,可以在子类覆盖,它们beforeDispatch afterDispatch,执行之前或之后任何控制器分别执行。两种方法获得CakeEvent对象包含请求和响应对象(CakeRequest和CakeResponse实例)连同additionalParams数组内的数据属性。后者包含用于内部调度当调用requestAction信息。
在我们的例子中,我们有条件地返回$响应对象结果,这将告诉调度员没有实例化控制器和立即响应等对象返回给客户机。我们还增加了$事件- > stopPropagation()来防止其他过滤器后执行。
现在让我们创建另一个过滤器改变响应标头在任何公共页面,在我们的案例中是什么PagesController服务:
这个过滤器将过期标头在未来1天产生的所有响应页面控制器。当然你可以做同样的控制器,这只是一个例子与过滤器能够做些什么。例如,而不是改变你可以缓存它使用缓存的响应类和服务的响应beforeDispatch回调。
App::uses('DispatcherFilter', 'Routing');
class HelloWorldFilter extends DispatcherFilter {
public $priority = 9;
public function beforeDispatch(CakeEvent $event) {
$request = $event->data['request'];
$response = $event->data['response'];
if ($request->url === 'hello-world') {
$response->body('Hello World');
$event->stopPropagation();
return $response;
}
}
}
这个类应该保存在一个文件app /路由/过滤器/ HelloWorldFilter。php和引导文件中配置根据它是如何在前一节中解释。这里有很多解释,让我们开始与美元的优先级值。
如前所述,当您只能使用过滤器类定义的顺序运行使用美元的优先级属性在类,默认值是10,如果属性声明,这意味着它将执行_after_路由器类解析请求。我们不希望这样的事情发生在我们的前面的例子,因为很可能你没有任何控制器设置为回答这个URL,因此我们选择9作为我们的首要任务。
DispatcherFilter暴露两种方法,可以在子类覆盖,它们beforeDispatch afterDispatch,执行之前或之后任何控制器分别执行。两种方法获得CakeEvent对象包含请求和响应对象(CakeRequest和CakeResponse实例)连同additionalParams数组内的数据属性。后者包含用于内部调度当调用requestAction信息。
在我们的例子中,我们有条件地返回$响应对象结果,这将告诉调度员没有实例化控制器和立即响应等对象返回给客户机。我们还增加了$事件- > stopPropagation()来防止其他过滤器后执行。
现在让我们创建另一个过滤器改变响应标头在任何公共页面,在我们的案例中是什么PagesController服务:
App::uses('DispatcherFilter', 'Routing');
class HttpCacheFilter extends DispatcherFilter {
public function afterDispatch(CakeEvent $event) {
$request = $event->data['request'];
$response = $event->data['response'];
if ($request->params['controller'] !== 'pages') {
return;
}
if ($response->statusCode() === 200) {
$response->sharable(true);
$response->expires(strtotime('+1 day'));
}
}
}
这个过滤器将过期标头在未来1天产生的所有响应页面控制器。当然你可以做同样的控制器,这只是一个例子与过滤器能够做些什么。例如,而不是改变你可以缓存它使用缓存的响应类和服务的响应beforeDispatch回调。