picamator / object-manager
Utility to create objects
Requires
- php: ~5.6|~7.0
Requires (Dev)
- phpunit/phpunit: ~5.5
- satooshi/php-coveralls: ~1.0
This package is not auto-updated.
Last update: 2024-11-09 21:10:45 UTC
README
Master
Dev
Object Manager is one class tool to build objects supplied with a Singleton wrapper and unit test stub helper.
The main usage are:
- refactoring legacy code with unit-testable style without break backwards compatibility
- having one place for creating new instances
Installation
Update to your composer.json
with:
{ "require": { "picamator/object-manager": "~1.0" } }
Requirements
Examples
Legacy
Let's application has an UserRepository
:
<?php class UserRepository { private $connection; public function __construct() { $this->connection = new Connection(); } }
The Connection
instance here was created inside constructor make it hard to mock for unit testing.
One of the solution to keep backward compatibility is using ObjectManagerSingleton
:
<?php class UserRepository { private $connection; public function __construct() { $this->connection = ObjectManagerSingleton::getInstance()->create('Connection'); } }
Inside unit test before running the test needs to stub ObjectManagerSingleton
with mock ObjectManagerSingleton::setInstance($mockObjectManager)
.
Having such is open the door for mocking Connection
class.
Please follow link to find example source and unit test for them.
Factory
Let's application has a ConnectionFactory
:
<?php class ConnectionFactory { public function create() { return new Connection(); } }
With ObjectManager
it can be rewritten to:
<?php class ConnectionFactory { private $objectManager; private $className; public function __construct(ObjectManager $objectManager, $className = 'Connection') { $this->objectManager = $objectManager; $this->className = $className; } public function create() { return $this->objectManager->create($this->className); } }
As a result it's possible to use Dependency Injection to override $className
with new implementation.
With PHP 7 features ConnectionFactory
would look like:
<?php declare(strict_types=1); class ConnectionFactory { private $objectManager; private $className; public function __construct(ObjectManager $objectManager, string $className = 'Connection') { $this->objectManager = $objectManager; $this->className = $className; } public function create() : ConnectionInterface { return $this->objectManager->create($this->className); } }
Please follow link to find example source and unit test for them.
Statistics
Suppose application needs to collect objects statistics without using any additional tools.
The solution might be ObjectManager
overriding with injection in development environment.
Please follow link to find example source and unit test for them.
Documentation
Developing
To configure developing environment please:
- Follow Docker installation steps
- Run inside Docker container
composer install
Contribution
To start helping the project please review CONTRIBUTING.
License
ObjectManager is licensed under the MIT License. Please see the LICENSE file for details.