我试图在现有的CMS中实施尊重/休息。
问题: 我想创建一个单独的魔术路线,如:/ admin / * / save,调用* controller ...
我想做这样的事情:
$r->any('/admin/*/save/*/', function($controller, $id = null) use ($r) {
return $r->dispatchClass($controller,array($id));
});
请注意,我不知道用户正在使用哪种HTTP方法。
实际上我已经解决了#34;这个问题有:
$r->any('/admin/*/save/*/', function($controller, $id = null) use ($tcn) {
$r = new Router;
$r->any('/admin/*/save/*/', $tcn($controller . '_save'), array($id));
return $r->run();
});
$ tcn是一个命名函数,它返回控制器的完整命名空间。
我知道这不是一个好方法。
修改
这个项目想成为开源,但它仍然在创建。 我们正在尝试将基于功能范例的旧项目传输到OOP。 我们正在努力学习OOP,同时制作一个有用的项目。 可以在https://github.com/dindigital/skeleton
找到文件的Actuall状态Alganet:管理员路线的引导程序位于:https://github.com/dindigital/skeleton/blob/master/admin_routes.php
一个简单的控制器示例:https://github.com/dindigital/skeleton/blob/master/src/app/admin/controllers/TagController.php https://github.com/dindigital/skeleton/blob/master/src/app/admin/controllers/TagSaveController.php
我喜欢前锋和工厂方法......我还不能决定。
答案 0 :(得分:1)
棘手的问题!这取决于很多为什么你让这些路线变得动态。你能告诉我们你的控制器的一些样例结构吗?我可以改进答案吗?
同时,两个可以提供帮助的原生功能:
您可以将问题视为内部转发(不会重定向)。它通常会重定向到其他静态路由,但您也可以重定向到新路由:
$r->any(
'/admin/*/save/*/',
function ($controller, $id) use ($tcn, $r) {
return $r->any(
"/admin/$controller/save",
$tcn($controller . '_save'),
array($id)
);
}
);
此外,Respect \ Rest实现工厂路线。它是实验性的,但在测试中是稳定的:
$r->factoryRoute(
'ANY',
'/admin/*/save/*/',
'MyAbstractController',
function ($method, array $params) use ($tcn) {
return new $tcn($params[0] . '_save');
}
);