PHP 全域性使用 Laravel 輔助函式 dd

JokerLinly發表於2017-06-26

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

Stay Hungry, Stay Foolish.

相關文章