2

在我的应用程序中,我记录了数据库中的所有页面视图,在 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。我如何检查这些链接是否真实。

我收到的许多请求来自同一域上的先前网站,Cake 认为是控制器的 /images 请求等。

我不介意检查是在进入数据库之前还是在视图中从数据库中检索之后进行。

谢谢!

4

3 回答 3

1

我自己没试过,但你可以试试打电话Router::parse()

您提供完整的 URL,返回值将是 cake 的路由数组,您可以在其中看到控制器、动作等的值。

于 2012-06-04T14:22:03.640 回答
0

更新 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 首先会为你做这件事。

NotFoundException()在生产模式下(即 debug=0),CakePHP 将为任何未定义的控制器和/或动作抛出一个。

在开发模式下,CakePHP 可以给您更明确的信息。

所以请尝试Configure::write('debug',0);core.php

希望这可以帮助 !

于 2012-06-04T14:30:30.703 回答
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']);
于 2015-01-15T08:03:23.310 回答