定制 olvlvl/symfony-dependency-injection-proxy 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

olvlvl/symfony-dependency-injection-proxy

最新稳定版本:v5.0.0

Composer 安装命令:

composer require olvlvl/symfony-dependency-injection-proxy

包简介

Generate super tiny proxies for Symfony's dependency injection

README 文档

README

Release Packagist Code Quality Code Coverage

This package provides a proxy generator for Symfony's dependency injection component that generates super tiny, super simple proxies, especially when compared to Symfony's default implementation. Here are some differences:

  • Can proxy final classes.
  • Can only proxy classes with interfaces.
  • The generated proxies are self-contained.
  • The package is ~10Kb and doesn't have dependencies.
  • The package can be removed once the proxies have been generated.

If you're not familiar with proxy services, better have a look at Symfony's documentation before going any further.

Installation

composer require olvlvl/symfony-dependency-injection-proxy

How it works

The generator works with the following assumptions: the service we want to proxy implements an interface, and services using that service expect that interface, following the dependency inversion principle. Now, consider the following code, where an ExceptionHandler service requires a logger implementing LoggerInterface:

<?php

use Psr\Log\LoggerInterface;

class ExceptionHandler
{
    public function __construct(private LoggerInterface $logger)
    {
    }

    // …
}

Imagine we're using Monolog as logger, and we have an expansive stream to set up. Why waste time building the logger for every request when it's seldom used? That's when we mark our service as lazy.

The following example demonstrates how we can mark our Psr\Log\LoggerInterface service as lazy (we could use PHP code or XML just the same):

services:
  Psr\Log\LoggerInterface:
    class: Monolog\Logger
    lazy: true
    #

The service can also use a factory:

services:
  Psr\Log\LoggerInterface:
    factory: 'LoggerFactory::build'
    lazy: true
    #

Note: We don't have to define our service with a class, we could use logger instead of Psr\Log\LoggerInterface just > the same, except we would have to define class for the factory one.

Now let's see how to build our container.

Building the dependency injection container

The following code demonstrates how to build, compile, and dump a container:

<?php

use olvlvl\SymfonyDependencyInjectionProxy\ProxyDumper;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Dumper\PhpDumper;

$builder = new ContainerBuilder();

// …
// Here we load our config, or build the container using clever PHP calls.
// We might even have some compiler passes to add.
// …

$builder->compile();

$dumper = new PhpDumper($builder);
$dumper->setProxyDumper(new ProxyDumper());

/* @var string $containerFile */

file_put_contents($containerFile, $dumper->dump());

There you have it. We can use our container as usual and everything is awesome.

What if my lazy service implements multiple interfaces?

The basic interface resolver will have a hard time figuring out which interface to implement if a service implements many. For instance, if a service was an instance of ArrayObject the following exception would be thrown:

Don't know which interface to choose from for ArrayObject: IteratorAggregate, Traversable, ArrayAccess, Serializable, Countable.

We can specify the interface to implement using the lazy attribute:

ArrayObject:
  lazy: ArrayAccess

Continuous Integration

The project is continuously tested by GitHub actions.

Tests Static Analysis Code Style

Code of Conduct

This project adheres to a Contributor Code of Conduct. By participating in this project and its community, you are expected to uphold this code.

Contributing

Please see CONTRIBUTING for details.

License

olvlvl/symfony-dependency-injection-proxy is released under the BSD-3-Clause.

统计信息

  • 总下载量: 7.3k
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 4
  • 点击次数: 0
  • 依赖项目数: 1
  • 推荐数: 0

GitHub 信息

  • Stars: 4
  • Watchers: 0
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: BSD-3-Clause
  • 更新时间: 2018-10-14

承接程序开发

PHP开发

VUE

Vue开发

前端开发

小程序开发

公众号开发

系统定制

数据库设计

云部署

网站建设

安全加固