|  Download ObjectManager      
 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 InstallationUpdate to your composer.jsonwith: {
    "require": {
        "picamator/object-manager": "~1.0"
    }
}
 RequirementsExamplesLegacyLet'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 `ObjectManagerSingletonwith mockObjectManagerSingleton::setInstance($mockObjectManager)`.
Having such is open the door for mocking`Connection` class. Please follow link to find example source and unit test for them. FactoryLet'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. StatisticsSuppose 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. DocumentationDevelopingTo configure developing environment please: 
Follow Docker installation steps
Run inside Docker container `composer install`
 ContributionTo start helping the project please review CONTRIBUTING. LicenseObjectManager is licensed under the MIT License. Please see the LICENSE file for details. |