Friday, October 26, 2018

php - Laravel dd function limitations



I have an array of 320 arrays, while regular var_dump shows me exactly 320 elements with all nested elements, Laravel's dd helper truncates the nested element at index 147 and all the further elements are truncated with no option to expand them, see the example below



  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]



Why is it limited to 147 full records and how to increase the limit?
The related topic Is Laravels' DD helper function working properly? doesn't actually explain the limits.



This is pretty consistent behavior, I've tested with Laravel 5.2 and php7 on




  • Linux (Laravel Forge, DO droplet, Ubuntu)

  • Mac (Laravel Valet)

  • Windows (valet4windows)




Everywhere got exactly the same cut on element #147. Using CLI php artisan tinker outputs the same cut



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


Answer



Prior to version 5.0 laravel's dd() function looked as follows:



function dd()
{
array_map(function($x) { var_dump($x); }, func_get_args()); die;
}


Since 5.0 it looks like this:




function dd()
{
array_map(function ($x) {
(new Dumper)->dump($x);
}, func_get_args());

die(1);
}



The Dumper is using symfony's VarCloner which is extending the AbstractCloner. This class has a $maxItems attribute set to 2500. See: https://github.com/symfony/var-dumper/blob/master/Cloner/AbstractCloner.php#L125



You have 17 items per array. Multiply it by 147 and you get 2499. That's why your array at key 147 is truncated after it's first item.



If you'd like to increase that you'd need to override laravel's Dumper class (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);
}
}


No comments:

Post a Comment

plot explanation - Why did Peaches' mom hang on the tree? - Movies & TV

In the middle of the movie Ice Age: Continental Drift Peaches' mom asked Peaches to go to sleep. Then, she hung on the tree. This parti...