检查现有控制器

时间:2012-07-26 10:15:40

标签: cakephp routing

我为我的应用程序编写了静态页面组件,管理员可以动态添加/编辑/删除静态内容页面。这些都保存在数据库中。

(例如,你可以创建一个名为“about”的页面,可以在myapplication / about上访问它)

这是我对这些网页的路由:

$page = new StaticPage();
$slugs = $page->find('list', array(
    'fields' => array('slug'),
    'recursive' => -1,
    'order' => 'StaticPage.slug DESC',
));

Router::connect('/:slug', 
    array('controller' => 'static_pages', 'action' => 'display'),
    array(
        'pass' => array('slug'),
        'slug' => implode($slugs, '|')
    )
);

现在我遇到了问题,当你创建一个slug匹配现有控制器(例如用户)的页面时,它会将Route覆盖到UsersController。

所以我需要像黑名单或类似的东西:我开始写一个验证规则,我想检查该控制器是否存在。对于cake 1.3,有一个函数“loadController”返回false,如果控制器不存在,但对于cake 2.x,则没有这样的函数。我以某种方式错过了这个吗?它现在有新名称还是在实用程序库中?

或者有更好的方法来解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

你应该试试这个:http://www.cleverweb.nl/cakephp/list-all-controllers-in-cakephp-2/

通过获取所有控制器的列表,您可以轻松地排除控制器的名称

答案 1 :(得分:0)

这是我现在的验证方法:

$route = Router::parse($check['slug']);
$controllerName = Inflector::camelize($route['controller'] . 'Controller');

$aCtrlClasses = App::objects('controller');

  foreach ($aCtrlClasses as $controller) {
    if ($controller != 'AppController') {
      // Load the controller
      App::import('Controller', str_replace('Controller', '', $controller));

      // Load the ApplicationController (if there is one)
      App::import('Controller', 'AppController');
      $controllers[] = $controller;
    }
  }

  if (in_array($controllerName, $controllers)) {
    return false;
  } else {
    return true;
  }