Git Product home page Git Product logo

slim-php-di's Introduction

PHP version Latest Version License

Total Downloads Monthly Downloads

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 = [
    '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);

PHP-DI settings

  • useAutoWiring whether to use auto wiring (true by default)
  • useAttributes whether to use attributes (false by default)
  • useDefinitionCache, whether to use definition cache (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

Additional settings

  • definitions an array of paths to definition files/directories or arrays of definitions. Definitions are loaded in order of appearance
  • containerClass 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([]));

$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 above

Notice

Be 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 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 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),
];

Console command

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 container definitions

List defined container definitions supporting searching

php -f cli.php slim:container:list --help

Migration from 3.x

  • PHP minimum required version is PHP 8.0
  • Moved to PHP-DI 7. Annotations have been removed, use Attributes

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.

slim-php-di's People

Contributors

dependabot[bot] avatar juliangut avatar nbayramberdiyev avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

slim-php-di's Issues

PHPMD check fails, fix needed?

There is a PHPMD check put aside to pass the build

design.CouplingBetweenObjects

Maximum should be 13, but it's been raised to 18 because Jgut\Slim\PHPDI\Container has plenty of dependencies on Slim and Pimple

Don't know if it really need fix or it is OK to leave it, Slim\Container has even more deps

fix README.md

in readme is written "use Jgut\Slim\PHPDI\ContinerBuilder;" but the correct is "use Jgut\Slim\PHPDI\ContainerBuilder;"

Upgrade to Slim 4.2

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.