debugging Laravel dd功能限制

hlswsv35  于 2022-11-14  发布在  其他
关注(0)|答案(4)|浏览(142)

我有一个包含320个数组的数组,而常规的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个完整记录,如何增加限制?相关主题Is Laravels' DD helper function working properly?实际上并没有解释限制。
这是非常一致的行为,我已经在上用Laravel 5.2和php7进行了测试

  • Linux(拉瑞维尔锻造、DO droplet、Ubuntu)
  • Mac(拉勒韦尔代客泊车)
  • Windows(valet4Windows)

在元素#147上的任何地方都得到了完全相同的剪切。使用CLI php artisan tinker输出相同的剪切

...
"name" => "dccode"   ]   147 => array:17 [
"total_unconfirmed_subscribers" => 0
 16   ]   148 => array:17 [ 17]
...
gmol1639

gmol16391#

在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,该VarCloner正在扩展AbstractCloner。此类的$maxItems属性设置为2500。请参阅:https://github.com/symfony/var-dumper/blob/master/Cloner/AbstractCloner.php#L125
每个数组有17个元素,乘以147得到2499,这就是为什么数组在第一个元素之后被截断。
如果你想增加这个值,你需要覆盖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);
    }
}
wkftcu5l

wkftcu5l2#

我的建议是在bootstrap文件夹中创建一个自定义助手文件
1)我按照下面的答案为您的Laravel应用程序创建一个自定义助手函数,如果它太复杂,您可以跳过下面的步骤,使用第2步中的my函数作为任何普通函数,只需调用它〉〉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函数的完整输出。我认为这种方法比覆盖任何现有的函数要好。但是要小心,因为现在任何深度的变量都会完整显示,你可能会经历更长的加载时间。希望它能有所帮助。

mwngjboj

mwngjboj3#

我的建议是在 VarDumper 组件中添加一个 handler
在您的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));
});

根据Symfony's VarDumper component documentation

***setMaxItems()***配置将克隆超过最小嵌套深度的最大项目数。使用广度优先算法对项目进行计数,以便较低级别的项目比嵌套较深的项目具有更高的优先级。指定-1将删除此限制。

在文档中,您可以看到定制克隆器、转储器和脚轮组件的其他方法。

c9qzyr3d

c9qzyr3d4#

**Laravel的dd()**函数用于在浏览器中打印/转储一些值,然后停止执行(跳过dd()之后给出的所有其他代码)
dd()函数的替代项。

有两种选择。
1.如果要在浏览器中打印单个值然后停止执行。
echo $您的值;
exit(退出);
1.如果要在浏览器中打印一些数组值然后停止执行。
打印_r($您的数组);
exit(退出);

相关问题