Laravel dd函数限制

时间:2016-08-18 06:25:45

标签: php laravel debugging

我有一个包含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(Laravel Forge,DO droplet,Ubuntu)
  • Mac(Laravel Valet)
  • Windows(valet4windows)

到处都有与元素#147完全相同的切割。使用CLI php artisan tinker输出相同的剪切

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

3 个答案:

答案 0 :(得分:13)

在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);
    }
}

答案 1 :(得分:3)

我对您的建议是在引导文件夹中创建一个自定义帮助文件

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函数的完整输出。我认为这种方法比覆盖任何现有功能更好。但请注意,由于现在将完全显示任意深度的变量,因此可能会经历较长的加载时间。希望对您有所帮助。

答案 2 :(得分:1)

我的建议是您在 VarDumper 组件中添加一个 handler

在您的 AppServiceProvider.php 中:

(在Task.WhenAll声明之前)

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()

根据Symfony's VarDumper component documentation

  

setMaxItems() 配置超过最小嵌套深度将被克隆的最大项目数。项目使用   广度优先算法,以便较低级别的项目具有较高的优先级   而不是深层嵌套的项目。指定-1将删除限制。

在文档中,您可以看到其他用于定制克隆器,翻斗者和脚轮组件的方法。