cakephp routes修改控制器名称/获取控制器名称

时间:2011-12-23 14:10:19

标签: cakephp controller routes renaming

我创建了一条与此类似的路线:

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应该只使用修改后的控制器名称!

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

2 个答案:

答案 0 :(得分:5)

您可以在指定路线时使用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

答案 1 :(得分:1)

也许您需要的是路由器前缀。

转到core.php并添加以下行:

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

并且全部......你不需要添加路由..所以现在www.example.com/backend/settings/add将在设置控制器中查找名为backend_add()的方法

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

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

希望这会有所帮助