PHP 全局使用 Laravel 辅助函数 dd

file
前段时间写过一篇 PHP 调试函数的对比 调试代码之 dd VS var_dump VS print_r ?,架不住口嫌体正,其中 Laravel 的辅助函数 dd() 一旦用上瘾了就很难戒了,经常会不自觉地在调试代码的时候用上它,然后就悲剧了。

file

之前有个人发表了一篇 在其他框架中使用 dump () & dd () 函数,讲如何在其他框架中使用 dd(),但这有个很麻烦的地方,就是每一个不是 Laravel 的项目你都得做这样的配置。甚至在团队开发中,很多情况下并不允许你提交可能只有你自己在使用的调试代码。

file

@cjjian 同学的博客里面有一篇 VarDumper高亮提示,里面有关于全局安装使用 composer 包的内容,灵机一动之下,我便心痒痒地就折腾起来了。

开始折腾

全局安装composer global require symfony/var-dumper

配置 php.ini

在 php.ini 中找到 auto_prepend_file,然后写上你相对应的路径,比如我的路径:

auto_prepend_file = /home/vagrant/.composer/vendor/autoload.php

不知道 php.ini 在哪?phpinfo() 一下你就知道~

更新 composercomposer global update

这样一来就可以使用 dump() 了。不过还不够,我们还要把 dd() 的代码放进来。

准备 dd()

找个地方复制以下代码(我直接命名成 laravel_helper.php

<?php

# install symfony/var-dump to your project
# composer require symfony/var-dumper

// use namespace
use Symfony\Component\VarDumper\Cloner\VarCloner;
use Symfony\Component\VarDumper\Dumper\CliDumper;
use Symfony\Component\VarDumper\Dumper\HtmlDumper as SymfonyHtmlDumper;

/**
 * Class HtmlDumper
 */
class HtmlDumper extends SymfonyHtmlDumper
{
    /**
     * Colour definitions for output.
     *
     * @var array
     */
    protected $styles = [
        'default' => 'background-color:#fff; color:#222; line-height:1.2em; font-weight:normal; font:12px Monaco, Consolas, monospace; word-wrap: break-word; white-space: pre-wrap; position:relative; z-index:100000',
        'num' => 'color:#a71d5d',
        'const' => 'color:#795da3',
        'str' => 'color:#df5000',
        'cchr' => 'color:#222',
        'note' => 'color:#a71d5d',
        'ref' => 'color:#a0a0a0',
        'public' => 'color:#795da3',
        'protected' => 'color:#795da3',
        'private' => 'color:#795da3',
        'meta' => 'color:#b729d9',
        'key' => 'color:#df5000',
        'index' => 'color:#a71d5d',
    ];
}

/**
 * Class Dumper
 */
class Dumper
{
    /**
     * Dump a value with elegance.
     *
     * @param  mixed  $value
     * @return void
     */
    public function dump($value)
    {
        if (class_exists(CliDumper::class)) {
            $dumper = 'cli' === PHP_SAPI ? new CliDumper : new HtmlDumper;
            $dumper->dump((new VarCloner)->cloneVar($value));
        } else {
            var_dump($value);
        }
    }
}

if (! function_exists('dd')) {
    /**
     * Dump the passed variables and end the script.
     *
     * @param  mixed
     * @return void
     */
    function dd(...$args)
    {
        foreach ($args as $x) {
            (new Dumper)->dump($x);
        }
        die(1);
    }
}

if (! function_exists('dda')) {
    /**
     * Dump the passed array variables and end the script.
     *
     * @param  mixed
     * @return void
     */
    function dda(...$args)
    {
        foreach ($args as $x) {
            (new Dumper)->dump($x->toArray());
        }
        die(1);
    }
}

记下这个文件的路径,比如我的是:/var/www/composer/laravel_helper.php

更改全局 composer.json

然后我们找到全局的 composer.json 所在的位置,通常在用户根目录下,在 autoload 中增加这个文件的路径:

{
  ....
    "require": {
        .....
        "symfony/var-dumper": "^3.3"
    },
    "autoload": {
        "files": [
                "/var/www/composer/laravel_helper.php"
        ]
    }
}

最后更新一下,就可以 dd 用起来了! :laughing:
composer global dump-autoload

Leo 大神的提醒:

symfony/var-dumper 这个扩展包只有一个依赖,但是如果哪天这个 polyfill-mbstring 升级到了2+,然后你的项目里依赖了 2+ 的 polyfill,而 var-dumper 没有跟上,可能就会造成问题。这种时候,记得把全局的更新一下就好了。

file

本作品采用《CC 协议》,转载必须注明作者和本文链接
Stay Hungry, Stay Foolish.
本帖由 Summer 于 6年前 加精
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 33
mouyong

:+1: :kissing_heart:

6年前 评论

非常棒!已经在使用。

6年前 评论

提几个小问题,如果集成在tp3.2框架的需要注意这两个函数了:

 Cannot redeclare dump();
 Cannot redeclare e();

由于tp3.2定义了这两个方法,并且tp并没有对这两个方法做判断存在处理,导致出现不能重新声明,但是symfony做了判断函数是否存在,为什么还会出现不能重新声明的问题呢?没错,php优先加载了symfony。

解决方法: 可以symfony注释掉这两个函数或者在tp框架里找到这个两个函数做个判断函数是否存在。

6年前 评论
DukeAnn

马上搞

6年前 评论
DukeAnn

win下 composer 位置
C:\Users\ADKi\AppData\Roaming\Composer\vendor\autoload.php

6年前 评论
DukeAnn

@JokerLinly 是的
php.ini auto_prepend_file = c:\Users\ADKi\AppData\Roaming\Composer\vendor\autoload.php

compser.json

"autoload": {
        "files": [
                "D:/WWW/dd.php"
        ]
    }

注意斜杠写法,还有PHP版本

6年前 评论
蔺焕然

TP中dump,也会上瘾的。

6年前 评论

@蔺焕然 哈哈,那就同理折腾呗~

6年前 评论
mouyong

突然心累的不知道怎么折腾 docker 和 windows 中这俩的环境搭配,:joy_cat: 感觉的来点决心再次将整个系统换成 linux ,不使用 docker 开发。偶尔的心累

6年前 评论

按照你的方法,操作了一遍,真是惊呆了,原来可以这么方便地在不更改项目代码的情况下这样调用。
有一个疑问:
composer global update
不是更新代码? 这里为啥需要这个操作

6年前 评论

auto_prepend_file = /home/vagrant/.composer/vendor/autoload.php

php.ini加上这一行代码,今天遇到一个大坑:

加上这一行之后,就会自动加载 ~/.composer/vendor/illuminate/support/helpers.php 这个helpers文件,这里面定义了很多function,假如这里laravel的版本是5.4, 那么,当我运行一个laravel5.1版本的项目时,由于

if (! function_exists('function_name')) {
     function function_name(){
     }
}

的缘故,导致我使用laravel5.1版本的项目,加载的还是5.4版本里面定义的function。自然就会出现不兼容报错的情况。
提醒大家注意这个问题哈。

ps:前面一条回复排版错乱,这里重发下。不知道怎么删除评论哈

6年前 评论
mouyong

如果有使用 docker 环境的童孩,不知道如何全局安装使用 dd ,可以参考这篇文章 PHP 全局使用 Laravel 辅助函数 dd (补充:docker 环境下全局使用)

6年前 评论

请教下问题。
我在composer.json中加了autoload那段以后,也执行了composer global dump-autoload 然后我发现我的是php5.3 不能用
然后我直接删了laravel_helper.php 接着我执行composer命令开始报错了 提示 laravel_helper.php不存在 这要如何修复(下图中的dd_helper.php 就是文章中的laravel_helper.php)

![Uploading file...]()

6年前 评论

@keer 你要是改了全局的 composer.json, 那你得改回来。也就是如果你不用这个功能,那文章中你所有的配置都要改过来吧。
这个方法我是用在其他框架上的,比如工作用的 Yii 框架,工作上使用的环境我用 vagrant 和本地环境隔离开,因此以上所有的操作都不会在本地进行。以防止其他版本的 Laravel 不能使用,评论区也有提及这方面的问题。

6年前 评论

厉害了,又可以快乐的调试数据了。

6年前 评论
mouyong

dd 函数渲染问题。

<?php

# install symfony/var-dump to your project
# composer require symfony/var-dumper

// use namespace
use Symfony\Component\VarDumper\Cloner\VarCloner;
use Symfony\Component\VarDumper\Dumper\CliDumper;
use Symfony\Component\VarDumper\Dumper\HtmlDumper as SymfonyHtmlDumper;

/**
 * Class HtmlDumper
 */
class HtmlDumper extends SymfonyHtmlDumper
{
    /**
     * Colour definitions for output.
     *
     * @var array
     */
    protected $styles = [
        'default' => 'background-color:#fff; color:#222; line-height:1.2em; font                                                                                                                                  -weight:normal; font:12px Monaco, Consolas, monospace; word-wrap: break-word; wh                                                                                                                                  ite-space: pre-wrap; position:relative; z-index:100000',
        'num' => 'color:#a71d5d',
        'const' => 'color:#795da3',
        'str' => 'color:#df5000',
        'cchr' => 'color:#222',
        'note' => 'color:#a71d5d',
        'ref' => 'color:#a0a0a0',
        'public' => 'color:#795da3',
        'protected' => 'color:#795da3',
        'private' => 'color:#795da3',
        'meta' => 'color:#b729d9',
        'key' => 'color:#df5000',
        'index' => 'color:#a71d5d',
    ];
}

/**
 * Class Dumper
 */
class Dumper
{
    /**
     * Dump a value with elegance.
     *
     * @param  mixed  $value
     * @return void
     */
    public function dump($value)
    {
        http_response_code(500);
        if (class_exists(CliDumper::class)) {
            $dumper = 'cli' === PHP_SAPI ? new CliDumper : new HtmlDumper;
            $dumper->dump((new VarCloner)->cloneVar($value));
        } else {
            var_dump($value);
        }
    }
}

if (! function_exists('dd')) {
    /**
     * Dump the passed variables and end the script.
     *
     * @param  mixed
     * @return void
     */
    function dd(...$args)
    {
        foreach ($args as $x) {
            (new Dumper)->dump($x);
        }
        die(1);
    }
}

if (! function_exists('dda')) {
    /**
     * Dump the passed array variables and end the script.
     *
     * @param  mixed
     * @return void
     */
    function dda(...$args)
    {
        foreach ($args as $x) {
            (new Dumper)->dump($x->toArray());
        }
        die(1);
    }
}
6年前 评论

@JokerLinly 出现错误Valet requires Homebrew to be installed on your Mac.

我试着取消php.ini的配置, 并重启valet 恢复正常

auto_prepend_file = /Users/ailuoy/.composer/vendor/autoload.php

我看你有遇到过这个错误地址,能告诉我下是什么怎么解决的么? :smile:

6年前 评论

@罗阳 我就把 php.ini 的更改恢复就好了,你可以试着重装 valet

6年前 评论

tips:通过 composer config -l -g 命令可以列出 composer 的全局配置信息,在这些信息中查找 [home] 配置项就是 composer 的主目录。
windows用户可以这样查找

5年前 评论
ShiKi

好文章~

5年前 评论

file 数据库错误查询打印,查询语句故意写错,打印了dd(), 中文错误显示乱码(数据库字符串存储GBK)

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!