如何编写与 laravel 相同的自己的 DD() 函数?

Posted

技术标签:

【中文标题】如何编写与 laravel 相同的自己的 DD() 函数?【英文标题】:How to write own DD() function same as laravel? 【发布时间】:2017-05-30 20:52:42 【问题描述】:

我使用 laravel 很长一段时间,但目前我使用 wordpress。我喜欢使用 laravel 的 DD() 函数。 但是在wordpress中我只能使用这些,

   print_r(),
   var_dump(),
   var_export()....

这些都只是扩展整个数组对象。 但是我需要 laravel 的 expandclose 机制来处理数组和对象。 我使用以下作为一般 dd 需要,

if (!function_exists('dd')) 
 function dd()
  
      echo '<pre>';
      array_map(function($x) var_dump($x);, func_get_args());
      die;
   
 

效果很好,但我需要有样式且有条理的列表形式。

有可能吗?

【问题讨论】:

为什么要重新发明***? packagist.org/packages/symfony/var-dumper @RajenderJoshi 有时您需要橡胶轮胎而不是木头或石头制成的轮胎。 Laravel 仅将 varDumper 用于格式化 - 行为有点不同,因为在转储数据后不会停止执行。 @RajenderJoshi 在我的情况下,我需要 dd() 作为静态文件,而不是 Composer 包,否则旧应用程序会中断(因为它会多次调用自动加载器) 【参考方案1】:

Laravel 的 dd 使用 symfony 的 VarDump component。它提供了一个全局可用的dump 函数来格式化输出。唯一的区别是它不会在转储后“死掉”,您必须手动执行此操作 - 但在大多数情况下,这甚至不是您想要的。

    运行 composer global require symfony/var-dumper(假设您的 wordpress 项目中有 composer) 将auto_prepend_file = $HOME/.composer/vendor/autoload.php 添加到您的php.ini 文件中; 不时运行composer global update symfony/var-dumper 以获得最新的错误修复。

这里是 VarDumper 组件的文档。 https://symfony.com/doc/current/components/var_dumper.html

var-dumpr 4.1 版之前:

声明一个dd 函数,转储所有参数并停止进程:

if (!function_exists('dd')) 
    function dd()
    
        foreach (func_get_args() as $x) 
            dump($x);
        
        die;
    
 

var-dump 4.1 版之后:

自 var-dumper 4.1 版以来,dd() 已被声明。加载库就足够了。

【讨论】:

最新的 VarDumper 版本已经默认添加了 dd 功能。您不必手动创建一个。【参考方案2】:

我在debug functions包下面更新了d函数的更多函数和最新代码。

(以下答案大约是 1 年前。)

========================================

下面是我自己的代码。它可以在纯 PHP(无框架)中工作。

function d($data)
    if(is_null($data))
        $str = "<i>NULL</i>";
    elseif($data == "")
        $str = "<i>Empty</i>";
    elseif(is_array($data))
        if(count($data) == 0)
            $str = "<i>Empty array.</i>";
        else
            $str = "<table style=\"border-bottom:0px solid #000;\" cellpadding=\"0\" cellspacing=\"0\">";
            foreach ($data as $key => $value) 
                $str .= "<tr><td style=\"background-color:#008B8B; color:#FFF;border:1px solid #000;\">" . $key . "</td><td style=\"border:1px solid #000;\">" . d($value) . "</td></tr>";
            
            $str .= "</table>";
        
    elseif(is_resource($data))
        while($arr = mysql_fetch_array($data))
            $data_array[] = $arr;
        
        $str = d($data_array);
    elseif(is_object($data))
        $str = d(get_object_vars($data));
    elseif(is_bool($data))
        $str = "<i>" . ($data ? "True" : "False") . "</i>";
    else
        $str = $data;
        $str = preg_replace("/\n/", "<br>\n", $str);
    
    return $str;


function dnl($data)
    echo d($data) . "<br>\n";


function dd($data)
    echo dnl($data);
    exit;


function ddt($message = "")
    echo "[" . date("Y/m/d H:i:s") . "]" . $message . "<br>\n";

【讨论】:

【参考方案3】:

对于像 dd() 这样可能对 Laravel 感兴趣的其他人,请查看这个 repo -

https://github.com/wanfeiyy/laravel-dd

【讨论】:

如果您查看该库的源代码,会发现使用原始 Symphony 组件进行复制实际上非常简单。所有的逻辑似乎都在这个文件中,复制起来非常简单:github.com/wanfeiyy/laravel-dd/blob/master/src/Dd/Dumper.php【参考方案4】:

Laravel dd 实际上是一个很棒的功能。但是,接受机制是var_dump,然后是die

例子:

$arr = [1,2,3,4,5,6];
var_dump($arr);
die();

【讨论】:

是的,你是对的。但是它的架构是什么。它不会详细说明整个数组。因为在某些情况下,数组可能太大了。在那种情况下,我们不能使用它。但是 laravel 做了一些事情来通过折叠来最小化这个问题。 你可以设置var_dump()的深度。我不记得如何(我认为它可能在 php.ini 中)【参考方案5】:

你可以在你的类use Illuminate\Support\Debug\Dumper; 中引入这个命名空间,然后将它用于你的变量,如下所示:

(new Dumper)->dump($myVariable);

【讨论】:

【参考方案6】:

composer 需要 --dev symfony/var-dumper

<?php     
if (! function_exists('dd')) 
            /**
             * Dump the passed variables and end the script.
             *
             * @param  mixed
             * @return void
             */
            function dd()
            
                array_map(function ($value) 
                    if (class_exists(Symfony\Component\VarDumper\Dumper\CliDumper::class)) 
                        $dumper = 'cli' === PHP_SAPI ?
                            new Symfony\Component\VarDumper\Dumper\CliDumper :
                            new Symfony\Component\VarDumper\Dumper\HtmlDumper;
                        $dumper->dump((new Symfony\Component\VarDumper\Cloner\VarCloner)->cloneVar($value));
                     else 
                        var_dump($value);
                    
                , func_get_args());
                die(1);
            
        

?>

【讨论】:

【参考方案7】:

我是这样做的:

function dd($a)
    var_dump($a);
    exit;

我一直在使用它。甚至在 Sublime 中为它创建了一个片段。

我还使用var_masterpiece Chrome 扩展来获得一个不错的输出,我可以在其中展开和折叠数组键等。

【讨论】:

【参考方案8】:

我喜欢这样:

function dd($var) 
    echo "<pre>";
    print_r($var);
    exit;

【讨论】:

我有一个类似的功能,我只是稍微修改一下 echo '
'.print_r($var,true).'
';退出;
【参考方案9】:

我大部分时间都在使用 laravel 框架,当涉及到调试 dd() 辅助方法时,它就成了一个非常少见的工具。

但最近我被要求从事一个 symfony 3.4 项目,起初我使用 dump($my_vars); die(); 转储和删除我的 vars。但这很快就变得非常繁琐。所以我最终在 symfony 3.4 项目中添加了一个 dd() 全局辅助方法,方法如下:

src/ 文件夹内我创建了Support/ 文件夹,在Support/ 文件夹内我创建了helpers.php 文件,我在其中添加了我的转储辅助函数。

src/Support/helpers.php

if (!function_exists('dd')) 

    /**
     * Dump the passed variables and end the script.
     *
     * @return void
     */
    function dd() 

        $args = func_get_args();

        call_user_func_array('dump', $args);

        die(1);
    

您可能需要将新文件 (helpers.php) 添加到您的 composer.json 文件中,以便自动为您加载,如下所示:

composer.json


    ...

    "autoload": 
        "psr-4": 
            "App\\": "src/"
        ,
        "files": [
            "src/Support/helpers.php"
        ]
    ,

    ...

【讨论】:

【参考方案10】:

@coloured-panda 答案不再有效。这是更新的代码:

use Symfony\Component\VarDumper\VarDumper;

if (! function_exists('dd')) 
    /**
     * Dump the passed variables and end the script.
     *
     * @param  mixed  $vars
     * @return void
     */
    function dd(...$vars)
    
        header('Access-Control-Allow-Origin: *');
        header('Access-Control-Allow-Methods: *');
        header('Access-Control-Allow-Headers: *');
        http_response_code(500);

        foreach ($vars as $v) 
            VarDumper::dump($v);
        

        die(1);
    

【讨论】:

【参考方案11】:

你可以使用包mp091689/dump-die然后你可以这样做:

dd($variable);

dd($variable1, $variable2, ..);

【讨论】:

【参考方案12】:

它就像一个魅力。

function dd()

   array_map(function($x)  var_dump($x); , func_get_args()); die;

【讨论】:

【参考方案13】:

这是最简单的解决方案:

if(!function_exists('dd'))

    function dd( $result )
    
        echo '<pre>'; print_r($result); die();
    

【讨论】:

以上是关于如何编写与 laravel 相同的自己的 DD() 函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不停止 laravel 程序的情况下使用 dd()

laravel怎么统计数据库中相同字段的数量

如何修复页面重新加载相同的表单提交与laravel

laravel如何将数据从表单传递到控制器

如何使用 eloquent / etc 与 laravel 编写关系函数?

如何编写通用 SQL 查询以与所有 RDBMS(Oracle、SQL 服务器、MySql、DB2 等等)兼容的 (YYYY-MM-DD) 形式提取日期