Внедрение в конструктор при использовании прыщей

Фон. Я использую Slim, где идентификатор находится либо в конечной точке, либо в параметрах. На основе идентификатора фабрика создает соответствующий объект для выполнения необходимого действия.

У меня есть сервис, которому нужны данные, полученные в запросе. Поэтому я мог бы сделать следующее:

//index.php
require '../vendor/autoload.php';
use Pimple\Container;
$container = new Container();

class SomeService
{
    private $dataFromTheRequest;
    public function __construct($dataFromTheRequest){
        $this->dataFromTheRequest=$dataFromTheRequest;
        echo($dataFromTheRequest);
    }
}

$dataFromTheRequest='stuff1';
$container['someService1'] = function ($c) use($dataFromTheRequest) {
    return new SomeService($dataFromTheRequest);
};
$someService=$container['someService1'];

Но служба используется не в index.php, где она определена, а в другом классе, поэтому я могу сделать следующее:

class SomeOtherClass1
{
    public function someMethod($dataFromTheRequest){
        $someService=new SomeService($dataFromTheRequest);
    }

}
$someOtherClass1=new SomeOtherClass1();
$someOtherClass1->someMethod('stuff2');

Но я хочу использовать экземпляр, назначенный в index.php, поэтому я могу сделать следующее:

$container['someService2'] = function ($c) {
    return new SomeService($c['dataFromTheRequest']);
};
class SomeOtherClass2
{
    public function __construct($container){
        $this->container=$container;
    }
    public function someMethod($dataFromTheRequest){
        $this->container['dataFromTheRequest']='stuff3';
        $someService=$this->container['someService2'];
    }

}
$someOtherClass2=new SomeOtherClass2($container);
$someOtherClass2->someMethod();

Но использование контейнера для передачи данных кажется неправильным.

Как следует вводить данные в службу "прыщ", если эти данные неизвестны при определении службы?

0 ответов

Другие вопросы по тегам