所以我开始将我们网站的管理面板作为插件。我可以将每个请求(例如domain.com/admin或domain.com/admin/users或domain.com/admin/pages/edit/5)重定向到管理插件中的相应控制器和操作。 像这样:
Router::connect('/admin', array('plugin' => 'admin', 'controller' => 'index', 'action' => 'index'));
Router::connect('/admin/users/list', array('plugin' => 'admin', 'controller' => 'users', 'action' => 'list'));
但是这意味着我必须为几乎每个URL写单独的路由???或者实际上 - 对于每个动作......那么 - 有没有办法在全球范围内设置它? ......
例如:
Router::connect('/admin/users/*', array('plugin' => 'admin', 'controller' => 'users'));
甚至更好:
Router::connect('/admin/*', array('plugin' => 'admin'));
因为最后两个例子根本不起作用......
编辑:CakePHP版本是目前最新版本 - 2.4.1。答案 0 :(得分:1)
通常你不必为插件创建这样的路由,基本映射开箱即用,即如果你的插件名为admin
,那么/admin/users/list
将自动映射到插件{ {1}},控制器admin
,操作users
。
例外是您的list
路由,默认情况下会在/admin
上查找index
。因此,要在AdminController
上映射到index
,您需要一个自定义路线,例如您问题中的路线:
IndexController
除此之外,它应该可以正常工作,以防您没有任何其他先前的规则来覆盖默认行为,例如Router::connect('/admin', array('plugin' => 'admin', 'controller' => 'index', 'action' => 'index'));
。如果是这样的规则并且您无法更改它们,那么这就是您可以连接插件的基本路线的方法:
Router::connect('/*', ...)
请注意,这需要在之前放置覆盖默认行为的其他路由!
另见http://book.cakephp.org/2.0/en/development/routing.html
在旁注中,Router::connect('/admin/:controller/:action/*', array('plugin' => 'admin'));
Router::connect('/admin/:controller/*', array('plugin' => 'admin', 'action' => 'index'));
Router::connect('/admin/*', array('plugin' => 'admin', 'controller' => 'index', 'action' => 'index'));
作为操作名称可能不起作用,这会导致解析器错误,因为list
是reserved keyword。因此,如果您希望在URL中使用list
作为操作名称,那么这不仅仅是一个示例,您还需要额外的路由。