从命令创建手动Symfony 2请求和响应对象



我正在尝试编写一个Symfony 2命令,该命令基本上可以在多个路由(通过YML文件或通过参数)中读取,并且可以进行并获取每个路线的响应这些页面,所以我可以报告它们是否回到200/404/502等。路线是相对的,因此诸如'/'and'/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());

带有路由的返回的是错误配置的错误

谢谢凯文

根据您的评论:

基本上是IM测试代码库,以确保其全部设置在我向公众发布之前,因此我想模拟客户端请求到代码,并确保我得到200个响应,如果404又回来了我知道有一个问题,所以要暂停发布。

这很容易通过测试:

<?php
// tests/AppBundle/Controller/PostControllerTest.php
namespace TestsAppBundleController;
use SymfonyBundleFrameworkBundleTestWebTestCase;
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 SymfonyComponentHttpFoundationResponse::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)

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

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

因此,在您的命令中,您可以从容器中获取路由器,为此生成URL,然后使用Guzzle Client执行请求。

评论后编辑:

要达到该目标以执行请求而不实际运行服务器,您可以使用 Symfony Bundle frameworkbundle client client对象,该 client对象使用内核来执行请求响应(当然,您可以注入您的当前内核命令)。几乎就像WebTestcase类一样。

http://api.symfony.com/2.8/symfony/bundle/frameworkbundle/client.html

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

最新更新