我为我的应用程序创建了一个插件(使用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)?或者有更好的方法可以整齐地扩展我的主要应用程序吗?我是以错误的方式解决这个问题吗?
答案 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虽然是另一回事。
也许其他人使用过这个或者知道更好的解决方案?