gixx/worstpractice-dependency-injection

一个简单的依赖注入容器

1.1.0 2022-11-10 12:46 UTC

This package is auto-updated.

Last update: 2024-09-23 14:55:33 UTC


README

DIY 依赖注入

PHP Version Build Status Scrutinizer Code Quality PHStan Code Coverage Packagist Package Packagist Downloads

系列文章《DIY 依赖注入容器》的完整源代码,包括第 1、2 和 3 部分。

目的

唯一目的是实践

  • PHP 7.4, 8.0, 8.1 和 8.2 特性
  • 保持编码标准
  • 编写干净的代码
  • 编写严格类型的代码
  • 单元测试

尽管我相信它像任何其他 DIC 一样工作,但我不建议在生产环境中使用它。遗憾的是,Scrutinizer CI 侧的代码质量检查目前还不支持 PHP 8.2。

安装

要将此包添加到您的项目,只需通过 composer 获取即可

composer require gixx/worstpractice-dependency-injection

使用

要使用它,您只需要一个配置,如下例所示

namespace MyNamespace;

use WorstPractice\Component\DependencyInjection\ConfigParser\ArrayParser;
use WorstPractice\Component\DependencyInjection\ServiceLibrary;
use WorstPractice\Component\DependencyInjection\Container;

$config = [
    'ServiceAlias' => [
        'class' => \Namespace\To\MyClass::class,
        'arguments' => [
            \Namespace\To\OtherClassInterface::class,
            'literalParameter' => 1234,
            'otherLiteralParameter' => false
        ],
        'shared' => false           
    ],
    \Namespace\To\OtherClassInterface::class => [
        'class' => \Namespace\To\OtherClass::class,
        'shared' => true
    ],
    \DateTimeZone::class => [
        'arguments' => [
            'param' => 'Europe/Berlin'
        ],
        'shared' => true
    ],
    \DateTime::class => [
        'calls' => [
            ['setTimezone', [\DateTimeZone::class]]
        ],
        'shared' => true
    ],
    'Auth' => [
        // empty, will be determined later
    ],
    'OtherServiceAlias' => [
        'inherits' => 'ServiceAlias',
        'calls' => [
            ['someMethod', ['parameter1' => 4543, 'parameter2' => [0, 1, 2], \DateTime::class]]
        ],
        'shared' => true       
    ],
    'LoginController' => [
        'class' => \Namespace\To\Controller\Login:class,
        'arguments' => [
            'Auth',
            'OtherServiceAlias'
        ]   
    ]
];

$container = new Container(new ServiceLibrary(new ArrayParser()), $config);

$authService = $_ENV['environment'] === 'dev'
    ? new \Namespace\To\DebugAuthService()
    : new \Namepace\To\Strict\AuthenticationService();
$isShared = true;

$container->set('Auth', $authService, $isShared);

$controller = $container->get('LoginController');

此 DIC 仅在请求或被请求的类引用时才实例化任何类。它还支持将实例添加到 DIC 中。当脚本需要基于某些计算的实例时,它非常有用。

测试

该包包含一个简单的 Docker 设置,可以运行测试。为此,您只需运行以下命令

docker-compose up -d
docker exec -it worstpractice-dependency-injection-php-fpm php composer.phar install
docker exec -it worstpractice-dependency-injection-php-fpm php composer.phar check

以下测试将运行

  • PHP lint
  • PHP Mess Detector
  • PHP Unit
  • PHPStan(最大级别,无忽略错误)

PHP Unit

PHPStan

以下测试现在已忽略 PHP 7.4 版本的测试,因为它们尚不支持 PHP 8.2

  • PHP-CS-Fixer
  • PHP Code Sniffer