Skip to content

Latest commit

 

History

History
83 lines (58 loc) · 1.92 KB

pimple.md

File metadata and controls

83 lines (58 loc) · 1.92 KB
currentMenu
pimple

Pimple

As explained in the dependency injection documentation, Silly can work with any PSR-11 dependency injection container.

Pimple provides less features than the PHP-DI edition (for example no autowiring) but might interest those already familiar with it, e.g. Silex users.

Installation

$ composer require pimple/pimple ^3.0

Usage

Use Pimple as an application container:

$container    = new \Pimple\Container();
$psrContainer = new \Pimple\Psr11\Container($container);

$app = new \Silly\Application();
$app->useContainer($psrContainer);

You can store command callables in the container:

class MyCommand
{
    public function execute($name, OutputInterface $output)
    {
        if ($name) {
            $text = 'Hello, '.$name;
        } else {
            $text = 'Hello';
        }

        $output->writeln($text);
    }
}

$pimple = $app->getContainer();

$pimple['command.greet'] = function () {
    return new MyCommand();
};

$app->command('greet [name]', 'command.greet');

$app->run();

Dependency injection in parameters

You can also use dependency injection in parameters:

use Psr\Logger\LoggerInterface;

// ...

$pimple = $app->getContainer();

$pimple['dbHost'] = 'localhost';
$pimple[LoggerInterface::class] = function () {
    new Monolog\Logger(/* ... */);
};

$app->command('greet [name]', function ($name, $dbHost, LoggerInterface $logger) {
    // ...
});

$app->run();

Dependency injection in parameters follows the precedence rules explained in the dependency injection documentation:

  • command parameters are matched in priority using the parameter names ($name)
  • then container entries are matched using the callable type-hint (Psr\Logger\LoggerInterface)
  • finally container entries are matched using the parameter names ($dbHost)