尊重/休息uri部分对应于控制器名称


Respect/Rest uri part corresponds to controller name

我正在尝试在我现有的CMS中实现尊重/休息。

问题:我想创建一个单一的魔术路线,工作方式如下:/admin/*/save,调用*控制器。。。

我想做这样的东西:

$r->any('/admin/*/save/*/', function($controller, $id = null) use ($r) {
  return $r->dispatchClass($controller,array($id));
});

请注意,我不知道用户使用的是哪种HTTP方法。

事实上,我用这样的东西"解决"了这个问题

$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

Alganet:管理路由的引导程序可以在以下位置找到:https://github.com/dindigital/skeleton/blob/master/admin_routes.php

一个简单的控制器示例:https://github.com/dindigital/skeleton/blob/master/src/app/admin/controllers/TagController.phphttps://github.com/dindigital/skeleton/blob/master/src/app/admin/controllers/TagSaveController.php

我喜欢Forwards和Factory方法。。。我还不能决定。

小问题!这在很大程度上取决于为什么要使这些路线动态化。你能给我们看一些控制器的样本结构吗?这样我就可以改进答案了?

同时,有两个本地功能可以提供帮助:

转发

您可以将该问题视为内部转发(不进行重定向)。通常重定向到其他静态路由,但也可以重定向到新路由:

$r->any(
    '/admin/*/save/*/', 
    function ($controller, $id) use ($tcn, $r) {
        return $r->any(
            "/admin/$controller/save", 
            $tcn($controller . '_save'),
            array($id)
        );
    }
);

工厂路线

此外,尊重''休息实施工厂路线。它是实验性的,但在测试中稳定:

$r->factoryRoute(
    'ANY',
    '/admin/*/save/*/', 
    'MyAbstractController',
    function ($method, array $params) use ($tcn) {
        return new $tcn($params[0] . '_save');
    }
);