如何编写与 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 的 expand 和 close 机制来处理数组和对象。 我使用以下作为一般 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() 函数?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 eloquent / etc 与 laravel 编写关系函数?
如何编写通用 SQL 查询以与所有 RDBMS(Oracle、SQL 服务器、MySql、DB2 等等)兼容的 (YYYY-MM-DD) 形式提取日期