【问题标题】:cakephp routes modify controllers name / fetching controllers namecakephp 路由修改控制器名称/获取控制器名称
【发布时间】:2011-12-23 14:10:19
【问题描述】:

我创建了一条类似于这条路线的路线:

Router::connect("/backend/:controller/:action/*");

现在我想将符合此模式的每个控制器路由到重命名为 backend_:controller 之类的东西。

不知何故:

Router::connect("/backend/:controller/:action/*", array('controller' => 'backend_:controller'));

示例:如果调用 URL www.example.com/backend/settings/myaction,它将路由到控制器“backend_settings”并调用操作“myaction”!

但另一方面,如果有人调用 www.example.com/settings,它会路由到控制器“设置”。

URL 应该保持它被调用的方式,cakePHP 应该只使用修改后的控制器名称!

我希望有人能指出我应该用于解决这个问题的最佳解决方案。提前致谢!

【问题讨论】:

    标签: cakephp controller routes renaming


    【解决方案1】:

    您可以在指定路由时使用routeClass 属性,并使用自定义路由类。

    这是我对 CakeRoute 类的实现,它完全符合您的描述(将控制器前缀附加到您的控制器):

    // ControllerPrefixRoute.php file in app/Routing/Route/
    
    App::uses('CakeRoute', 'Routing/Route');
    
    class ControllerPrefixRoute extends CakeRoute {
    
        /**
         * Parses a string url into an array. If a controller_prefix key is found it will be appended to the
         * controller parameter
         *
         * @param string $url The url to parse
         * @return mixed false on failure, or an array of request parameters
         */
        public function parse($url) {
    
            $params = parent::parse($url);
    
            if (!$params) {
                return false;
            }
            $params['controller'] = $params['controller_prefix'].'_'.$params['controller'];
            return $params;
        }
    
    }
    

    下面是如何使用它:

    // inside routes.php file in app/Config/
    
    App::uses('ControllerPrefixRoute', 'Routing/Route');
    
    Router::connect("/:controller_prefix/:controller/:action/*", array(), array('routeClass' => 'ControllerPrefixRoute'));
    

    所以这个网址/backend/settings/myaction 将调用BackendSettingsController::myaction

    【讨论】:

      【解决方案2】:

      也许你需要一个路由器前缀。

      转到 core.php 并添加这一行:

      Configure::write('Routing.prefixes', array('backend'));
      

      仅此而已...您不需要添加路由...所以现在www.example.com/backend/settings/add 将在设置控制器中查找名为backend_add() 的方法

      www.example.com/settings/add 将调用设置控制器中名为add() 的方法

      here 你会找到更好的例子 =)

      希望对你有帮助

      【讨论】:

      • 感谢您的回答。我已经知道前缀。不幸的是,这不是我想要的,因为我想将后端控制器与前端控制器分开。使用前缀我会混合后端和前端方法。这里的问题是我的后端“主”控制器支持身份验证,所有处理后端的控制器都继承自这个主控制器,尤其是身份验证。前端控制器根本不应该处理身份验证。这就是为什么我想把他们分开!
      • 在我看来,您需要为控制器编写所有规则... o 也许您可以使用自己的类来路由后端 url book.cakephp.org/2.0/en/development/…
      猜你喜欢
      • 1970-01-01
      • 2013-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-01
      • 2019-07-23
      • 2014-12-15
      相关资源
      最近更新 更多