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

Cross Container Extension Laravel Package

friends-of-behat/cross-container-extension

Deprecated Behat extension that lets you inject services and parameters across multiple service containers. Intended for use with FriendsOfBehat ContextServiceExtension or ServiceContainerExtension; migrate to SymfonyExtension v2 instead.

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation

    composer require friends-of-behat/cross-container-extension --dev
    
  2. Enable in behat.yml

    default:
        extensions:
            FriendsOfBehat\CrossContainerExtension: ~
    
  3. Pair with Required Extensions Ensure you have either:

  4. First Use Case Inject a service from a Laravel container into a Behat context:

    # behat.yml
    extensions:
        FriendsOfBehat\CrossContainerExtension:
            containers:
                laravel:
                    instance: '@service_container' # Laravel's DI container
                    services:
                        auth: '@auth'
                        user_repository: '@App\Repositories\UserRepository'
    

Implementation Patterns

Workflow: Cross-Container Service Injection

  1. Define Containers Map external containers (e.g., Laravel’s service container) in behat.yml:

    extensions:
        FriendsOfBehat\CrossContainerExtension:
            containers:
                laravel:
                    instance: '@service_container' # Laravel's container
                    services:
                        auth: '@auth'
                        user_repository: '@App\Repositories\UserRepository'
    
  2. Inject into Behat Contexts Use ContextServiceExtension to inject cross-container services:

    use FriendsOfBehat\ContextServiceExtension\Context\ServiceContext;
    use FriendsOfBehat\CrossContainerExtension\ServiceContainer\ContainerService;
    
    class UserContext extends ServiceContext
    {
        public function __construct(
            ContainerService $containerService,
            UserRepository $userRepository // Injected from Laravel
        ) {
            $this->userRepository = $userRepository;
        }
    }
    
  3. Parameter Sharing Copy parameters from Laravel’s config to Behat:

    extensions:
        FriendsOfBehat\CrossContainerExtension:
            containers:
                laravel:
                    parameters:
                        app.name: '%app.name%' # Copies Laravel's 'app.name' config
    

Integration Tips

  • Laravel-Specific: Use app() helper to access Laravel’s container:
    $containerService = $this->getService('laravel.container');
    $auth = $containerService->get('auth');
    
  • Dependency Chaining: Inject cross-container services into other services:
    services:
        user_service:
            class: App\Services\UserService
            arguments:
                - '@laravel.user_repository' # Cross-container dependency
    

Gotchas and Tips

Pitfalls

  1. Deprecation Warning

    • The package is archived (last release: 2018). Prefer SymfonyExtension v2 for modern Laravel/Behat setups.
    • Workaround: Use only for legacy projects or if migrating to SymfonyExtension v2 is infeasible.
  2. Frozen Containers

    • If Laravel’s container is frozen (e.g., in production), parameters may not copy correctly.
    • Fix: Use escape_values: true in config:
      containers:
          laravel:
              escape_values: true
      
  3. Circular Dependencies

    • Avoid injecting Behat services back into Laravel’s container (risk of infinite loops).
    • Tip: Use interfaces/abstracts to decouple dependencies.

Debugging

  • Service Not Found? Verify the service ID matches Laravel’s container:
    php artisan container:list | grep auth
    
  • Parameter Copy Fails Check if the parameter exists in Laravel’s config:
    $this->getService('laravel.container')->getParameter('app.name');
    

Extension Points

  1. Custom Container Factories Override ContainerService to support non-Laravel containers (e.g., PHP-DI):

    class CustomContainerService extends ContainerService
    {
        public function get($id) { /* Custom logic */ }
    }
    
  2. Dynamic Service Mapping Use a service locator pattern to resolve services at runtime:

    $service = $containerService->get('laravel')->get($dynamicId);
    
  3. Testing Mock cross-container services in tests:

    $containerService->expects($this)->method('get')->with('auth')->willReturn($mockAuth);
    
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.
codifyo/ts-generator-bundle
andydefer/laravel-cluster
testo/fiber
mintobit/jobqueue
a4sex/maintenance-bundle
a4sex/entity-date-update
a4sex/client-identifier
a4sex/base-utilites
a4sex/key-value-storage
a4sex/micro-status
chilldev/dependency-injection-extra
datinglibre/datinglibre-app-api
biberltd/corebundle
bricre/symfony-bundle-test
biberltd/logbundle
dominium/http-adapter-bundle
dominium/google-analytics
a4sex/auto-clean-entity
christhompsontldr/laravel-inky
spatie/mailcoach-vapor