PHP-DI dependency injection container integration for Slim framework.
Best way to install is using Composer:
composer require juliangut/slim-php-di
Then require_once the autoload file:
require_once './vendor/autoload.php';Use Jgut\Slim\PHPDI\ContainerBuilder to create PHP-DI container and extract Slim's App from it
use Jgut\Slim\PHPDI\Configuration;
use Jgut\Slim\PHPDI\ContainerBuilder;
use Psr\Container\ContainerInterface;
use Slim\App;
$container = ContainerBuilder::build(new Configuration());
$app = $container->get(App::class);
// same as $app = \Slim\Factory\AppFactory::createFromContainer($container);
// Register your services if not provided as definitions
$container->set('service_one', function (ContainerInterface $container): ServiceOne {
return new ServiceOne($container->get('service_two'));
});
// Set your routes
$app->run();In order to register services in the container it's way better to do it in definition files
use Jgut\Slim\PHPDI\Configuration;
use Jgut\Slim\PHPDI\ContainerBuilder;
$settings = [
'useAttributes' => true,
'compilationPath' => '/path/to/compiled/container',
];
$configuration = new Configuration($settings);
// Settings can be set after creation
$configuration->setProxiesPath(sys_get_temp_dir());
$configuration->setDefinitions('/path/to/definition/files');
$container = ContainerBuilder::build($configuration);useAutoWiringwhether to use auto wiring (true by default)useAttributeswhether to use attributes (false by default)useDefinitionCache, whether to use definition cache (false by default)wrapContainerwrapping container (none by default)proxiesPathpath where PHP-DI creates its proxy files (none by default)compilationPathpath where PHP-DI creates its compiled container (none by default)
Refer to PHP-DI documentation to learn more about container configurations
definitionsan array of paths to definition files/directories or arrays of definitions. Definitions are loaded in order of appearancecontainerClasscontainer class used on the build. Must implement\Psr\Container\ContainerInterface,\DI\FactoryInterfaceand\DI\InvokerInterface(\Jgut\Slim\PHPDI\Containerby default)
Default \Jgut\Slim\PHPDI\Container container allows shorthand array access by concatenating array keys with dots. If any key in the chain is not defined, normal Psr\Container\NotFoundExceptionInterface exception is thrown
use Jgut\Slim\PHPDI\Configuration;
use Jgut\Slim\PHPDI\ContainerBuilder;
$container = ContainerBuilder::build(new Configuration([]));
$configs = [
'database' => [
'dsn' => 'mysql://root:pass@localhost/my_ddbb',
],
];
$container->set('configs', $configs);
$container->get('configs')['database']['dsn'];
$container->get('configs.database.dsn'); // same as aboveBe careful though not to shadow any array key by using dots in keys themselves
use Jgut\Slim\PHPDI\Configuration;
use Jgut\Slim\PHPDI\ContainerBuilder;
$container = ContainerBuilder::build(new Configuration([]));
$configs = [
'foo' => [
'bar' => [
'baz' => 'shadowed!', // <== watch out!
],
],
'foo.bar' => 'bingo!',
];
$container->set('configs', $configs);
$container->get('configs.foo.bar'); // bingo!
$container->get('configs.foo.bar.baz'); // NotFoundExceptionInterface thrownThe easiest way to avoid this from ever happening is by NOT using dots in array keys
By default, slim-php-di sets a custom invocation strategy that employs PHP-DI's Invoker to fulfill callable parameters, it lets you do things like this
use Jgut\Slim\PHPDI\Configuration;
use Jgut\Slim\PHPDI\ContainerBuilder;
use Psr\Http\Message\ResponseInterface;
use Slim\App;
$container = ContainerBuilder::build(new Configuration([]));
$app = $container->get(App::class);
$app->get('/hello/{name}', function (ResponseInterface $response, string $name, \PDO $connection): ResponseInterface {
// $name will be injected from request arguments
// $connection will be injected directly from the container
$response->getBody()->write('Hello ' . $name);
return $response;
});
$app->run();If you prefer default Slim's Slim\Handlers\Strategies\RequestResponse strategy or any other of your choosing you only have to set it in a definition file
use Slim\Handlers\Strategies\RequestResponse;
use Slim\Interfaces\InvocationStrategyInterface;
use function DI\create;
return [
InvocationStrategyInterface::class => create(RequestResponse::class),
];use Symfony\Component\Console\Application;
use Jgut\Slim\PHPDI\Command\ListCommand;
/** @var \Slim\App $app */
$container = $app->getContainer();
$cli = new Application('Slim CLI');
$cli->add(new ListCommand($container));
$app->run();List defined container definitions supporting searching
php -f cli.php slim:container:list --help- PHP minimum required version is PHP 8.0
- Moved to PHP-DI 7. Annotations have been removed, use Attributes
Found a bug or have a feature request? Please open a new issue. Have a look at existing issues before.
See file CONTRIBUTING.md
See file LICENSE included with the source code for a copy of the license terms.