php

时间:2015-11-07 21:09:24

标签: php routes slim silex

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

例如,如果有人使用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路由功能来实现我的API到Silex路由功能?

非常感谢。

1 个答案:

答案 0 :(得分:0)

尽快给出一个快速的方式,我看到它有3种选择:

重构控制器对命名函数的闭包

SilexSlim [1]都可以使用任何形式的可调用,所以不要传递一个闭包只传递函数名(或带有类名,方法名的数组)或任何形式其他callable。通过1声明,您可以从Slim和Silex中调用它(是的,您必须在两侧定义路线)。

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

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

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

在Silex中定义路线并在里面设置Slim APP来调用并返回

您需要在Silex中再次定义api路由,并且在每条路线中,您可以尝试设置Slim APP(使用require "path/to/the/slim/app/php/file.php")然后force the run method with the silent option on [2] < / p>

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

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

我能想到的最简单(?)方式是重新定义第二个选项,并通过创建一个检查{{3的Silex中间件来创建捕获所有传入请求到/ api / mount点如果请求在请求中包含/ api / string。然后,您只需将请求发送到Slim应用程序,就像我在第二个选项中告诉您的那样。

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

注意

在所有情况下,您可能需要将从Slim给出的响应转换为for each incoming request。 Slim 3使用新的PSR-7 HTTP接口,因此您拥有Symfony response。 Slim 2直接回应响应,因此您需要捕获并将其置于Symfony响应中(new Response(ob_get_clean())

[1]这是针对Slim3,Slim2也可以做到这一点,但我不确定(并且签名不同!)

[2]再次这是针对Slim3,Slim2没有这个选项,所以你需要找一些东西来得到答案(也许solution here already?)