juliangut / slim-php-di
Slim Framework PHP-DI container integration
Fund package maintenance!
juliangut
Installs: 20 304
Dependents: 1
Suggesters: 0
Security: 0
Stars: 14
Watchers: 5
Forks: 3
Open Issues: 1
Requires
- php: ^7.4|^8.0
- ext-json: *
- ext-mbstring: *
- php-di/php-di: ^6.3
- psr/container: ^1.1
- slim/slim: ^4.8
Requires (Dev)
- bnf/phpstan-psr-container: ^1.0
- grifart/phpstan-oneline: ~0.4
- infection/infection: ~0.24
- juliangut/easy-coding-standard-config: ^1.0
- laminas/laminas-diactoros: ^2.2
- overtrue/phplint: ^3.0|^4.0
- phpcompatibility/php-compatibility: ^9.3
- phpmd/phpmd: ^2.10
- phpstan/extension-installer: ^1.1
- phpstan/phpstan: ^1.0
- phpstan/phpstan-deprecation-rules: ^1.0
- phpstan/phpstan-strict-rules: ^1.0
- phpunit/phpunit: ^9.5
- povils/phpmnd: ^2.5
- roave/security-advisories: dev-master
- sebastian/phpcpd: ^6.0
- thecodingmachine/phpstan-strict-rules: ^1.0
README
Slim Framework PHP-DI container integration
PHP-DI dependency injection container integration for Slim framework.
Installation
Best way to install is using Composer:
composer require juliangut/slim-php-di
Then require_once the autoload file:
require_once './vendor/autoload.php';
Usage
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
Configuration
use Jgut\Slim\PHPDI\Configuration; use Jgut\Slim\PHPDI\ContainerBuilder; $settings = [ 'ignorePhpDocErrors' => 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);
PHP-DI settings
useAutoWiring
whether to use auto wiring (true by default)useAnnotations
whether to use annotations (false by default)useDefinitionCache
, whether to use definition cache (false by default)ignorePhpDocErrors
, whether to ignore phpDoc errors on annotations (false by default)wrapContainer
wrapping container (none by default)proxiesPath
path where PHP-DI creates its proxy files (none by default)compilationPath
path where PHP-DI creates its compiled container (none by default)
Refer to PHP-DI documentation to learn more about container configurations
In order for you to use annotations you have to require doctrine/annotations
. Review documentation
Additional settings
definitions
an array of paths to definition files/directories or arrays of definitions. Definitions are loaded in order of appearancecontainerClass
container class used on the build. Must implement\Psr\Container\ContainerInterface
,\DI\FactoryInterface
and\DI\InvokerInterface
(\Jgut\Slim\PHPDI\Container
by default)
Container array access shorthand
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([])); $container->get('configs')['database']['dsn']; // given "configs" is an array $container->get('configs.database.dsn'); // same as above
Notice
Be careful though not to shadow any array key by using dots in keys itself
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 thrown
The easiest way to avoid this from ever happening is by NOT using dots in array keys
Invocation strategy
By default, slim-php-di sets a custom invocation strategy that employs PHP-DI's Invoker to fulfill callable parameters, it is quite handy and 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 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), ];
Migration from 2.x
- Minimum Slim version is now 4.8
- Container only provides implementations of the interfaces needed to instantiate an App. Refer to Slim's documentation
- You can extract Slim's App directly from container or seed AppFactory from container
- Slim's App is not extended anymore
- ArrayAccess and magic methods on default container are deprecated and will be removed on next major release. Use PSR-11 and PHP-DI's methods instead
Contributing
Found a bug or have a feature request? Please open a new issue. Have a look at existing issues before.
See file CONTRIBUTING.md
License
See file LICENSE included with the source code for a copy of the license terms.