具有相同签名的多条Slim路由

具有相同签名的多条Slim路由,slim,slim-3,Slim,Slim 3,我们正在考虑使用Slim3作为API的框架。我已经搜索了SO和Slim文档,但找不到问题的答案。如果我们有不同的路由文件(例如v1、v2等),并且两条路由具有相同的签名,则会抛出错误。是否有任何方法级联路由,以便使用特定签名的最后加载路由 例如,假设v1.php有一个用于GET(“/test”)的路由,而v2.php也包含这个路由,我们可以使用最新版本吗?更简单的是,如果一个路由文件包含两个具有相同签名的路由,是否有使用后一种方法的方法(并且不会引发错误) 问了一个类似的问题,但这使用了钩子(已

我们正在考虑使用Slim3作为API的框架。我已经搜索了SO和Slim文档,但找不到问题的答案。如果我们有不同的路由文件(例如v1、v2等),并且两条路由具有相同的签名,则会抛出错误。是否有任何方法级联路由,以便使用特定签名的最后加载路由

例如,假设v1.php有一个用于
GET(“/test”)
的路由,而v2.php也包含这个路由,我们可以使用最新版本吗?更简单的是,如果一个路由文件包含两个具有相同签名的路由,是否有使用后一种方法的方法(并且不会引发错误)


问了一个类似的问题,但这使用了钩子(已根据从Slim 3中删除)

我查看了Slim代码,但没有找到允许重复路由的简单方法(防止异常)。 新的Slim将其用作依赖项。它调用
fastproute\simpleDispatcher
,不提供任何配置可能性。即使FastRoute允许一些配置,它也没有任何内置选项来允许复制路由。需要一个
数据生成器的自定义实现

但是按照上面的说明,我们可以通过向Slim应用程序传递一个定制的
路由器来获得一个定制的
数据生成器
,它实例化了一些
FastRoute::Dispatcher实现
,然后使用定制的
数据生成器

首先是
CustomDataGenerator
(让我们用简单的方法从和进行复制和粘贴)

然后自定义
路由器

class CustomRouter extends \Slim\Router {
    protected function createDispatcher() {
        return $this->dispatcher ?: \FastRoute\simpleDispatcher(function (\FastRoute\RouteCollector $r) {
            foreach ($this->getRoutes() as $route) {
                $r->addRoute($route->getMethods(), $route->getPattern(), $route->getIdentifier());
            }
        }, [
            'routeParser' => $this->routeParser,
            'dataGenerator' => new CustomDataGenerator()
        ]);
    }
}
最后用自定义路由器实例化Slim应用程序

$app = new \Slim\App(array(
    'router' => new CustomRouter()
));
如果检测到重复的路由,则上述代码将删除以前的路由并存储新路由


我希望我没有错过任何更简单的方法来实现这个结果。

这有什么用?为什么会有重复的路由?API可以有不同版本的签名。这是为了加载它们,然后只使“live”成为最新版本。实际上,两个具有相同签名的路由都会导致错误。为什么不只包括最新版本?还有许多自定义位置(可能会从早期文件中过度加载某些定义,但不是全部)
$app = new \Slim\App(array(
    'router' => new CustomRouter()
));