Php Symfony CLI中的空转储()输出

Php Symfony CLI中的空转储()输出,php,symfony,command-line-interface,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 = $kerne

我正在构建一个简单的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()
不显示任何内容。我希望有一个彩色的命令行输出,但是我用
echo
var\u dump()
尝试了这一点,它可以工作,但对于对象来说,主要是密集的、不可读的输出。在这个方向上,报告说:

默认情况下,输出格式和目标是基于当前PHP SAPI[…]选择的 *在命令行(CLI SAPI)上,输出写入标准输出。[……]

默认情况下,这对我不起作用,我确信
PHP\u SAPI
cli
。此外,将
debug.dump_destination
设置为
php://stderr
,但:

# php interactive mode:
php > dump("test");
hp shell code on line 1: // <---- show the code line always
"test"
#php交互模式:
php>dump(“测试”);

第1行的hp shell代码://出于某种原因,您试图做的似乎是将特定的处理程序注入到
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);
}
资料来源:

现在,知道了这一点,您的解决方案就像将
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();

好吧,似乎所有的罪魁祸首都是
DebugBundle
,他首先注入了他的处理程序。在
prod
env
VarDumper::setHandler(null)
是不必要的:)中,在从3.4迁移到4.4之后,添加缺少的文件“package/debug.yaml”,其中包含php://stderr 选项可以解决问题
$ php -a
Interactive shell

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