roave/behat-psr11extension

PSR-11 Container extension for Behat

Maintainers

👁 asgrim

Package info

github.com/Roave/behat-psr11extension

pkg:composer/roave/behat-psr11extension

Statistics

Installs: 350 631

Dependents: 3

Suggesters: 0

Stars: 41

Open Issues: 6

2.8.0 2025-12-08 18:17 UTC

Requires

Suggests

None

Provides

None

Conflicts

None

Replaces

None

MIT 498e342637a9c846c6dc6139eff25cdb60577dc6

  • James Titcumb <james.woop@asgrim.com>

README

👁 Build Status
👁 Scrutinizer Code Quality
👁 Code Coverage
👁 Latest Stable Version
👁 License

Allows injecting services from a PSR-11-compatibile container in a Behat context.

Created with lots of help from @ciaranmcnulty.

Usage

First require the extension and dependencies with Composer:

$ composer require --dev roave/behat-psr11extension

First, if you don't already have one, create a file that will be included by the extension that returns a PSR-11 compatible container, for example using Laminas\ServiceManager:

<?php
declare(strict_types=1);

use Laminas\ServiceManager\Config;
use Laminas\ServiceManager\ServiceManager;

// Load configuration
$config = require __DIR__ . '/config.php';

// Build container
$container = new ServiceManager();
(new Config($config['dependencies']))->configureServiceManager($container);

// Inject config
$container->setService('config', $config);

return $container;

Then enable the extension in behat.yml:

 extensions:
 Roave\BehatPsrContainer\PsrContainerExtension:
 container: 'config/container.php'

Then enable the use of the psr_container service container (this is provided by the extension) in your behat.yml suite configuration, for example:

default:
 suites:
 my_suite:
 services: "@psr_container"

And finally, add the names of any services required by your contexts in behat.yml, for example:

default:
 suites:
 my_suite:
 services: "@psr_container"
 contexts:
 - MyBehatTestSuite\MyContext:
 - "@Whatever\\Service\\Name"

You can also use behat's built-in autowire feature, to automatically inject the dependencies to the context:

default:
 suites:
 my_suite:
 autowire: true
 services: "@psr_container"
 contexts:
 - MyBehatTestSuite\MyContext

If for some reason you want to use a name other than psr_container for the container (e.g. collision with another extension) this can be overridden:

 extensions:
 Roave\BehatPsrContainer\PsrContainerExtension:
 container: 'config/container.php'
 name: 'my_container'

Just for clarity (and hopefully ease of understanding), this would be the equivalent of doing this in plain PHP:

<?php
declare(strict_types=1);

$container = require 'config/container.php';

$context = new \MyBehatTestSuite\MyContext($container->get('Whatever\Service\Name'));