如何检查控制器和动作是否确实存在?

时间:2012-06-04 13:16:03

标签: php cakephp cakephp-2.1

在我的应用程序中,我记录了数据库中的所有页面视图,类似于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]
));

工作正常,但人(或机器人)输入的某些网址是404。我如何检查这些链接是否真实。

我得到的很多请求来自同一个域名的先前网站,对Cake认为是控制器的/ images等请求。

我不介意在进入数据库之前或在视图中从数据库中检索之后检查是否发生。

谢谢!

3 个答案:

答案 0 :(得分:1)

我自己没试过,但您可以尝试拨打Router::parse()

您提供完整的URL,返回值为cake的路由数组,您可以在其中查看控制器,操作等的值。

答案 1 :(得分:0)

更新2:在发送之前捕获请求

可悲的是,如果你升级了,下面的代码就是cakephp 2.2。 see manual page for Dispatch Filters

<?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将为任何未定义的Controller和/或Action抛出NotFoundException()

在开发模式下,CakePHP足以为您提供更明确的信息。

因此,请在Configure::write('debug',0);

中试用core.php

希望这有帮助!

答案 2 :(得分: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']);