symfony/symfony · error · LogicException
An asset package cannot have base URLs and base paths.
Error message
An asset package cannot have base URLs and base paths.
What it means
Thrown when registering an asset package that defines both 'base_urls' and 'base_paths' simultaneously. An asset package resolves URLs in exactly one way — either by prepending a base path (for same-origin assets) or by selecting from a set of base URLs (for CDN-served assets). Defining both is contradictory. The check is at FrameworkExtension.php:1515-1516 in createPackageDefinition().
Source
Thrown at src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php:1516
$container->getDefinition('asset_mapper.compressor')->replaceArgument(0, $compressors ?: null);
if ($config['precompress']['enabled']) {
$container
->getDefinition('asset_mapper.local_public_assets_filesystem')
->addArgument(new Reference('asset_mapper.compressor'))
->addArgument($config['precompress']['extensions'])
;
}
}
/**
* Returns a definition for an asset package.
*/
private function createPackageDefinition(?string $basePath, array $baseUrls, Reference $version): Definition
{
if ($basePath && $baseUrls) {
throw new \LogicException('An asset package cannot have base URLs and base paths.');
}
$package = new ChildDefinition($baseUrls ? 'assets.url_package' : 'assets.path_package');
$package
->replaceArgument(0, $baseUrls ?: $basePath)
->replaceArgument(1, $version)
;
return $package;
}
private function createVersion(ContainerBuilder $container, ?string $version, ?string $format, ?string $jsonManifestPath, string $name, bool $strictMode): Reference
{
// Configuration prevents $version and $jsonManifestPath from being set
if (null !== $version) {
$def = new ChildDefinition('assets.static_version_strategy');
$def
->replaceArgument(0, $version)View on GitHub (pinned to 698e28026c)
Solutions
- Use only base_urls if assets are served from a CDN or external domain.
- Use only base_paths if assets are served from the same origin.
- To handle dev vs prod differences, use environment-specific config files (e.g., config/packages/dev/framework.yaml vs prod/framework.yaml) each with one or the other.
Example fix
# before
framework:
assets:
packages:
cdn_images:
base_paths: ['images']
base_urls: ['https://cdn.example.com']
# after
framework:
assets:
packages:
cdn_images:
base_urls: ['https://cdn.example.com'] Defensive patterns
Strategy: validation
Validate before calling
foreach ($config['framework']['assets']['packages'] ?? [] as $name => $pkg) {
$hasBasePaths = !empty($pkg['base_paths']);
$hasBaseUrls = !empty($pkg['base_urls']);
if ($hasBasePaths && $hasBaseUrls) {
throw new \LogicException("Asset package '{$name}' cannot have both base_paths and base_urls.");
}
} Prevention
- Choose one strategy per package: base_paths for local, base_urls for CDN.
- Use environment-specific config files for dev/prod differences instead of mixing.
- Review asset package configs after merging environment-specific YAML.
When it happens
Trigger: Under 'framework.assets.packages.<name>', setting both 'base_paths' and 'base_urls' keys. The createPackageDefinition() method receives both as non-null/non-empty and throws.
Common situations: Developer configures an asset package and inadvertently includes both base_paths (for local dev) and base_urls (for production CDN), not realizing they're mutually exclusive. Common when environment-specific configs are merged.
Related errors
- The target directory "%s" does not exist.
- You have requested a non-existent parameter "%s".
- This command does not support the application kernel: "%s" d
- The route "%s" does not exist.
- "%s" is neither an enabled bundle nor a directory.
AI-assisted analysis of symfony/symfony@698e28026c (2026-08-06).
Data as JSON: /api/errors/5efa6f1bdc90549b.
Report an issue: GitHub.