当前位置: 首页 > 知识库问答 >
问题:

Laravel dd函数的局限性

钱渊
2023-03-14

我有一个由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条全记录,如何提高限制?相关主题Laravels的DD助手函数是否正常工作?实际上并不能解释限制。

这是一个非常一致的行为,我已经用Laravel5.2和php7对其进行了测试

  • Linux(Laravel Forge, DO Droplet, Ubuntu)
  • Mac(Laravel代客)
  • Windows(valet4windows)

每个地方的147号元素都有完全相同的切割。使用CLIphp artisan tinker输出相同的切割

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

共有3个答案

臧弘和
2023-03-14

我的建议是在VarDumper组件中添加一个处理程序。

在AppServiceProvider.php中:

(在声明之前)

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的VarDumper组件文档:

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

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

舒枫涟
2023-03-14

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

1) 按照以下答案为您的Laravel应用程序创建自定义帮助函数,如果太复杂,您可以跳过以下步骤,将步骤2中的“我的函数”用作任何普通函数,然后简单地调用它

2) 我想给这个家伙一些荣誉,我按照他的指导创建我自己的ddd函数

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函数的完整输出。我认为这种方法比覆盖任何现有函数要好。但是要小心,因为现在任何深度的变量都将被完全显示,你可能会经历更长的加载时间。希望有帮助。

东郭海阳
2023-03-14

在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);
    }
}
 类似资料:
  • Selenium的局限性主要如下: Selenium不支持桌面应用程序的自动化测试。 Selenium需要高技能才能更有效地自动化测试。 由于Selenium是开源软件,因此您必须依靠社区论坛来解决技术问题。 无法使用Selenium对Web服务(如SOAP或REST)执行自动化测试。 使用者应该至少知道或熟悉一种受支持的编程语言,以便在Selenium WebDriver中创建测试脚本。 它没有

  • 全局函数 返回上级 DirectDrawCreate DirectDrawCreateClipper DirectDrawEnumerate DirectDrawEnumerateEx DirectDrawCreate 返回目录 创建一个DirectDraw对象的实例。 HRESULT WINAPI DirectDrawCreate( GUID FAR *lpGUID, LPDIRECTDRAW

  • debug 调试打印PHP变量,并中断执行。等同于 var_dump($var1, $var2);die; table 将任意MySQL表构造成Model对象。 table($table_name, $db_object_id); model 创建模型对象。 model($model_name, $db_object_id);

  • Herosphp提供了一些全局辅助函数: //格式化打印变量(数据) __print($message); //终端高亮打印绿色(success) tprintOk($message); //终端高亮打印红色(error) tprintError($message); //终端高亮打印黄色(warning) tprintWarning($message); //计算字符串的hash值, 默

  • imigo 启动一个协程,自动创建和销毁上下文 imigo(function(){ $value = Redis::get('key'); // 无需手动释放任何资源 }); 传入参数: imigo(function($id, $name){ echo $id, ':', $name, PHP_EOL; // 1:test }, 1, 'test'); imiCalla

  • 当前版本的SystemTap提供的探测内核空间事件的众多选项,可以在不同版本的内核下使用。然而,SystemTap对探测用户空间事件的支持依赖于内核的支持(需要utrace机制),而多数内核缺乏这一支持。结果是,仅有部分内核上的SystemTap版本支持用户空间探测。 当前,SystemTap社区正集中力量改进SystemTap的用户空间探测能力。 (译注:本指南写于2013年。现今的内核普遍已经