【发布时间】:2016-11-24 20:43:46
【问题描述】:
我正在尝试在他们的图形 api 上重现 facebook batch requests 函数的行为。
所以我认为最简单的解决方案是在控制器上向我的应用程序发出多个请求,例如:
public function batchAction (Request $request)
{
$requests = $request->all();
$responses = [];
foreach ($requests as $req) {
$response = $this->get('some_http_client')
->request($req['method'],$req['relative_url'],$req['options']);
$responses[] = [
'method' => $req['method'],
'url' => $req['url'],
'code' => $response->getCode(),
'headers' => $response->getHeaders(),
'body' => $response->getContent()
]
}
return new JsonResponse($responses)
}
因此,使用此解决方案,我认为我的功能测试将是绿色的。
但是,我喜欢初始化服务容器 X 次可能会使应用程序变慢。因为对于每个请求,都会构建每个捆绑包,每次都重新构建服务容器等等......
对于我的问题,您还有其他解决方案吗?
换句话说,我是否需要向我的服务器发出完整的新 HTTP 请求才能从我的应用程序中的其他控制器获得响应?
提前感谢您的建议!
【问题讨论】:
-
我认为使用 Controller 进行批量操作不是一个好习惯。
-
你应该更喜欢 "Symfony 命令" : symfony.com/doc/current/console.html / "Symfony 应用程序" : symfony.com/doc/current/components/console/… 和 GuzzleClient : docs.guzzlephp.org/en/latest
-
感谢您的建议。我查看了控制台解决方案,但我认为它不适合我的用例,因为我的端点已经在控制器中定义,来自 routing.yml 文件。因此,为了使用命令,我认为我需要将所有控制器重写为命令,并以某种方式将路由与命令链接起来,我仍然需要用命令输出来响应。有了这个解决方案,我还关心严格的请求信息,如标头、cookie 等......
-
但是,这与我想要做的非常接近:symfony.com/doc/current/console/calling_commands.html,除了这是用于控制台而不是控制器。这行很有趣:
$command = $this->getApplication()->find('demo:greet');,实际上我需要类似的东西:$response = $this->getApplication()->getResponseFrom('/api/some-endpoint');,就像 awesome
标签: symfony