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.
Installation
composer require friends-of-behat/cross-container-extension --dev
Enable in behat.yml
default:
extensions:
FriendsOfBehat\CrossContainerExtension: ~
Pair with Required Extensions Ensure you have either:
FriendsOfBehat/ContextServiceExtension (for context injection)FriendsOfBehat/ServiceContainerExtension (for service container access).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'
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'
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;
}
}
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
app() helper to access Laravel’s container:
$containerService = $this->getService('laravel.container');
$auth = $containerService->get('auth');
services:
user_service:
class: App\Services\UserService
arguments:
- '@laravel.user_repository' # Cross-container dependency
Deprecation Warning
SymfonyExtension v2 for modern Laravel/Behat setups.Frozen Containers
escape_values: true in config:
containers:
laravel:
escape_values: true
Circular Dependencies
php artisan container:list | grep auth
$this->getService('laravel.container')->getParameter('app.name');
Custom Container Factories
Override ContainerService to support non-Laravel containers (e.g., PHP-DI):
class CustomContainerService extends ContainerService
{
public function get($id) { /* Custom logic */ }
}
Dynamic Service Mapping Use a service locator pattern to resolve services at runtime:
$service = $containerService->get('laravel')->get($dynamicId);
Testing Mock cross-container services in tests:
$containerService->expects($this)->method('get')->with('auth')->willReturn($mockAuth);
How can I help you explore Laravel packages today?