debugging Laravel 8 dd()限制

mutmk8jj  于 2022-11-14  发布在  其他
关注(0)|答案(3)|浏览(155)

bounty将在4天后过期。回答此问题可获得+100的声望奖励。draw134正在寻找此问题的最新答案

我如何增加laravel 8 dd()的限制?我有很多嵌套关系,由于数据太多,我无法查看它们中的大多数。例如

#relations: array:4 [▼
    "activecourses" => Illuminate\Database\Eloquent\Collection {#1346 ▼
      #items: array:3 [▼
        0 => App\Models\Studentcourse {#1353 ▶}
        1 => App\Models\Studentcourse {#1354 ▼
          #guarded: []
          #connection: "mysql"
          #table: "studentcourses"
          #primaryKey: "id"
          #keyType: "int"
          +incrementing: true
          #with: []
          #withCount: []
          +preventsLazyLoading: false
          #perPage: 15
          +exists: true
          +wasRecentlyCreated: false
          #escapeWhenCastingToString: false
          #attributes: array:22 [ …22]
          #original: array:22 [ …22]
          #changes: []
          #casts: []
          #classCastCache: []
          #attributeCastCache: []
          #dates: []
          #dateFormat: null
          #appends: []
          #dispatchesEvents: []
          #observables: []
          #relations: array:1 [ …1]
          #touches: []
          +timestamps: true
          #hidden: []
          #visible: []
          #fillable: []
        }
        2 => App\Models\Studentcourse {#1355 ▶}
      ]
      #escapeWhenCastingToString: false
    }

我发现这个链接Laravel dd function limitations,但我认为它过时了,因为新的dd功能为laravel 8是
这来自供应商文件夹。

use Symfony\Component\VarDumper\VarDumper;

if (!function_exists('dump')) {
    /**
     * @author Nicolas Grekas <p@tchwork.com>
     */
    function dump($var, ...$moreVars)
    {
        VarDumper::dump($var);

        foreach ($moreVars as $v) {
            VarDumper::dump($v);
        }

        if (1 < func_num_args()) {
            return func_get_args();
        }

        return $var;
    }
}

if (!function_exists('dd')) {
    /**
     * @return never
     */
    function dd(...$vars)
    {
        if (!in_array(\PHP_SAPI, ['cli', 'phpdbg'], true) && !headers_sent()) {
            header('HTTP/1.1 500 Internal Server Error');
        }

        foreach ($vars as $v) {
            VarDumper::dump($v);
        }

        exit(1);
    }
}

尝试在dd()之前添加此行,但不起作用

ini_set('xdebug.var_display_max_depth', 100);
   ini_set('xdebug.var_display_max_children', 2000);
   ini_set('xdebug.var_display_max_data', 2000);

查看嵌套数据有什么方法或替代方法吗?我不想使用var_dumpprint_r,因为浏览器在有大量数据时会变慢。提前感谢。

9rbhqvlz

9rbhqvlz1#

有三种方法可以使用dd()方法。
1.打印到命令行(通过书面测试或工匠修补)
1.正在打印到浏览器。如果您使用Blade,则可以执行此操作。
1.打印到日志文件。使用日志外观,例如Log::debug($activeForces)
由于数据量很大,甚至不建议将变量的内容打印到屏幕上。请尝试使用日志文件。
或者,你为什么不缩小被抛弃的内容的范围呢?例如:dd($activeForces[0])

wwtsj6pe

wwtsj6pe2#

因此,根据您的需求以及我使用的工具,Tracy可能是比dd()Visit their GitHub Here更好的工具
这将用Nette团队创建的Tracy PHP调试器替换Laravel中的默认调试系统。
这意味着您将使用bdump($myArray,"Active Courses")而不是dd($myArray)(第二个参数是可选的,但在一个页面上使用多个bdumps()时很有用,这样您就可以知道哪个是哪个)
这也将允许您看到渲染的页面以及转储(和其他有用的功能,如路线,会话,甚至拉腊维尔终端)

jtoj6r0c

jtoj6r0c3#

这个问题在这里已经得到了回答:Laravel dd function limitations-编辑:那些仍然工作但不再完整(VarDumper覆盖),并且不应在生产中使用。

覆盖Laravel转储

转储程序正在使用扩展AbstractCloner的Symfony的VarCloner。此类的$maxItems属性设置为2500。
基本上,你需要重写Laravel的Dumper,就像在文章的答案中解释的那样。你也可以创建一个新的方法,比如ddd(),用一个自定义的Dumper来允许更大的输出。
请注意,非常大的数据集可能会使浏览器选项卡/窗口崩溃,因为DOM大小会随之增长。

备选方案

或者,如果您确实需要“实时”查看此数据(例如:一个API路由),你可以返回JSON并用Postman或Chrome调试器检查它们(网络选项卡,解析的有效负载)。它们可以解析并提供一个“动态”的数据视图,就像Laravel dump对HTML/CSS/JS所做的那样。

超大型JSON(+50 /100个月)

对于非常大的JSON,我建议:

  • 将其作为JSON文件下载
  • 用一个大的JSON查看器/解析器来查看它(我用付费的UltraEdit来查看500 mo + JSON。一些免费软件对较小的文件来说已经足够了。我想 Postman /Chrome对于50 mo来说还可以)。同样,他们可以解析并提供一个动态视图,比如dd/dump
    编辑

我刚刚在Laravel 8.6.12上测试了"Lucas Martin" solution,它按预期工作:
EDIT 2:可以工作但不完整,8.X中的转储程序比5.x中的更复杂(server)。逻辑是相同的,但前提是覆盖不再完整。我只会在这个特定的调试情况下使用它。我会使用这个简单/旧的逻辑和custom method。默认(截断):

VarDumper更新的处理程序(完整):

这个解决方案的局限性在于浏览器。当DOM太大而无法存储在内存中时,它会因为数据集太大而崩溃。而且,我只会在开发环境中使用它。
Laravel debugbar调试助手也许能够处理更大的对象和动态视图,但仍然受到浏览器内存和DOM大小的限制。
制作者:random JSON generator

相关问题