Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Container Laravel Package

league/container

league/container is a lightweight PSR-11 dependency injection container for PHP. Define entries, factories, and autowiring-friendly services to manage application dependencies cleanly, with modern PHP support and solid tooling for testing and analysis.

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Steps

  1. Installation:

    composer require league/container
    

    Requires PHP 8.3+ (as per latest release).

  2. Basic Setup:

    use League\Container\Container;
    
    $container = new Container();
    
  3. First Use Case: Register a service and resolve it:

    $container->add(\App\Services\MyService::class);
    $service = $container->get(\App\Services\MyService::class);
    

Where to Look First

  • Basic Usage in the docs for core concepts.
  • PSR-11 compliance ensures interoperability with other containers.
  • Laravel Integration: Useful for lightweight DI outside Laravel’s built-in container (e.g., in CLI commands, tests, or microservices).

Implementation Patterns

Core Workflows

  1. Constructor Injection:

    $container->add(\App\Services\UserService::class)
               ->addArgument(\App\Repositories\UserRepository::class);
    
  2. Alias-Based Resolution (for interfaces/contracts):

    $container->add(\App\Contracts\UserRepository::class, \App\Repositories\MySqlUserRepository::class);
    $container->add(\App\Services\UserService::class)
               ->addArgument(\App\Contracts\UserRepository::class);
    
  3. Service Providers (for modular registration):

    $container->addServiceProvider(new \App\Providers\AppServiceProvider());
    

    Define a provider with register() method to batch-add services.

  4. Delegate Containers (fallback resolution):

    $fallback = new \League\Container\Container();
    $container->delegate($fallback);
    

Integration Tips

  • Laravel Compatibility: Use alongside Laravel’s container (e.g., for CLI tasks):
    $container = new \League\Container\Container();
    $container->addServiceProvider(new \Illuminate\Foundation\ApplicationServiceProvider(app()));
    
  • Testing: Mock dependencies easily:
    $container->add(\App\Services\PaymentService::class, new \App\Mocks\MockPaymentService());
    
  • Performance: Pre-resolve expensive services:
    $container->add(\App\Services\CacheService::class, fn() => new \App\Services\RedisCacheService());
    

Gotchas and Tips

Pitfalls

  1. Circular Dependencies: League’s container throws League\Container\Exception\NotFoundException for unresolvable services. Debug by checking registration order or using ->has() to verify availability.

  2. Argument Resolution Overhead: Avoid ambiguous strings (e.g., "User"). Use explicit types or aliases:

    // Bad: Ambiguous
    $container->add(\App\Services\UserService::class)->addArgument("User");
    
    // Good: Explicit
    $container->add(\App\Services\UserService::class)->addArgument(\App\Models\User::class);
    
  3. Service Provider Lifecycle: Providers are registered but not automatically invoked. Call register() manually or use addServiceProvider() with a provider that auto-registers.

  4. Closure Caching: Closure-based services (e.g., ->add(\App\Service::class, fn() => new \App\Service())) are not cached by default. Use ->share() to enable singleton behavior:

    $container->share(\App\Services\ConfigService::class, fn() => new \App\Services\ConfigService());
    

Debugging Tips

  • Check Registration:
    if (!$container->has(\App\Service::class)) {
        throw new \RuntimeException("Service not registered!");
    }
    
  • Inspect Dependencies: Use ->getArguments() to see what’s being injected:
    $definition = $container->getDefinition(\App\Service::class);
    print_r($definition->getArguments());
    
  • Delegate Debugging: Verify delegate order with ->getDelegates(). Delegates are checked in registration order.

Extension Points

  1. Custom Argument Types: Extend League\Container\Argument\ArgumentInterface for domain-specific logic (e.g., environment variables):

    $container->addArgument(new \App\Arguments\EnvVarArgument('APP_DEBUG'));
    
  2. Inflectors: Modify resolved objects post-instantiation:

    $container->addInflector(new \League\Container\Inflector\Inflector(
        fn($obj) => $obj->setLogger($container->get(\Psr\Log\LoggerInterface::class))
    ));
    
  3. Event System: Listen for League\Container\Events\Building to intercept resolution:

    $container->on('building', fn($event) => $event->setValue(new \App\Mocks\MockService()));
    
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
nexmo/api-specification
capell-app/block-library
axium/identity
cetria/laravel-dummy-models
cetria/reflection-helper
agropredict/sso-auth-bundle
evolvestudio/spam-protection
datacore/hub-sdk
develia/commons
cuci/prototurk-sdk
cuci/prototurk-sdk-symfony
develia/geo-bundle
dreamzy/livewire-charts
touchestate-sdk/php-sdk
22h/doctrine-garbage-collection-bundle
agtp/agtp-php
agtp/mod-php
splash/sonata-admin
splash/metadata
splash/openapi