Size: a a a

2021 March 11

MM

Maksim Masiukevich in PHP
источник

ВУ

Валентин Удальцов... in PHP
Artem Molotov
в параметре метода?
да, ты проектируешь контракт точки расширения так, чтобы всё полезное, что мутирует, она получала в методе
источник

ВУ

Валентин Удальцов... in PHP
тогда у тебя сервисы отдельно, стейт в памяти отдельно
источник

SZ

Sergey Zolotov in PHP
зависимости со стейтом?
источник

AM

Artem Molotov in PHP
Валентин Удальцов
тогда у тебя сервисы отдельно, стейт в памяти отдельно
Если я не туплю, то это сработает только если мы сразу запускаем что-то из обсуждаемого объекта в том же обработчике. А если нам надо дальше в цепочке передать?
источник

ВУ

Валентин Удальцов... in PHP
например, symfony normalizer интерфейс говно, потому что он подразумевает NormalizerAwareInterface с методром setNormalizer. вместо этого надо было сделать normalize($data, ..., NormalizerInterface): mixed
источник

ВУ

Валентин Удальцов... in PHP
тогда ты сам нормалайзер, через который рекурсивно можно дальше нормализовать, получаешь в аргумент
источник

ВУ

Валентин Удальцов... in PHP
и никакой мутации сервиса через сеттер не надо
источник

MM

Maksim Masiukevich in PHP
Валентин Удальцов
параметром как у @desper1989 контекст в php-service-bus 😉
источник

AM

Artem Molotov in PHP
Валентин Удальцов
например, symfony normalizer интерфейс говно, потому что он подразумевает NormalizerAwareInterface с методром setNormalizer. вместо этого надо было сделать normalize($data, ..., NormalizerInterface): mixed
Тогда не получиться передать дальше в цепочке. Или же нужно ещё в цепочке делать интерфейс для шаринга рандомных данных. В принципе, так было сделано в потоках (pthreads), когда они ещё не сдохли.
источник

AM

Artem Molotov in PHP
В принципе, вариант, да
источник

AM

Artem Molotov in PHP
ага, да, оно
источник

AD

Andrey Dembitskyi in PHP
Иван Лещёв
#[Required] после такого как божественный свет воспринимается
источник

ВУ

Валентин Удальцов... in PHP
Artem Molotov
В принципе, вариант, да
это не в принципе вариант, а то, как это надо делать)

резюмируя, есть только два нормальных типа инъекций — "фиксированные" (грубо говоря контейнер-компайл-тайм) через конструктор и "нефиксированные" (передаваемые в рантайме) через параметр выполняемого метода. тогда все сервисы можно делать иммутабельными, а весь контекст (представленный мутабельным стейтом и/или иммутабельными сервисами, выбираемыми для конкретной ситуации) живёт только в переменной и передается только через параметры, потом по окончании всех действий автоматически утилизируется.

Тогда и в роадраннере запускать проект можно смело, и корутинами баловаться, не боясь, что, например, в рамках одного процесса сначала в пошеренном нормалайзере один сериалайзер в свойстве через setNormalizer задан, а потом вдруг другой (в случае, если на проекте несколько сериалайзеров сконфигурировано под разные задачи, но при этом они шерят одни и те же SerializerAware нормалайзеры).
источник

ВУ

Валентин Удальцов... in PHP
Кажется, это офигенная тема для практического видео на PHP Point, записал себе. Потому что так на словах вряд ли тут кто-то понял что-то)
источник

VC

Vladimir Chernyshev in PHP
Валентин Удальцов
Кажется, это офигенная тема для практического видео на PHP Point, записал себе. Потому что так на словах вряд ли тут кто-то понял что-то)
Я понял ) Выше об этои писал, но не так подробно
источник

VC

Vladimir Chernyshev in PHP
Переслано от Vladimir Chernyshev
`
public function doSmth(int $id, ?LoggerInterface $logger = null)`
источник

ВУ

Валентин Удальцов... in PHP
Vladimir Chernyshev
Переслано от Vladimir Chernyshev
`
public function doSmth(int $id, ?LoggerInterface $logger = null)`
да, только в этом случае прокидывать nullable странно, иначе клиенту всегда придется проверять !== null или ??= new NullLogger. чтобы облегчить клиенту жизнь, лучше сделать строго LoggerInterface в параметре, а на обрабатывающей стороне, если нечего, прокинуть NullLogger
источник

ИЛ

Иван Лещёв in PHP
Валентин Удальцов
это не в принципе вариант, а то, как это надо делать)

резюмируя, есть только два нормальных типа инъекций — "фиксированные" (грубо говоря контейнер-компайл-тайм) через конструктор и "нефиксированные" (передаваемые в рантайме) через параметр выполняемого метода. тогда все сервисы можно делать иммутабельными, а весь контекст (представленный мутабельным стейтом и/или иммутабельными сервисами, выбираемыми для конкретной ситуации) живёт только в переменной и передается только через параметры, потом по окончании всех действий автоматически утилизируется.

Тогда и в роадраннере запускать проект можно смело, и корутинами баловаться, не боясь, что, например, в рамках одного процесса сначала в пошеренном нормалайзере один сериалайзер в свойстве через setNormalizer задан, а потом вдруг другой (в случае, если на проекте несколько сериалайзеров сконфигурировано под разные задачи, но при этом они шерят одни и те же SerializerAware нормалайзеры).
ну как бы, если инъекцию делает контейнер и только он, то в конечном счёте наплевать, как она туда пришла
конечно паблик поле можно переписать
но положа руку на сердце, переписать можно и приватное через рефлексию
источник

VC

Vladimir Chernyshev in PHP
Валентин Удальцов
да, только в этом случае прокидывать nullable странно, иначе клиенту всегда придется проверять !== null или ??= new NullLogger. чтобы облегчить клиенту жизнь, лучше сделать строго LoggerInterface в параметре, а на обрабатывающей стороне, если нечего, прокинуть NullLogger
да это так, на скорую руку, чтоб показать идею как обрабатывать опциональные зависимости для каких-то кейсов редких
источник