'withFilePath', 'version' => 'withVersion', 'location' => 'forLocation', 'enqueue' => 'canEnqueue', 'handler' => 'useHandler', 'condition' => 'withCondition', 'attributes' => 'withAttributes', ]; if ($asset instanceof Script) { foreach ($config['localize'] as $objectName => $data) { $asset->withLocalize((string) $objectName, $data); } if (isset($config['translation'])) { /** @var array{domain:string, path:?string} $translations */ $translations = $config['translation']; $asset->withTranslation( (string) $translations['domain'], $translations['path'] ?? null ); } $inFooter = $config['inFooter'] ?? true; $inFooter ? $asset->isInFooter() : $asset->isInHeader(); if (!empty($config['inline']['before']) && is_array($config['inline']['before'])) { foreach ($config['inline']['before'] as $script) { $asset->prependInlineScript((string) $script); } } if (!empty($config['inline']['after']) && is_array($config['inline']['after'])) { foreach ($config['inline']['after'] as $script) { $asset->appendInlineScript((string) $script); } } } if ($asset instanceof Style) { $propertiesToMethod['media'] = 'forMedia'; $propertiesToMethod['inlineStyles'] = 'withInlineStyles'; $propertiesToMethod['media'] = 'forMedia'; } foreach ($propertiesToMethod as $key => $methodName) { if (!isset($config[$key])) { continue; } $asset->{$methodName}($config[$key]); } $dependencies = $config['dependencies'] ?? null; if (is_array($dependencies)) { $asset->withDependencies(...$dependencies); } elseif (is_scalar($dependencies)) { $asset->withDependencies((string) $dependencies); } return $asset; } /** * @param array $config * * @return array * * @throws Exception\MissingArgumentException */ private static function validateConfig(array $config): array { self::ensureRequiredConfigFields($config); $config = self::normalizeVersionConfig($config); $config = self::normalizeTranslationConfig($config); $config = self::normalizeLocalizeConfig($config); return $config; } private static function ensureRequiredConfigFields(array $config): void { $requiredFields = [ 'type', 'url', 'handle', ]; foreach ($requiredFields as $key) { if (!isset($config[$key])) { throw new Exception\MissingArgumentException( sprintf( 'The given config %s is missing.', $key ) ); } } } private static function normalizeVersionConfig(array $config): array { // some existing configurations uses time() as version parameter which leads to // fatal errors since 2.5 if (isset($config['version'])) { $config['version'] = (string) $config['version']; } return $config; } private static function normalizeTranslationConfig(array $config): array { if (!isset($config['translation'])) { return $config; } if (is_string($config['translation'])) { // backward compatibility $config['translation'] = [ 'domain' => $config['translation'], 'path' => null, ]; return $config; } if (!is_array($config['translation'])) { throw new InvalidArgumentException( "Config key translation must be of type string or array" ); } if (!isset($config['translation']['domain'])) { throw new Exception\MissingArgumentException( 'Config key translation[domain] is missing.' ); } if (!isset($config['translation']['path'])) { $config['translation']['path'] = null; } return $config; } private static function normalizeLocalizeConfig(array $config): array { if (!isset($config['localize'])) { $config['localize'] = []; return $config; } if (is_callable($config['localize'])) { $config['localize'] = $config['localize'](); } if (!is_array($config['localize'])) { throw new InvalidArgumentException( 'Config key localize must evaluate as an array' ); } return $config; } /** * @param string $file * * @return array * * @throws Exception\FileNotFoundException * @deprecated PhpArrayFileLoader::load(string $filePath) * */ public static function createFromFile(string $file): array { $loader = new PhpFileLoader(); return $loader->load($file); } /** * @param array $data * * @return array * * @throws Exception\FileNotFoundException * @deprecated ArrayLoader::load(array $data) */ public static function createFromArray(array $data): array { $loader = new ArrayLoader(); return $loader->load($data); } }