setDataFormatter(new SimpleFormatter()); $this->collect_data = $collectData; $this->templates = []; $this->exclude_paths = $excludePaths; $this->group = $group; } public function getName() { return 'views'; } public function getWidgets() { return [ 'views' => [ 'icon' => 'leaf', 'widget' => 'PhpDebugBar.Widgets.TemplatesWidget', 'map' => 'views', 'default' => '[]' ], 'views:badge' => [ 'map' => 'views.nb_templates', 'default' => 0 ] ]; } /** * @return array */ public function getAssets() { return [ 'css' => 'widgets/templates/widget.css', 'js' => 'widgets/templates/widget.js', ]; } /** * Add a View instance to the Collector * * @param \Illuminate\View\View $view */ public function addView(View $view) { $name = $view->getName(); $type = null; $data = $view->getData(); $path = $view->getPath(); if (class_exists('\Inertia\Inertia')) { list($name, $type, $data, $path) = $this->getInertiaView($name, $data, $path); } if (is_object($path)) { $type = get_class($view); $path = null; } if ($path) { if (!$type) { if (substr($path, -10) == '.blade.php') { $type = 'blade'; } else { $type = pathinfo($path, PATHINFO_EXTENSION); } } $shortPath = $this->normalizeFilePath($path); foreach ($this->exclude_paths as $excludePath) { if (str_starts_with($shortPath, $excludePath)) { return; } } } $this->addTemplate($name, $data, $type, $path); } private function getInertiaView(string $name, array $data, ?string $path) { if (isset($data['page']) && is_array($data['page'])) { $data = $data['page']; } if (isset($data['props'], $data['component'])) { $name = $data['component']; $data = $data['props']; if ($files = glob(resource_path('js/Pages/' . $name . '.*'))) { $path = $files[0]; $type = pathinfo($path, PATHINFO_EXTENSION); if (in_array($type, ['js', 'jsx'])) { $type = 'react'; } } } return [$name, $type ?? '', $data, $path]; } public function addInertiaAjaxView(array $data) { list($name, $type, $data, $path) = $this->getInertiaView('', $data, ''); if (! $name) { return; } $this->addTemplate($name, $data, $type, $path); } private function addTemplate(string $name, array $data, ?string $type, ?string $path) { // Prevent duplicates $hash = $type . $path . $name . ($this->collect_data ? implode(array_keys($data)) : ''); if ($this->collect_data === 'keys') { $params = array_keys($data); } elseif ($this->collect_data) { $params = array_map( fn ($value) => $this->getDataFormatter()->formatVar($value), $data ); } else { $params = []; } $template = [ 'name' => $name, 'param_count' => $this->collect_data ? count($params) : null, 'params' => $params, 'start' => microtime(true), 'type' => $type, 'hash' => $hash, ]; if ($path && $this->getXdebugLinkTemplate()) { $template['xdebug_link'] = $this->getXdebugLink($path); } $this->templates[] = $template; } public function collect() { if ($this->group === true || count($this->templates) > $this->group) { $templates = []; foreach ($this->templates as $template) { $hash = $template['hash']; if (!isset($templates[$hash])) { $template['render_count'] = 0; $template['name_original'] = $template['name']; $templates[$hash] = $template; } $templates[$hash]['render_count']++; $templates[$hash]['name'] = $templates[$hash]['render_count'] . 'x ' . $templates[$hash]['name_original']; } $templates = array_values($templates); } else { $templates = $this->templates; } return [ 'nb_templates' => count($this->templates), 'templates' => $templates, ]; } }