[英]Laravel dd function limitations
我有一个包含 320 个 arrays 的数组,而常规var_dump
正好显示 320 个包含所有嵌套元素的元素,Laravel 的dd
助手截断索引147处的嵌套元素,并且所有其他元素都被截断,没有扩展它们的选项,请参见下面的示例
146 => array:17 [▼
"total_unconfirmed_subscribers" => 0
"total_subscribers_subscribed_yesterday" => 0
"unique_list_id" => "24324"
"http_etag" => ""fbb6febfca8af5541541ea960aaedb""
"web_form_split_tests_collection_link" => "https://api.com/1.0/"
"subscribers_collection_link" => "https://api.com/1.0/"
"total_subscribers_subscribed_today" => 0
"id" => 23432
"total_subscribed_subscribers" => 0
"total_unsubscribed_subscribers" => 0
"campaigns_collection_link" => "https://api.com/1.0/"
"custom_fields_collection_link" => "https://api.com/1.0/accounts"
"self_link" => "https://api.com/1.0/accounts"
"total_subscribers" => 0
"resource_type_link" => "https://api.com/1.0/#list"
"web_forms_collection_link" => "https://api.com/"
"name" => "dccode"
]
147 => array:17 [▼
"total_unconfirmed_subscribers" => 0
…16
]
148 => array:17 [ …17]
149 => array:17 [ …17]
为什么限制为 147 条完整记录以及如何提高限制? 相关主题Laravel 的 DD 助手 function 工作正常吗? 实际上并没有解释限制。
这是非常一致的行为,我已经在 Laravel 5.2 和 php7 上进行了测试
在元素 #147 上到处都得到了完全相同的剪辑。 使用 CLI php artisan tinker
输出相同的剪辑
...
"name" => "dccode" ] 147 => array:17 [
"total_unconfirmed_subscribers" => 0
16 ] 148 => array:17 [ 17]
...
在5.0版之前,laravel的dd()
函数如下所示:
function dd()
{
array_map(function($x) { var_dump($x); }, func_get_args()); die;
}
从5.0开始它看起来像这样:
function dd()
{
array_map(function ($x) {
(new Dumper)->dump($x);
}, func_get_args());
die(1);
}
Dumper
正在使用symfony的VarCloner
,它正在扩展AbstractCloner
。 此类的$maxItems
属性设置为2500.请参阅: https : //github.com/symfony/var-dumper/blob/master/Cloner/AbstractCloner.php#L125
每个阵列有17个项目。 将它乘以147得到2499.这就是为什么你的第147项的数组在它的第一项之后被截断的原因。
如果你想增加它,你需要覆盖laravel的Dumper
类( https://github.com/laravel/framework/blob/5.2/src/Illuminate/Support/Debug/Dumper.php ):
public function dump($value)
{
if (class_exists(CliDumper::class)) {
$dumper = 'cli' === PHP_SAPI ? new CliDumper : new HtmlDumper;
$cloner = new VarCloner();
$cloner->setMaxItems(5000);
$dumper->dump($cloner->cloneVar($value));
} else {
var_dump($value);
}
}
我的建议是在bootstrap文件夹中创建自定义帮助程序文件
1)按照以下答案为Laravel应用程序创建自定义辅助函数,如果它太复杂,可以跳过以下步骤,在步骤2中使用我的函数作为任何正常函数,只需调用它>> https:// stackoverflow.com/a/28290359/10539212
2)我想给这个人一些信用,我按照他的指南创建我自己的ddd函数>> https://tighten.co/blog/a-better-dd-for-your-tdd
use Illuminate\Support\Debug\HtmlDumper;
use Symfony\Component\VarDumper\Cloner\VarCloner;
use Symfony\Component\VarDumper\Dumper\CliDumper;
function ddd()
{
$args = func_get_args();
$defaultStringLength = -1;
$defaultItemNumber = -1;
$defaultDepth = -1;
foreach ($args as $variable) {
$dumper = 'cli' === PHP_SAPI ? new CliDumper() : new HtmlDumper();
$cloner = new VarCloner();
$cloner->setMaxString($defaultStringLength);
$cloner->setMaxItems($defaultItemNumber);
$dumper->dump($cloner->cloneVar($variable)->withMaxDepth($defaultDepth));
}
die(1);
}
-1 =无限制(以这种方式轻松定制)
所以,现在当你使用这个ddd函数时,你可以获得正常dd函数的完整输出。 我认为这种方法比覆盖任何现有功能更好。 但要小心,因为现在完全显示任何深度的变量,您可能会遇到更长的加载时间。 希望能帮助到你。
我的建议是在VarDumper组件中添加一个处理程序 。
在AppServiceProvider.php中 :
( class
前宣布)
use Symfony\Component\VarDumper\VarDumper;
use Symfony\Component\VarDumper\Cloner\VarCloner;
use Symfony\Component\VarDumper\Dumper\CliDumper;
use Symfony\Component\VarDumper\Dumper\HtmlDumper;
(内部boot()
方法)
VarDumper::setHandler(function ($var) {
$cloner = new VarCloner();
$cloner->setMaxItems(-1); // Specifying -1 removes the limit
$dumper = 'cli' === PHP_SAPI ? new CliDumper() : new HtmlDumper();
$dumper->dump($cloner->cloneVar($var));
});
setMaxItems()配置将克隆到最小嵌套深度的最大项目数。 使用广度优先算法对项目进行计数,以便较低级别的项目具有比深度嵌套项目更高的优先级。 指定-1将删除限制。
在文档中,您可以看到用于自定义Cloners,Dumpers和Casters组件的其他方法。
Laravel 的dd()
function 用于在浏览器中打印/转储一些值,然后停止执行(跳过dd()
之后给出的所有其他代码)
dd()
function 的替代。
有两种选择。
如果要在浏览器中打印单个值然后停止执行。
回声 $your_value;
出口();
如果你想在浏览器中打印一些数组值然后停止执行。
print_r($your_array);
出口();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.