【问题标题】:Create a manual symfony 2 request and response object from a command从命令创建手动 symfony 2 请求和响应对象
【发布时间】:2016-06-16 07:57:55
【问题描述】:

我正在尝试编写一个 symfony 2 命令,它基本上可以读取多个路由(通过 yml 文件或通过参数),并且可以获取每个页面的响应,以便我可以报告是否他们以 200/404/502 等形式返回。 路由是相对的,因此诸如“/”和“/news”之类的路由也是如此。

似乎无法弄清楚如何发送这些请求以获得真正的响应,我可以使用 Request::create() 来创建请求,但这似乎并不符合我的要求。

我是否必须通过内核,即使它是一个命令?任何帮助将不胜感激。

到目前为止我所拥有的:

$request = Request::create('/news', 'GET');
$response = new Response();
$response->prepare($request);
$res = $response->send();
var_dump($res->getContent());

这总是返回一个空字符串。

还尝试了以下方法:

$client = new Client(
    new HttpKernel(new EventDispatcher(), new ControllerResolver())
);
$client->request('GET', '/news');
var_dump($client->getResponse());

返回一个路由配置错误的错误

谢谢 凯文

【问题讨论】:

标签: php symfony


【解决方案1】:

根据your comment

基本上我测试代码库以确保在我将其发布给公众之前它的所有设置都正常,所以我想模拟客户端对代码的请求并确保我得到 200 响应,如果 404 回来了我知道有问题所以暂停发布。

test 很容易做到这一点:

<?php
// tests/AppBundle/Controller/PostControllerTest.php
namespace Tests\AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class PostControllerTest extends WebTestCase
{
    public function testNews()
    {
        $client = static::createClient();

        $crawler = $client->request('GET', '/news');

        // Assert a specific 200 status code
        $this->assertEquals(
            200, // or Symfony\Component\HttpFoundation\Response::HTTP_OK
            $client->getResponse()->getStatusCode()
        );
    }
}

你还需要安装 PHPUnit:

composer require --dev "phpunit/phpunit=5.4.*"

然后您可以启动测试:

php ./vendor/bin/phpunit -c app/phpunit.xml.dist

你会得到这样的结果:

PHPUnit 5.4.6 by Sebastian Bergmann and contributors.

.....................                                             21 / 21 (100%)

Time: 5.29 seconds, Memory: 58.00MB

OK (21 tests, 149 assertions)

【讨论】:

  • 除了它需要通过命令可用,因为这就是我们需要能够运行它的方式。
  • @Kevin 测试由命令行通过 PHPUnit 启动。我已经编辑了我的问题以便解释它。
【解决方案2】:

最好的方法是使用 http 客户端,将创建请求对象、执行请求并返回响应的责任转移给该客户端。

最常用的一个是 guzzle http 客户端 (http://docs.guzzlephp.org/en/latest/)

因此,在您的命令中,您可以从容器中获取路由器,为其生成 url,然后使用 guzzle 客户端执行请求。

在 cmets 之后编辑:

要达到执行请求而不实际运行服务器的目标,您可以使用 \Symfony\Bundle\FrameworkBundle\Client 对象,该对象使用内核来执行请求-响应(您当然必须注入您的当前内核命令)。和 WebTestCase 类差不多。

http://api.symfony.com/2.8/Symfony/Bundle/FrameworkBundle/Client.html

希望这会有所帮助! (稍后我会更新一些代码)

【讨论】:

  • 我需要使用相对路径,所以 /news 而不是 www.website.com/news 可以解决这个问题吗?能举个简单的例子吗?
  • 基本上我在测试代码库以确保在我将其发布给公众之前所有设置都正常,所以我想模拟客户端对代码的请求并确保我得到 200 响应,如果一个 404 回来了,然后我知道有问题所以暂停发布。我不能使用完整的 URL,因为这将是启动并运行的主站点的 URL,我需要使用相对的,以便它使用我当前所在的代码库。希望这是有道理的。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-08
  • 2013-06-14
  • 2013-09-18
  • 2017-04-09
相关资源
最近更新 更多