Respect / Rest uri部分对应于控制器名称

时间:2014-04-09 14:22:21

标签: php router

我试图在现有的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

我喜欢前锋和工厂方法......我还不能决定。

1 个答案:

答案 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');
    }
);