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

  1. Use only base_urls if assets are served from a CDN or external domain.
  2. Use only base_paths if assets are served from the same origin.
  3. 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

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


AI-assisted analysis of symfony/symfony@698e28026c (2026-08-06). Data as JSON: /api/errors/5efa6f1bdc90549b. Report an issue: GitHub.