从命令

时间:2016-06-16 07:57:55

标签: php symfony

我正在尝试编写一个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());

带有路由的错误配置错误

由于 凯文

2 个答案:

答案 0 :(得分:0)

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

其中最常用的是guzzle http客户端(http://docs.guzzlephp.org/en/latest/

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

评论后编辑:

要实现请求而不实际运行服务器,您可以使用\ Symfony \ Bundle \ FrameworkBundle \ Client对象使用内核执行请求 - 响应(您当然要注入您当前的内核)命令)。就像WebTestCase类一样。

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

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

答案 1 :(得分:0)

根据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)