
Evgeniy
03.05.2018
21:06:17
и часть из них необязательная была бы
тогда такую штуку можно применить, но твой случай значительно проще

Mihail
03.05.2018
21:07:00

Evgeniy
03.05.2018
21:07:15
у нас куча разных сервисов

Google

Evgeniy
03.05.2018
21:07:28
я сейчас стараюсь команде объяснить и народ стал понимать плюсы
мы каждому сервису что интегрируем создаем свой класс с методами что описаны в доке
и результаты в качестве vo обычных делаем (на основе доки)
получается например сервис1 он рест ему передается клиент газл и параметры для авторизации
сервис2 он на soap например, ему передается стандартный soap client и параметры для авторизации
эти сервисы это как бы разные классы апи
и таких реализаций у нас довольно много (много интеграций)

Mihail
03.05.2018
21:10:19
тогда нааерно удобней реализовать интерфейс который реализуют оба класса с api

Evgeniy
03.05.2018
21:10:21
например у нас несколько платежных систем подключено
не совсем
например у нас есть условно 3 платежные системы для оплаты
1. payture
2. sber
3. без нал
у каждой из этих систем абсолютно разные апи

Антон
03.05.2018
21:11:16

Google

Антон
03.05.2018
21:11:33
Не DI?

Evgeniy
03.05.2018
21:12:00
di

Антон
03.05.2018
21:12:42
Т.е. в конструкторе сервиса газл?

Mihail
03.05.2018
21:12:48
Api разные, но смысл остатется тот же SendMoney и тому подобное
я конечно могу полную тупость говорить, я мало в этом понимаю, но мне кажется тут надо делать общий класс который будет реализовывать общие методы, тогда можно использовать полиморфизм


Evgeniy
03.05.2018
21:15:29
у нас есть следующее
PaytureGateway ($guzzle, $username, $password)- это реализация апи на основе доки от того с кем интегрируемся у всех свои методы и тд
SberGateway ($soap, $username, $password) - тоже самое
есть еще PaymentInterface тут общие методы типо block, refund и тд
есть еще реализации платежных систем которые адаптируют gateway конкретный в PaymentInterface
например PayturePayment($paytureGateway), SberPayment($sberGateway);
и весь остальной код зависит от PaymentInterface
вот полиморфизм тут на интерфейсах
в моем примере весь остальной код зависит от PaymentGateway
который в зависимости от способа оплаты выбирается
если делаешь общий базовый класс, то придется юзать наследование, а это ограничение ты зависешь от одного базового класса, остальное будешь в трейты складывать

Maksim
03.05.2018
21:17:15
"block"
не надо людей неймингу учить только...)
да и в целом примеры говно)

Mihail
03.05.2018
21:17:16
абстрактный класс

Антон
03.05.2018
21:17:21
А как собирается объект? new Payture($guzzle, $myusername, $mypass) ?

Evgeniy
03.05.2018
21:17:50
лара 4.2 например, у нас
автоматом цепляет часть параметров конфигах

Антон
03.05.2018
21:18:44
Ну в ларе ж нельзя часть задать, а часть через di?

Evgeniy
03.05.2018
21:19:26
так газл собирается автоматом а параметры на этапе загрузки в di проставляются
и потом по имени переменной подгружаем

Антон
03.05.2018
21:19:55
Через сервис провайдер?

Google

Evgeniy
03.05.2018
21:20:05
там не просто $username а что то типо $sberUsername и этот параметр по имени в конфиге лежит

Антон
03.05.2018
21:20:43
Пятую Лару использовал и не видел такого там

Evgeniy
03.05.2018
21:21:01
у меня своя обертка для di
я туда лару впихнул
сейчас найду
вот в мое либе пример но немного старая версия либы https://github.com/smpl/mydi/blob/master/test/Documentation/reflectionService.php
для di
например параметр $a будет искаться в di по \stdClass
$b - будет юзать анотацию inject и реально туда проставиться A1
$c1 - будет использоваться по имени

Антон
03.05.2018
21:23:12
Понял

Evgeniy
03.05.2018
21:23:36
только теперь вместо c1 и B1 параметры в конфиге лежат и на этапе загрузки он читается и проставляется

Антон
03.05.2018
21:23:51
В ларе разве что binding primitives я помню

Evgeniy
03.05.2018
21:24:18
ну да типо этого я свою либу юзаю но и в ларе если покопаться можно сделать
если что на крайняк

Антон
03.05.2018
21:24:44
$this->app->when('App\Http\Controllers\UserController') ->needs('$variableName') ->give($value);
Как то так там

Evgeniy
03.05.2018
21:25:41
App::singleton(PaytureGateway::class, function($app) { return new PaytureGateway($app->get(Client::class), $app->get('sberUsername'), $app->get('sberPassword'));
в 4.2 можно
но мы в конструкторе просто имя входного параметра задаем что то типо $sberUsername и все автоматом резолвится
ну это чисто наша кухня)

Google

Admin
ERROR: S client not available

Антон
03.05.2018
21:27:08
Понял
Забавно, читаю доку Лары. Там psr-11

Evgeniy
03.05.2018
21:28:04
у меня в моей доке тоже psr-11 ?
в моей либе
вообще норм di php-di.org

Mihail
03.05.2018
21:29:54
благодарю за ссылку, как раз сейчас с сервисами в symfony начал разбиратся

Антон
03.05.2018
21:29:56
На ларовский ни разу не жаловался тоже. В отличии от yii2

Evgeniy
03.05.2018
21:30:38
в ларе норм
даже в 4.2

Антон
03.05.2018
21:33:07
А чего вы не обнлвитесь на 5?
Тяжко?

Evgeniy
03.05.2018
21:33:20
вагон легаси

Maksim
04.05.2018
06:35:50
Можно подумать главная проблема легаси - большое кол-ва строк кода)
В этих ваших модных ооп строк в разы больше by design. И чё?)

Sergey
04.05.2018
06:38:04

Maksim
04.05.2018
06:38:24

Sergey
04.05.2018
06:39:34
в качестве примера - видел проектик на гитхабе в 1.6 миллиона строк которые могут быть зарефакторены примерно в 200К строк (без учета вендоров конечно). Много дублирования, кучи каких-то невнятных велосипедов которые можно заменить на готовые компоненты...

Maksim
04.05.2018
06:40:00
Вызываем хелбоя для рефакторинга ;)

Sergey
04.05.2018
06:40:09
о да... этот может)

Google

Maksim
04.05.2018
06:40:22
Будет 10кк)

Sergey
04.05.2018
06:40:23
"мы увеличим количество строк в вашем легаси на порядок"

Maksim
04.05.2018
06:41:50

Sergey
04.05.2018
06:42:11
так к чему вопрос?
пффф... вообще не предел.
смотреть надо не на количество кода а на связанность. Есть тупой говнокод и есть "хитрый", и вот последний сложнее.

Maksim
04.05.2018
06:46:56
Кол-во кода - херовая метрика.
Есть вполне понятные метрики, которые ещё укажут на его качество)

Sergey
04.05.2018
06:47:25
"так" - мы не знаем как
потому ничего не можем прокоментировать