有时候需要对请求进行过滤,cake php中实现如下:
首先,在src/Routing/Filter创建所需的过滤器TrackingCookieFilter .php(/src/Routing/Filter/TrackingCookieFilter .php),内容如下:
<?php
namespace App\Routing\Filter;
use Cake\Event\Event;
use Cake\Routing\DispatcherFilter;
class TrackingCookieFilter extends DispatcherFilter
{
public function beforeDispatch(Event $event)
{
$request = $event->getData('request');
$response = $event->getData('response');
if (!$request->getCookie('landing_page')) {
$response->cookie([
'name' => 'landing_page',
'value' => $request->here(),
'expire' => date('Y-m-d H:i:s', strtotime('+1 year +1 month +2 day', time())),
]);
/*echo '<BR>Before htracking cookie response:<BR>';
dd($response);*/
}
}
}
创建HttpCacheFilter.php,内容如下:
<?php
namespace App\Routing\Filter;
use Cake\Event\Event;
use Cake\Routing\DispatcherFilter;
class HttpCacheFilter extends DispatcherFilter
{
public function afterDispatch(Event $event)
{
$request = $event->getData('request');
$response = $event->getData('response');
if ($response->statusCode() === 200) {
$response->sharable(true);
$response->expires(strtotime('+1 day'));
}
}
}
要想使用这两个过滤器则需要在config/bootstrap.php文件中加入如下代码:
use Cake\Routing\DispatcherFactory;
DispatcherFactory::add('TrackingCookie');
DispatcherFactory::add('HttpCache');
如果想要对某一个路由生效可以在后面加参数for,如:
DispatcherFactory::add('HttpCache', ['for' => '/front/articles']);
则只会对/front/articles
路由生效。
如果想要对某一个前缀下的路由使用控制器只要将前缀加进去即可,如front
前缀:
DispatcherFactory::add('HttpCache', ['for' => '/front']);
这样的话访问/front/articles、/front/user还是其他路由中包含front前缀的路由都会使用过滤器。
加限制条件的应用
如果要加上额外的使用条件,如只对get请求使用过滤器:
DispatcherFactory::add('TrackingCookie', [
'when' => function ($request, $response) {
return $request->is('get');
}
这样其他类型(post、put、patch、delete等)请求则不会使用过滤器。
原文地址:https://book.cakephp.org/3.0/en/development/dispatch-filters.html#conditionally-applying-filters
Author:leedaning
本文地址:http://blog.csdn.net/leedaning/article/details/75635632