0

所以我开始将我们网站的管理面板制作成一个插件。而且我能够将每个请求(如 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。

4

1 回答 1

1

通常你不应该为插件创建这样的路由,基本映射是开箱即用的,即如果你的插件被命名admin,那么/admin/users/list将自动映射到插件admin、控制器users、动作list

一个例外是你的/admin路线,默认情况下这会寻找indexon AdminController。因此,要映射到indexon,IndexController您需要一条自定义路线,例如您的问题中的路线:

Router::connect('/admin', array('plugin' => 'admin', 'controller' => 'index', 'action' => 'index'));

除此之外,它应该按原样工作,以防您没有任何其他前面的规则会覆盖默认行为,Router::connect('/*', ...)例如。如果有这样的规则并且您无法更改它们,那么您可以通过以下方式连接插件的基本路由:

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'));

请注意,这需要放在覆盖默认行为的其他路由之前!

另见http://book.cakephp.org/2.0/en/development/routing.html

附带说明一下,list由于动作名称可能不起作用,这应该像 reserved keyword 一样引发list解析器错误。因此,如果这不仅仅是一个示例,如果您想/list在 URL 中用作操作名称,您将需要一个额外的路由。

于 2013-09-19T18:41:32.197 回答