yce*_*uto 8 php command-line-interface symfony
我正在构建一个简单的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();
Run Code Online (Sandbox Code Playgroud)
稍后,打开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.
Run Code Online (Sandbox Code Playgroud)
这里的问题是该dump()功能没有显示任何内容.我期待一个彩色的命令行输出,但是我尝试了这个echo并向var_dump()我显示了预期的值,但对于对象,主要是输出密集且不可读.在这方面,VarDumper组件文档说:
默认情况下,输出格式和目标是根据您当前的PHP SAPI选择的[...]*在命令行(CLI SAPI)上,输出写在STDOUT上.[...]
默认情况下,这对我不起作用,我确信PHP_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"
Run Code Online (Sandbox Code Playgroud)
我不喜欢这个输出,也没有为此目的更改配置.
任何想法dump()功能发生了什么以及它为什么没有显示?谢谢.
出于某种原因,您似乎想做的实际上是将特定的处理程序依赖注入 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);
}
Run Code Online (Sandbox Code Playgroud)
来源:Symfony / Component / VarDumper / VarDumper.php
现在,知道了这一点,您的解决方案就像将backset的处理程序设置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();
Run Code Online (Sandbox Code Playgroud)
运行时:
$ php -a
Interactive shell
php > require 'bin/app_dev_cli.php';
# bin/app_dev_cli.php
php > dump('hi');
"hi"
Run Code Online (Sandbox Code Playgroud)