Symfony CLI中的空转储()输出

时间:2017-05-10 15:06:00

标签: php symfony command-line-interface

我正在构建一个简单的 Symfony-shell 脚本,以便在交互模式下测试我的Symfony应用

# bin/app_dev_cli.php

require __DIR__.'/../app/autoload.php';

$kernel = new AppKernel('dev', true);
// Initialize bundles and container
$kernel->boot();

// Useful global vars
$container = $kernel->getContainer();
$doctrine = $container->get('doctrine');
$em = $doctrine->getManager();

稍后,打开PHP 交互模式并包含上一个脚本我可以快速完成一些任务:

/path/to/symfony/project$ php -a
Interactive mode enabled

# Booting the Symfony-shell app
php > require 'bin/app_dev_cli.php';

# Check if one service has been registered successfully
php > dump( $container->has('some_service') );

# Test some service
php > dump( $container->get('some_service')->run($param) );

# Manage some entities and DB data flow
php > $apple = new AppBundle\Entity\Fruit('Apple');
php > $em->persist($apple);
php > $em->flush();

php > dump( $em->getRepository('AppBundle\Entity\Fluit')->findAll() );

# etc.

问题在这里 dump()函数没有显示任何内容。我希望有一个彩色的命令行输出,但我尝试使用echovar_dump()显示预期值,但对于对象,主要是输出密集且不可读。在这方面VarDumper Component documentation说:

  

默认情况下,输出格式和目标是根据您当前的PHP SAPI [...]选择的。     *在命令行(CLI SAPI)上,输出写在STDOUT上。 [...]

默认情况下我没有为我工作,我确信PHP_SAPIcli。此外,I found a workarounddebug.dump_destination设置为php://stderr,但是:

# php interactive mode:
php > dump("test");
hp shell code on line 1: // <---- show the code line always
"test"

我不喜欢这个输出,也没有为此目的更改配置。

dump()函数发生了什么以及为什么没有显示任何内容有任何疑问?谢谢。

1 个答案:

答案 0 :(得分:5)

出于某种原因,看起来你要做的事实上就是将特定处理程序注入VarDumper

因此条件null === self::$handler在该类代码的以下再现片段中始终为false,因此,未设置'cli' === PHP_SAPI所需的转储器。

public static function dump($var)
{

    if (null === self::$handler) {
    /**       ^--- this one       **/
        $cloner = new VarCloner();
        $dumper = 'cli' === PHP_SAPI ? new CliDumper() : new HtmlDumper();
        self::$handler = function ($var) use ($cloner, $dumper) {
            $dumper->dump($cloner->cloneVar($var));
        };
    }
    return call_user_func(self::$handler, $var);
}

来源:Symfony/Component/VarDumper/VarDumper.php

现在,了解这一点,您的解决方案就像将VarDumper的处理程序设置回null

一样简单

工作代码:

# bin/app_dev_cli.php
<?php
use Symfony\Component\VarDumper\VarDumper;

require __DIR__.'/../app/autoload.php';

$kernel = new AppKernel('dev', true);
$kernel->boot();

/** This line (plus the use statement on top) does what you want **/
VarDumper::setHandler(null);

// Useful global vars
$container = $kernel->getContainer();
$doctrine = $container->get('doctrine');
$em = $doctrine->getManager();

运行时:

$ php -a
Interactive shell

php > require 'bin/app_dev_cli.php';
# bin/app_dev_cli.php 
php > dump('hi'); 
"hi"