tourze/bundle-dependency

Bundle dependency resolver for Symfony

Maintainers

πŸ‘ tourze

Package info

github.com/tourze/bundle-dependency

pkg:composer/tourze/bundle-dependency

Statistics

Installs: 42 287

Dependents: 256

Suggesters: 0

Stars: 0

Open Issues: 0

1.0.0 2025-10-31 04:10 UTC

Requires

Requires (Dev)

Suggests

None

Provides

None

Conflicts

None

Replaces

None

MIT 590d098910cbb61075b10c87031911afb65797db

  • Tourze <tourze.woop@example.com>

This package is auto-updated.

Last update: 2026-06-19 09:49:25 UTC


README

English | δΈ­ζ–‡

πŸ‘ Latest Version
πŸ‘ Total Downloads
πŸ‘ PHP Version
πŸ‘ License

A lightweight interface and resolver for managing Symfony bundle dependencies, enabling automatic resolution and circular dependency detection.

Features

  • Simple interface - Define bundle dependencies with a single method
  • Automatic resolution - Recursively resolves all bundle dependencies
  • Circular detection - Prevents circular dependencies (with graceful handling)
  • Environment support - Control bundle loading per environment (dev, test, prod)
  • Lightweight - No external dependencies except PHP 8.1+

Installation

composer require tourze/bundle-dependency

Quick Start

1. Implement the interface in your bundle

<?php

use Tourze\BundleDependency\BundleDependencyInterface;
use Symfony\Component\HttpKernel\Bundle\Bundle;

class YourBundle extends Bundle implements BundleDependencyInterface
{
 public static function getBundleDependencies(): array
 {
 return [
 // Load in all environments
 'Vendor\RequiredBundle\RequiredBundle' => ['all' => true],
 
 // Load only in dev and test environments
 'Vendor\DebugBundle\DebugBundle' => ['dev' => true, 'test' => true],
 
 // Load only in production
 'Vendor\OptimizedBundle\OptimizedBundle' => ['prod' => true],
 ];
 }
}

2. Resolve dependencies

<?php

use Tourze\BundleDependency\ResolveHelper;

// Resolve all dependencies for a set of bundles
$bundles = [
 'App\YourBundle\YourBundle' => ['all' => true],
];

foreach (ResolveHelper::resolveBundleDependencies($bundles) as $bundle => $environments) {
 // $bundle = 'Vendor\RequiredBundle\RequiredBundle'
 // $environments = ['all' => true]
}

// Or resolve by bundle name
foreach (ResolveHelper::resolveByBundleName('YourBundle') as $bundleName) {
 // Returns simplified bundle names
}

Advanced Usage

Integration with Symfony Kernel

<?php

use Symfony\Component\HttpKernel\Kernel;
use Tourze\BundleDependency\ResolveHelper;

class AppKernel extends Kernel
{
 public function registerBundles(): iterable
 {
 $bundles = [
 'App\CoreBundle\CoreBundle' => ['all' => true],
 'App\ApiBundle\ApiBundle' => ['all' => true],
 ];

 // Automatically resolve and register all dependencies
 foreach (ResolveHelper::resolveBundleDependencies($bundles) as $bundle => $envs) {
 if (isset($envs['all']) || isset($envs[$this->environment])) {
 yield new $bundle();
 }
 }
 }
}

Handling circular dependencies

The resolver gracefully handles circular dependencies by skipping already-resolving bundles:

// BundleA depends on BundleB
// BundleB depends on BundleA
// No exception thrown, both bundles are resolved once

API Reference

BundleDependencyInterface

interface BundleDependencyInterface
{
 /**
 * Get bundle dependencies with their environment configuration
 *
 * @return array<class-string, array<string, bool>>
 */
 public static function getBundleDependencies(): array;
}

ResolveHelper

class ResolveHelper
{
 /**
 * Recursively resolve bundle dependencies
 *
 * @param array<class-string, array<string, bool>> $bundles Initial bundles
 * @return \Traversable<class-string, array<string, bool>> Resolved bundles
 */
 public static function resolveBundleDependencies(array $bundles): \Traversable;

 /**
 * Resolve dependencies by bundle name
 *
 * @param string $bundleName Bundle name (e.g., 'YourBundle')
 * @return \Traversable<string> Simplified bundle names
 */
 public static function resolveByBundleName(string $bundleName): \Traversable;
}

Configuration

This package requires no configuration. Simply implement the BundleDependencyInterface in your bundles and use the ResolveHelper to resolve dependencies.

Environment Configuration

Supported environment keys:

  • 'all' => true - Load in all environments
  • 'dev' => true - Load only in development
  • 'test' => true - Load only in testing
  • 'prod' => true - Load only in production

Contributing

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

Testing

# Run tests
./vendor/bin/phpunit packages/bundle-dependency/tests

# Run static analysis
php -d memory_limit=2G ./vendor/bin/phpstan analyse packages/bundle-dependency

License

The MIT License (MIT). Please see License File for more information.