【问题标题】:Check for existing controller检查现有控制器
【发布时间】:2026-01-10 08:35:01
【问题描述】:

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

(例如,您可以创建一个名为“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, '|')
    )
);

现在我遇到了一个问题,当您创建一个与现有控制器(例如用户)匹配的页面时,它会覆盖用户控制器的路由。

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

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

【问题讨论】:

  • 我不确定,但您可能必须使用异常处理。 book.cakephp.org/2.0/en/development/… 。 MissingControllerException 是一个预定义的异常类,您可以在尝试访问不存在的控制器时使用它。
  • CakePHP 2.X 引入了一个包含 _loadController() 方法的新类“CakeRequest”。 api20.cakephp.org/class/…此链接可能对您有所帮助。

标签: cakephp routing


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这是我目前的验证方法:

    $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;
      }
    

    【讨论】: