Comments 21
- Интерфейс ArrayAccess, прост в использование но выглядит криво в ООПшном коде.
- Настраивается извне, что как я уже писал выше мне не нравится. Я хочу чтобы контейнер инкапсулировал свою логику
- Нет статического интерфейса. Как по мне, кому-то то это тоже понадобится
- Нет доступа к глубоким значением по точке, что выглядит не так красиво как с ней
- Поскольку для вложенности надо создавать несколько контейнеров, то в случае если сервиса нет, вы получите только имя последнего ключа (например просто repository) вместо полного (user.repository).
- Нет аналога $this->instance()
Если сдается примитивным, пишите которые фичи вам надо, может и появляться =)
2. Я всегда сначала пишу статью на хабр, смотрю фидбек, перевожу на англ и тогда уже ставлю в доку. Так что статья это бета тест доков ))
3. Спасибо, на самом деле у меня PHPStorm, но вот как раз эту либу писал в Атоме
как я писал в самом начале статьи, совсем не люблю конфигурацию зависимостей в конфиг файлах, а настройка его через PHP более громоздка, e.g.:
$container
->register('newsletter_manager', 'NewsletterManager')
->addArgument(new Reference('mailer'));
// вместо
$this->instance('newsletter_manager', NesletterManager::class, ['@mailer']);
> Поясните, что вы конкретно имеете ввиду, используя устоявшуюся терминологию.
Настраивать PHPixie DI можно только изнутри самого класса во время создания екземпляра через protected методы. То нельзя просто так взять и добавить новое значение где-то потом в рантайме, как с Pimple:
// может случится где угодно
$container['session_storage'] = function ($c) {
return new SessionStorage('SESSION_ID');
};
> Это ухудшает взаимодействие и опускает DI до уровня Service Locator или синглтонофасадов Laravel.
Как я уже писал вначале статьи, я считаю что контейнеры сильно проигрывают стандартным классам фабрик, и этот компонент написан на случай «если кому-то очень хочется контейнер». Если разработчик сам вправе решать использовать контейнер или нет, он также должен иметь право использовать синглофасады если захочет. Конечно же никто не мешает просто их не использовать если не хочется.
Я не спорю конечно что компонент симфони в совсем другой лиге. PHPixie DI больше создает конкуренцию легковесным контейнерам типа Пимпл и Аура
Не вижу никаких плюсов по сравнение с ним
На самом деле все это дело вкуса, так как самое важное это насколько вам нравится работа с контйнером. Я думаю phpixie di достаточно отличается своим интерфейсом от других чтобы не быть велосипедом, а вот какой интерфейс работы нравится больше уже решать вам.
А вот авто разруливание сомнительная фича имхо, к тому же в случае если конструкторы принимвют интерфейсы, то настараивать какой сервис использовать вместо интерфейса все равно надо вручную
Так сложно задать мэпу соответствий интерфейс => реализация, прям уж никак. Что до автосвязывания — это на самом деле очень мощная штука, в том плане что разработчики обычно ленивы, а так вся эта "магия" не будет им мешать делать больше объектов вместо пары жирных "что бы не конфигурить ничего".
К тому же аура использует подход с ArrayAccess как и Pimpl.
мы точно про dependency injection? ну мол я к тому что какая разница если в нашем коде контейнер использоваться не должен.
Если делать автоваиринг, то ваш разработчик может смело получить доступ к сервису, к которому скорее всего ему совсем не нужно обращаться. И как раз фабрики позволяют лучше это организовать.
Если делать автоваиринг, то ваш разработчик может смело получить доступ к сервису, к которому скорее всего ему совсем не нужно обращаться.
А если не делать этот же разработчик будет меньше дробить систему, потому что лень делать фабрики. Проходили.
Я эту проблему решил при помощи deptrac который просто не даст закоммитить такой код.
Но как мне кажется, подойдёт для не очень больших проектов, расскажу почему.
Условно в большом проекте у меня 50 классов с бизнес-логикой, в которых там что-то инжекститься.
Сами же эти сервисы инжектятся в контроллер, что-то в духе
class SomeController
{
/**
* @var SomeLogicService $service
*/
private $service;
public function __construct(SomeLogicService $service)
{
$this->service = $service;
}
}
class SomeLogicService
{
/**
* @var AnotherLogicService $service
*/
private $service;
public function __construct(AnotherLogicService $service)
{
$this->service = $service;
}
}
Без auto-wiring мне придётся все 50 классов описывать в контейнере, в том числе и контроллер. А это несколько неудобно.
С auto-wiring остаточно описать контроллер в контейнере.
Так это работает в Laravel и Symfony (по крайней мере я так это использую)
Но как я писал, все это дело вкуса, это лишь еще одна альтернатива. И поскольку он опциональный, то вы смело можете использовать любой другой DI компонент с PHPixie фреймворком.
На самом деле во всех своих проектах я использую фабрики
А зачем если эти фабрики можно сгенерировать (так собственно симфони и делает). Ну то есть я понимаю, все явно, все круто, но мне это не интересно как потенциальному пользователю.
но тогда надо еще рефлексию парсить и как-то кешировать метаданные.
Никаких проблем, опциональный кэш, или кодогенерация и тогда все будет делать за нас opcache. И ставить ничего дополнительно не нужно.
С auto-wiring остаточно описать контроллер в контейнере.
https://github.com/Symplify/ControllerAutowire — прошу, можно и контроллеры не описывать. Нужно будет только для интерфейсов имплементации обозначить и если декорацией увликаетесь.
в Laravel 5 такие контроллеры например из коробки идут.
суть в общем в том была, что так или иначе контроллеры описать придётся при такой схеме, а вот всё остальное уже «автовайриться» будет
Dependency Injection контейнер от PHPixie