Фон. Я использую 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();
Но использование контейнера для передачи данных кажется неправильным.
Как следует вводить данные в службу pimple, если эти данные неизвестны при определении службы?