assetQueryString->get(); // Defaults for LINK and STYLE elements. $link_element_defaults = [ '#type' => 'html_tag', '#tag' => 'link', '#attributes' => [ 'rel' => 'stylesheet', ], ]; foreach ($css_assets as $css_asset) { $element = $link_element_defaults; $element['#attributes']['media'] = $css_asset['media']; switch ($css_asset['type']) { // For file items, output a LINK tag for file CSS assets. case 'file': $element['#attributes']['href'] = $this->fileUrlGenerator->generateString($css_asset['data']); // Only add the cache-busting query string if this isn't an aggregate // file. if (!isset($css_asset['preprocessed'])) { $query_string_separator = str_contains($css_asset['data'], '?') ? '&' : '?'; $element['#attributes']['href'] .= $query_string_separator . $query_string; } break; case 'external': $element['#attributes']['href'] = $css_asset['data']; break; default: throw new \Exception('Invalid CSS asset type.'); } // Merge any additional attributes. if (!empty($css_asset['attributes'])) { $element['#attributes'] += $css_asset['attributes']; } $elements[] = $element; } return $elements; } }