插件路由到前缀控制器

时间:2015-01-07 17:59:45

标签: cakephp plugins controller routing naming

我为我的应用程序创建了一个插件(使用CakePHP 2.6.0),允许用户使用与管理区域相同的模型登录用户区域,所以我试图获取与管理区域相同类型的URI方案,例如/admin/users/login/special/users/login。我在我的插件的Config / routes.php中有以下路线,并添加了'特殊' ' Routing.prefixes'的前缀配置:

Router::connect('/special/:controller/:action', array(
    'special' => true,
    'prefix' => 'special',
    'plugin' => 'Special',
    'controller' => ':controller',
    'action' => ':action',
));

使用上面的路径并输入以下网址/special/users/login如果Cake转到Plugin/Controller/SpecialUsersController.php(考虑命名空间与主应用程序的用户控制器冲突),那对我来说是有意义的,而是我得到错误Error: Create the class UsersController

是否有内置的方法来加载基于插件的前缀控制器(不更改URL)?或者有更好的方法可以整齐地扩展我的主要应用程序吗?我是以错误的方式解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

我找不到内置的工作方式,所以我改变了使用我的应用程序的Routing/Route/文件夹中的自定义路由类解析URL字符串的方式:

App::uses('CakeRoute', 'Routing/Route');

/**
 * Plugin route will make sure plugin routes get
 * redirected to a prefixed controller.
 */
class PluginRoute extends CakeRoute {

    /**
     * Parses a string URL into an array.
     *
     * @param string $url The URL to parse
     * @return bool False on failure
     */
    public function parse($url) {
        $params = parent::parse($url);

        if($params && !empty($params['controller']) && !empty($params['plugin'])) {
            $params['controller'] = $params['plugin'] . ucfirst($params['controller']);
        }

        return $params;
    }

}

然后将我的插件路由设置为:

App::uses('PluginRoute', 'Routing/Route');

Router::connect('/special/:controller/:action', array(
    'special' => true,
    'prefix' => 'special',
    'plugin' => 'Special',
    'controller' => ':controller',
    'action' => ':action',
), array(
    'routeClass' => 'PluginRoute'
));

这导致/special/users/login创建了我想要的控制器Plugin/Controller/SpecialUsersController.php,到目前为止没有任何副作用。扩展主应用程序的UsersController虽然是另一回事。

也许其他人使用过这个或者知道更好的解决方案?