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()
?)
理论上是否可以使用更多服务进行路由?
例如,如果有人使用 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()
?)