Allows injecting services from a PSR-11-compatibile container in a Behat context.
Created with lots of help from @ciaranmcnulty.
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'));