picamator/object-manager

创建对象的实用工具

1.2.0 2017-04-04 19:24 UTC

This package is not auto-updated.

Last update: 2024-09-28 20:30:35 UTC


README

PHP 7 ready Latest Stable Version License SensioLabsInsight

主分支

Build Status Coverage Status

开发分支

Build Status Coverage Status

Object Manager 是一个用于构建对象的类工具,它提供了一个 Singleton 包装器和单元测试存根助手。

主要用途包括

  • 重构旧代码,以单元测试风格进行,同时不破坏向后兼容性
  • 在单一位置创建新实例

安装

更新你的 composer.json 文件

{
    "require": {
        "picamator/object-manager": "~1.0"
    }
}

需求

示例

旧代码

假设应用程序有一个 UserRepository

<?php
class UserRepository 
{
    private $connection;
    
    public function __construct() 
    {
        $this->connection = new Connection();    
    }
}

这里的 Connection 实例是在构造函数内部创建的,这使得它很难 模拟 进行单元测试。

保持向后兼容性的一个解决方案是使用 ObjectManagerSingleton

<?php
class UserRepository 
{
    private $connection;
    
    public function __construct() 
    {
        $this->connection = ObjectManagerSingleton::getInstance()->create('Connection');    
    }
}

在单元测试中,在运行测试之前需要用模拟的 ObjectManagerSingleton 存根,即调用 ObjectManagerSingleton::setInstance($mockObjectManager)。这样就可以为 Connection 类打开模拟的大门。

请点击链接找到示例源代码和单元测试。

工厂模式

假设应用程序有一个 ConnectionFactory

<?php
class ConnectionFactory 
{
    public function create() 
    {
        return new Connection();
    }
}

使用 ObjectManager 可以重写为

<?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);
    }
}

结果,可以使用依赖注入来覆盖 $className 的新实现。利用 PHP 7 的功能,ConnectionFactory 可能看起来像

<?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);
    }
}

请点击链接找到示例源代码和单元测试。

统计

假设应用程序需要收集对象统计信息,而不使用任何额外的工具。解决方案可能是使用 ObjectManager 在开发环境中进行注入。

请点击链接找到示例源代码和单元测试。

文档

开发

要配置开发环境,请

  1. 点击Docker 安装步骤
  2. 在 Docker 容器中运行 composer install

贡献

要开始帮助项目,请查看 CONTRIBUTING

许可

ObjectManager 在 MIT 许可下发布。有关详细信息,请参阅 LICENSE 文件。