Home » Php » php – Pimple DI share depreciated. Now what?

php – Pimple DI share depreciated. Now what?

Posted by: admin July 12, 2020 Leave a comment

Questions:

In Pimple 1.0 I used to be able to share class instances like this:

$app['some_service'] = $app->share(function () {
    return new Service();
});

This now seems to be deprecated and I am unable to find what is the new way of doing this.

How to&Answers:

In Pimple 1.0 (Silex 1), you do this:

$app['shared_service'] = $app->share(function () {
    return new Service();
});

$app['non_shared_service'] = function () {
    return new Service();
};

In Pimple 3.0 (Silex 2) you do this (which is the opposite!):

$app['shared_service'] = function () {
    return new Service();
};

$app['non_shared_service'] = $app->factory(function () {
    return new Service();
});

Answer:

Seems that by pimple 3.0 (which Silex 2.0 uses) by default always returns the same instance of the service. You need to be explicit about it and use the factory function if you don’t want this behaviour.

Answer:

Depends of the Pimple version!

On Pimple 1.0

$container['shared'] = $container->shared(function(){
    return new Class();
});
$container['non_shared'] = function() {
    return new Class();
};

On Pimple 3.0

$container['shared'] = function() {
    return new Class();
};
$container['non_shared'] = $container->factory(function() {
    return new Class();
});

Remembering, when you create a shared service, what they return will not change. When you create a non shared service, every time you use, the Pimple will provide to you a new instance of it service.