Coder Social home page Coder Social logo

di's Introduction

Getting started with Cekta/DI

Telegram chat Mutation testing badge Latest Stable Version License

psr/container implementation for humans

Features

  • Supports Autowiring with automatic constructor-based configuration and variadic arguments.
  • Allows you to manually configure any dependency via closures.
  • Easy to improve and extend.
  • Contains everything you need.
  • Supports opcache compilation (fast).
  • High code quality (see the badges).

Install via composer

composer require cekta/di

Video tutorial (Russian).

Video Preview

di's People

Contributors

f3ath avatar fuale avatar joev1 avatar kriptogenic avatar pandatheslayer avatar smpl avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

di's Issues

Круговые зависимости

related to #24

<?php
class A {
  public function __construct(B $b) {}
}
class B {
  public function __construct(A $a){}

$providers[] = new Autowire();
$container = new Container(...$providers);
$container->(A::class); // infinite recursion...

php 8.2 union type intercept

В union type можно указывать &

<?php

class A
{
    public function __construct((B & C) | D $c)
    {
        $this->c = $c;
    }
}

interface B{};

interface C{};

interface D{};

Сейчас текущая реализация понятие не имеет какую брать реализацию для B & C

ContainerCompiler

Необходимо реализовать ContainerCompiler который будет генерировать Container оптимизированный для production и все это интегрировать в ContainerBuilder во время компиляции учитывать все остальные параметры и настройки

public compile(array $classes, string $class_name = 'ContainerCompiled', string $namespace = '\App'): string 

variadic support

class Magic
{
   public function __construct(...$args)
   {}
}

Пример varidic в который автоматически не иньектятся зависимости

Другие di как провайдеры к моей библиотеки

Существуют другие библиотеки (например php-di/php-di) которые имплементят psr/container

Мы возьмем одну из популярных библиотек и попробуем сделать ее провайдером к моей библиотеке, причем сложность в том что она должна поддерживать старый вариант конфигурации, но иметь возможность изменить параметры из моего контейнера если другой провайдер будет объявлен раньше.

Для примера возьмем библиотеку http://php-di.org/

drop RuleInterface

Его использование только осложняет код

Выпилить Service

Вместо использования Service сделать чтобы так воспринимались анонимные функции (Closure) и тогда сервис не будет нужен.

Объединить cekta/di-simple-cache и cekta/di-cache в cekta/di

Для меньшего числа зависимостей я разделили кэширование провайдеров в отдельные репозитории:

  • cekta/di-cache
  • cekta/di-simple-cache

Возможно их стоит объединить и влить в этот, чтобы упростить работу разработчику

php8 совместимость

В php8 депрекейтили некоторые методы рефлекшн


Deprecated: Method ReflectionParameter::getClass() is deprecated in D:\OpenServer\domains\bulk.loc\vendor\cekta\di\src\Provider\Autowiring.php on line 64

Настройки для конкретных зависимостей

Необходимо сделать возможность сделать настройки которые применять к определенным классам (или пакетам)

Например есть 2 пакета где есть классы которые принимают аргумент $username, нужно чтобы в один пакет уходило одно значение. а в другой пакет другое значение.

для этого надо в билдере сделать метод который будет принимать массив следующего вида

[
   'Vendor\\Package' => ['username' => 'other_username']
]

тогда это правило будет применяться ко всем зависимостям загружаемым через Autowiring где имя зависимости соответствует регулярному выражению указаному в Vendor\Package, имя зависимости username будет трансформирвоанно в other_username

тогда в обычных параметрах можно будет объявить 2 параметра

$builder->setParams([
  'username' => 'одно',
  'other_username' => 'другое'
]);

таких правил в регулярном выражение может быть сколько угодно как и регулярных выражений, для этого надо модифицировать Reflection чтобы она при получение зависимостей учитывала эти правила

Использовать hashed key в AutowiringSimpleCache

https://github.com/cekta/di/blob/master/src/Provider/AutowiringSimpleCache.php#L43
из за того что используется id если он будет длинней чем максимальная длина ключа в cache то cache будет падать с исключением, нужно использовать $key длинна которой никогда не превысит макисмальную длинну ключа для cache

Передавать текущий объект контейнера в сервис, запрашивающий его.

Exception: Uncaught Cekta\DI\Exception\NotFound: Container Cekta\DI\ProviderInterface not found.

Как повторить:

  • app/Application.php
<?php

namespace App;

class Application
{
    private $service;

    public function __construct(SomeService $service)
    {
        $this->service = $service;
    }
}
  • app/SomeService.php
<?php

namespace App;

use Cekta\DI\Container;

class SomeService
{
    private $container;

    public function __construct(Container $container)
    {
        $this->container = $container;
    }
}
  • index.php
<?php

require_once './vendor/autoload.php';
$providers[] = new \Cekta\DI\Provider\Autowire();
$container = new \Cekta\DI\Container(...$providers);
$application = $container->get(\App\Application::class);

var_dump($application);

Ожидание: Объект Application
Реальность: Exception

Кэшировать обращение к провайдерам в контейнере

При загрузке зависимости каждый раз происходит поиск провайдера и загрузка через него, можно сохранять результат и возвращать уже готовый результат, это позволит не делать загрузку каждый раз и все возвращать инстанс одного и тоже объекта.

Пример

$providers[] = new KeyValue(['a' => new Service(function () {
   return new stdClass;
})])
$container = new Container(...$providers);
$a1 = $container->get('a');
$a2 = $container->get('a');

$this->assertSame($a1, $a2); // на текущий момент это утверждение не выполняется.

Add possibility dump/compile container

this can be useful to:

  1. Check for any potential issues such as circular references
  2. Make the container more efficient resolving parameters/removing unused services
  3. Ability to declare own "compilers" to control behavior or provide external features

Using cachedContainer also fix #16
And it's huge performance update, suggest PhpDumper or similar, also great works with OPCache

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.