assetsPool[] = $assets; } public function renderCss(): void { $css = []; foreach ($this->assetsPool as $item) { /** @var Assets $item */ $css = array_merge($css, $item->getCollectorCss()); } try { $sortedStyles = $this->sortStyles($css); // Выводим отсортированные стили foreach ($sortedStyles as $style) { echo '' . "\n"; } } catch (RuntimeException $e) { echo 'Ошибка: ' . $e->getMessage(); } } public function renderJs(bool $body = true): void { $scripts = []; foreach ($this->assetsPool as $item) { /** @var Assets $item */ $scripts = array_merge($scripts, $item->getCollectorJs()); } try { $sortedScripts = $this->sortScripts($scripts); // Разделяем скрипты для head и body $headScripts = []; $bodyScripts = []; foreach ($sortedScripts as $script) { if ($script['body']) { $bodyScripts[] = $script['resource']; } else { $headScripts[] = $script['resource']; } } // Выводим скрипты для head if ($body){ $scriptsToRender = $bodyScripts; } else { $scriptsToRender = $headScripts; } foreach ($scriptsToRender as $script) { echo '' . "\n"; } } catch (RuntimeException $e) { echo 'Ошибка: ' . $e->getMessage(); } } protected function sortStyles(array $styles): array { $sorted = []; $added = []; // Пока не добавим все стили while (count($sorted) < count($styles)) { $found = false; foreach ($styles as $name => $style) { // Если стиль еще не добавлен и его зависимости выполнены if (!isset($added[$name]) && (empty($style['after']) || isset($added[$style['after']]))) { $sorted[] = $style['resource']; $added[$name] = true; $found = true; } } if (!$found) { // Если есть циклическая зависимость throw new RuntimeException('Обнаружена циклическая зависимость в стилях'); } } return $sorted; } protected function sortScripts(array $scripts): array { $sorted = []; $added = []; while (count($sorted) < count($scripts)) { $found = false; foreach ($scripts as $name => $script) { if (!isset($added[$name]) && (empty($script['after']) || isset($added[$script['after']]))) { $sorted[] = $script; $added[$name] = true; $found = true; } } if (!$found) { throw new RuntimeException('Обнаружена циклическая зависимость в скриптах'); } } return $sorted; } }