在我的应用程序中,我记录了数据库中的所有页面浏览量,在AppController中如下所示:
$this->Link->save(array(
'controller' => $this->request->params['controller'],
'action' => $this->request->params['action'],
'var1' => $this->request->params['pass'][0],
'var2' => $this->request->params['pass'][1]
));
这工作正常,但人们(或机器人)输入的一些 URL 是 404。我如何检查这些链接是否真实。
我收到的许多请求都来自同一域上的先前网站,对/images 等的请求,Cake 认为是控制器。
我不介意检查是在进入数据库之前还是在视图中从数据库中检索之后进行。
谢谢!
我自己还没有尝试过这个,但你可以试着打电话给Router::parse()
您提供完整的 URL,返回值将是 cabe 的路由数组,您可以在其中查看控制器、操作等的值。
更新 2:在调度之前捕获请求
可悲的是,以下代码段适用于 cakephp 2.2,如果您曾经升级过的话。 请参阅调度过滤器手册页
<?php
App::uses('DispatcherFilter', 'Routing');
class HttpCacheFilter extends DispatcherFilter {
public function beforeDispatch($event) {
$request = $event->data['request'];
if ($request->params['controller'] !== 'pages') {
die('not found');
}
}
}
原答案:
你不应该检查任何东西,因为Cakephp首先为你做。
在生产模式下(即debug=0),CakePHP 将为任何未定义的控制器和/或操作抛出NotFoundException()
。
在开发模式下,CakePHP 可以为您提供更明确的消息。
因此,请在core.php
中尝试Configure::write('debug',0);
希望这有帮助!
根据 http://www.cleverweb.nl/cakephp/list-all-controllers-in-cakephp-2/的见解,应该可以做到如下。
function check($controller, $action) {
$controller = Inflector::camelize($controller);
App::import('Controller', $controller.'Controller');
$aMethods = get_class_methods($controller.'Controller');
if($aMethods) {
foreach ($aMethods as $idx => $method) {
if($action==$method) return true;
}
} else {
//this is probably NOT a controller!
}
return false;
}
然后像下面这样调用它,在AppController中,也许在beforeFilter中:
$this->check($this->request->params['controller'], $this->request->params['action']);