
Sergey
27.09.2017
11:13:35
я так application-level сервисы делаю

Sergey
27.09.2017
11:13:50

Sergey
27.09.2017
11:14:28

Sergey
27.09.2017
11:14:50
ну эт если регать как сервис

Google

Sergey
27.09.2017
11:14:56
ну я регаю как сервис)
а такого что бы мне где-то нужна была просто функция с интерфейсом - такого небыло
ну и слишком высока стоимость для "type safty"

F01134H
27.09.2017
11:15:49

Sergey
27.09.2017
11:16:16

Dmitry
27.09.2017
11:16:25
завернуть в анонимную функцию как бы более наглядно и гибко ;)

Sergey
27.09.2017
11:16:29
хорошо подходит для оркестрации действиями

Dmitry
27.09.2017
11:16:42
имхо этот __invoke вообще ввели как костыль для замыканий

F01134H
27.09.2017
11:16:50

Sergey
27.09.2017
11:16:59

Dmitry
27.09.2017
11:17:05
что завернуть?)
вызов у нужного объекта нужного метода... и передать это туда, что ждет callable

F01134H
27.09.2017
11:17:09
Не, я просто из интереса спрашиваю

Google

Sergey
27.09.2017
11:17:40
общий интерфейс замутить низя, ну и в целом ведут себя штуки как просто функции

Dmitry
27.09.2017
11:18:04
ну пусть передают замыкания

Sergey
27.09.2017
11:18:04
и тут __invoke приходит на помощь

Sergey
27.09.2017
11:18:19

Sergey
27.09.2017
11:18:42
тип так?
большей бойлерплейта богу бойлерплейта

Dmitry
27.09.2017
11:19:36
ну юзать костыли, которые приделали для создания замыкания в пхр 5.3, ибо замыкание - это инстанс класса - оно лучше, и читабельнее, ага ;)

Sergey
27.09.2017
11:19:59
interface MyCoolPolymorphicFunction {
public function __invoke(int $myCoolArgument): string;
}

Dmitry
27.09.2017
11:20:24
и? где ты его использовать будешь?

Sergey
27.09.2017
11:20:54
не нравится - не юзай. Если у тебя нет кейсов для __invoke то у меня они есть

Dmitry
27.09.2017
11:21:25
ну да... так как для этого мне не нужны "специальные классы", я могу использовать любые ;)

Sergey
27.09.2017
11:21:52
и с моими
у меня есть сервисы представляющие собой одну единственную операцию
я их использую в контроллерах так:
public function registerUserAction(RegisterUserHandler $handler, RegisterUserRequest $request)
{
$userId = $handler($request);
return new UserDetailsResource($userId);
}
ты же предлагаешь мне делать так:
$userId = $handler->handle($request);
причем.... просто так

Google

Sergey
27.09.2017
11:23:22
потому что тебе не нравится invoke

Dmitry
27.09.2017
11:24:04
ну... вообще это выгляди наоборот, "я присрал сюда invoke, так как мне визуально вдруг понравилось и выглядит "по взрослому" ;))) извини

Sergey
27.09.2017
11:24:13
пока у тебя не появятся доводы получше чем "ну это ж кастыль", хотя бы объяснения минусов которые ты видишь - можно даже не продолжать разговор.

Dmitry
27.09.2017
11:24:26
У тебя есть интерфейс, в нем ты можешь определить метод и вызывать его.
И без проблем сможешь навестить на один класс два таких интерфейса ;) просто имена методов помнять

Sergey
27.09.2017
11:25:00

F01134H
27.09.2017
11:25:12
return new UserDetailsResource($userId); а вот тут кста вызовется конструктор или invoke? Или оба?

Sergey
27.09.2017
11:25:28

F01134H
27.09.2017
11:25:37
не знаю, если честно
конструктор то наверняка

Sergey
27.09.2017
11:25:42
ну почитай доки

Sergey
27.09.2017
11:25:48
что значит new в php

Dmitry
27.09.2017
11:25:56
Шо? типа я запихнул в интерфейс __invoke вместо имени метода и это сразу перестало нарушать LSP? какой-то бред ;)

Sergey
27.09.2017
11:26:07
это у @Enleur кейсы такие видать есть

Sergey
27.09.2017
11:26:24
на пхп редко)

Dmitry
27.09.2017
11:26:26
interface MyCoolPolymorphicFunction ;)

Sergey
27.09.2017
11:26:45
это просто пример что ты так сможешь замутить полиморфную функцию, late binding и при этом проверка на соответствие типов
я все еще не вижу аргументов

Google

Sergey
27.09.2017
11:27:13
чем тебе не нравится __invoke
по пунктам
объективно

Dmitry
27.09.2017
11:27:28
у invoke по сути одна задача - возможность передать объект туда, где нужно callable... все остальное - это как бы раскраски, которые лишь ухудшают читабельность

Sergey
27.09.2017
11:27:41
я подобного не замечал

Dmitry
27.09.2017
11:27:57
какой аргумент использовать getFoo вместо __get() { ... if (foo) ? :)

Pavel
27.09.2017
11:28:34
так никто же не вызывает явно __invoke чаще всего

Dmitry
27.09.2017
11:28:42
ну вот у меня взвывает когнитивный диссонанс - это уже аргумент ;)

$iD
27.09.2017
11:28:53

Admin
ERROR: S client not available

Sergey
27.09.2017
11:29:34
с __invoke же мы ничего не нарушаем и ничего не ломаем.
другой вопрос - как ты без __invoke реализуешь нечто что должно вести себя как функция (потому что зачем выдумывать название для метода когда у тебя название класса и так определяет поведение) которой нужны какие-то зависимости и ты хочешь их спрятать. Предлагаешь спрятать все в лямбду где-то на уровень выше? увы наши DI контейнеры так не умеют и вообще в php с этим все плохо


Sergo
27.09.2017
11:32:34
У кого-то было такое, что в коде вызывается функция substr_count, а на деле mb_substr_count() ?
у них разные аргументы, в результате получается Warning: mb_substr_count(): Unknown encoding "0" in
Это в сорсах Твига, класс Compiler
Впечатление будто где-то овверрайд, но хз

$iD
27.09.2017
11:33:26
мне нравится идея с репозиторием и __invoke
https://youtu.be/rzGeNYC3oz0?t=2676
метку поставил

Google

Sergey
27.09.2017
11:34:44
я знаю идею делать интерфейс репозитория таким же как у коллекций, а с __invoke в репосах не знаком

Dmitry
27.09.2017
11:35:19
есть разницы между использования когда нужна функция (аргумент ждет что-то callable) и искусственного использования как у тебя в примере, когда причин использовать как функцию вообще нет кроме блажи программиста

Sergo
27.09.2017
11:35:31

Sergey
27.09.2017
11:35:45
да, активно юзаю

$iD
27.09.2017
11:35:56
+

Sergey
27.09.2017
11:36:05

$iD
27.09.2017
11:36:15
потому что у меня горит уже от одно репозитория на 10к строк

Sergey
27.09.2017
11:36:44
другой пример - нотификейшены

$iD
27.09.2017
11:37:08

Sergey
27.09.2017
11:37:13
$notificator->send(new WelcomeNotification($user->email(), $user->id()));

$iD
27.09.2017
11:37:20
к слову, на текущем проекте мы пока тоже этого не делаем
жрём кактус

Dmitry
27.09.2017
11:37:27
вред в том, что кому-то после тебя этот код читать и долго думать, почему у аргумента описан интерфейс, а мы его как функцию
когда ответ "причин нет, просто программисту так показалось симпатичнее" тогда неверное использование

Sergey
27.09.2017
11:38:21
мне кажется что "вред надуман"
либо приведи конкретный пример

Dmitry
27.09.2017
11:39:14
и ты в состоянии ответить, почему так лучше, чем вызов метода?

Sergey
27.09.2017
11:40:15