Injecting in the constructor when using pimple

139 Views Asked by At

Background. I am using Slim where an ID is either in the endpoint or parameters. Based on the ID, a factory creates the appropriate object to perform the needed action.

I have a service which needs some data obtained in the request injected into it. I could therefore do the following:

//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'];

But the service is not used in index.php where the service is defined but in another class, so i can do the following:

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

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

But I want to use the instance assigned in index.php, so I can do the following:

$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();

But using the container to pass data just seems wrong.

How should data be injected in a pimple service if that data is not known when the service is defined?

0

There are 0 best solutions below