2016-08-18 127 views
5

我有320个数组的数组,而常规var_dump显示我与所有嵌套元素正好320的元件,Laravel的dd辅助截断嵌套元素在索引和所有其他元件与没有选项截断以扩展它们,请参阅下面的示例Laravel DD功能限制

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伪造,DO滴,Ubuntu的)
  • MAC(Laravel代客)
  • 的Windows(valet4windows )

处处得到确切的元素#147相同的剪辑。使用CLI php artisan tinker输出相同的切割

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

你有没有想过使用'的print_r()'呢? – Derek

+0

'var_dump'和'print_r'都能正常工作,看到数据不是我的问题,我想了解dd限制。 – vitr

+0

你使用哪个laravel版本? 4.2和5.2都返回了20.000个元素。 – sleepless

回答

7

此前版本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.这就是为什么你的数组在第一个项目后被截断的原因。

如果你想增加你需要重写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); 
    } 
} 
+0

这实际上有效!很好的解释,谢谢,你会推荐一种更好的方式来覆盖我的自定义应用程序中的'转储'功能,而不会影响任何供应商代码? – vitr

+0

是的,显然将它直接写入核心类是个不错的主意。这只是一个提示,所以你知道如何增加限制。现在或多或少取决于你。一个简单的方法是编写你自己的dd函数。这很容易,因为laravel正在检查函数是否已经存在:http://stackoverflow.com/a/28475973/1233206 - 或者您需要创建一个扩展laravel的Dumper的自定义Dumper。这就是我的意思是“覆盖”:) – sleepless

+0

是的,结束了自定义的'AppDumper'类和我的'dd',它在我的助手中使用'require __DIR __。'/ ../app/helpers.php';'在主自动载入之前在'boostrap/autoload.php'中 – vitr