php 中的更多路线服务

More route services in php

理论上是否可以使用更多服务进行路由?

例如,如果有人使用 Silex 并拥有此代码:

$app = new Silex\Application();

$app->get('/test/{id}', function ($id) {
    // ...
});

$app->run();

然后我像那样使用 Slim 创建 api:

$app = new \Slim\Slim();

$app->get('/api/' . $version . 'something', function () use ($app){
        $data = $app->request->params();
    });

$app->run();

用户如何在不将 Slim 路由功能重写为 Silex 路由功能的情况下实现我的 API?

非常感谢。

虽然快速给出,但我认为您有 3 个选项:

将控制器闭包重构为命名函数

两者,Silex and Slim[1] can use any form of callable, so instead of passing a closure just pass a function name (or an array with class name, method name) or any other callable。这样,通过 1 个声明,您就可以从 Slim 和 Silex 调用它(是的,您必须在两侧定义路由)。

这有其缺点,因为 2 个框架的控制器签名不同,因此您需要连接到 silex 流并更改参数(您有 Kernel.controller 事件来执行此操作)。

此外,您还需要重新定义所有服务并明智地使用容器(即不要将其用作控制器中的服务定位器)。

这可能是最不灵活的方式了。

在Silex中定义路由并在里面实例化一个Slim APP来调用return那个

您需要在 Silex 中再次定义 api 路由,并且在每条路由中您可以尝试实例化 Slim APP(使用某些东西作为 require "path/to/the/slim/app/php/file.php"),然后 force the run method with the silent option on [2]

您可能需要稍微重构您的 Slim 应用程序,您必须在一个文件中定义您的应用程序并在另一个文件中调用 run 方法。

创建一个 Silex 中间件来处理所有 /api/ 调用

我能想到的最简单(?)的方法是重新定义第二个选项并创建一个 catch all 传入请求到 /api/ 挂载点创建一个 Silex 中间件,检查 for each incoming request 请求中是否包含 /api/ 字符串。然后你只需像我在第二个选项中告诉你的那样将请求转发给 Slim 应用程序。

使用此方法,您无需在 Silex 中重新定义路由,因为 /api/ 点下的所有内容都将转发到 Slim 应用程序。

注意

在所有情况下,您可能需要将 Slim 给出的响应转换为 Symfony response. Slim 3 uses the new PSR-7 HTTP interface so you have a solution here already。 Slim 2 直接回显响应,因此您需要捕获它并将其放入 Symfony 响应中(new Response(ob_get_clean())


[1] 这是针对 Slim3 的,Slim2 也可以,但我不确定(而且签名不同!)

[2] 同样,这是针对 Slim3 的,Slim2 没有此选项,因此您需要想办法获得响应(也许 ob_get_clean()?)