
Andrey
23.11.2017
19:51:11

Vladislav
23.11.2017
19:53:17
ну он сделал то что ему обьяснили 909))))

Sergey
23.11.2017
19:54:49
еще можешь подумать что такое "клиентский код". Подсказка - это не тот код который в браузере

Google

Sergey
23.11.2017
19:56:24
эх надо управженение разработать из двух фаз. Первая простая а вторая знакомит людей с болью

Bohdan
23.11.2017
20:16:10
то, что говорил недавно
показать, как неправильно, заставить делать так, что это неправильно отзывается болью, показать, как правильно

andrey
23.11.2017
20:42:56
@Eraice

Vladislav
23.11.2017
20:44:49
Он на англ не умеет

Егор
23.11.2017
20:45:00
Подобный подход применяется в этой пасте: https://github.com/codedokode/pasta/blob/master/arch/di.md
Как по мне - отличная статья для знакомства с DI. Сначала рассматриваются примитивные способы работы с зависимостями, указаны недостатки, далее объясняется какую задачу решают контейнеры и в конце небольшой практический пример.

andrey
23.11.2017
20:45:00
она на рус

Dmitry
23.11.2017
20:53:39
Классная статья спасибо большое
Почитал с удовольствием
Реально классно описано четко ясно и по полочкам все

Sergey
23.11.2017
20:55:45
> Принцип одной обязанности
мило)
вообще DI больше про open/close

Егор
23.11.2017
20:59:22
Новичку вряд ли помогут такие подробности.

Google

Sergey
23.11.2017
21:03:32
ну тогда и про принцип "одной обязанности" тоже не стоит)
вообще как бы мысли полезные но немного каша...

Егор
23.11.2017
21:06:44
Главное, как по мне, подтолкнуть, чтобы прочитавший задумался и начал уже сам ресёрчить. А там уже сам пусть решает подходит SRP или нет. Я встречал проекты, которые были написаны сениорами с 8+ годами опыта, и там даже сервисами/менеджерами не пахнет, портянки в контроллере тяжело переиспользовать и тестировать в изоляции.
Это становилось причиной багов, замедляло скорость реализации фич

Sergey
23.11.2017
21:11:02
так сказать немного истории)
допустим я могу исправить проблемы с registry и service locator описанные в статье и при этом не применять DI)

Егор
23.11.2017
21:12:41
Я сам не знаю почему так получилось, но у меня есть предположения - низкая грамотность PHP-разработчиков, ниша для которой изначально создавался язык - по-быстрому клепать простенькие сайтики

Sergey
23.11.2017
21:12:53

Егор
23.11.2017
21:13:43
Но я посоветую посмотреть на это всё с позиции новичка, который о DI ни слухом ни духом


Sergey
23.11.2017
21:15:47
1. DI контейнер это сложно если не юзать готовый
2. простой DI контейнер который можно скорее всего будет использоваться как service locator по итогу и не так удобно как нормальный SL тот же
3. SL вполне годный вариант если у тебя он не один на проект. А как и задумывалось - на каждый сервис свой локатор. В простых "сайтиках" не так уж и много зависимостей выходит.
4. сингелтоны начали юзать потому что это проще чем нормальный SL
5. ты когда-нибудь юзал PEAR во времена когда небыло composer?)
6. github появился всего-то лет 11 назад. php5 появился раньше.
7. вроде как в php4 был уже статик, не помню точно.
ты не забывай что помимо гринфилд проектов есть еще суровый процедурный легаси, где SL зайдут только в путь
Database::get()
и вот у тебя есть инстанс какого-то типа
Database::setInstance(ConnectionInterface $db)
и вот у тебя уже есть возможность нормально конфигурить
вон тут пробегал парнишка который начитался умных статей и орет что ему дали процедурщину которую он не может зарефакторить
представь что будет если разработчики которые умеют только DI и считают что все остальное - плохо (а именно так статья и говорит им) за немалые деньги начнут работать над легаси 10-ти летней давности
они сразу попробуют туда контейнер запихнуть и как бы сделают только хуже0

Google

Sergey
23.11.2017
21:22:58
или какой-нибудь yii причесывать 3-х летней давности

Егор
23.11.2017
21:23:26
Идея, как по мне, в том, чтобы зависимости пропихивать "сверху", для этого не обязательно нужен контейнер. Ну и в простых случаях без автовайринга контейнер будет очень простым как Pimple
Контейнер ведь не обязателен для рефакторинга, просто без него неудобно инстанциировать классы

Sergey
23.11.2017
21:24:16

Егор
23.11.2017
21:24:26
Чтобы подменять в тестах

Sergey
23.11.2017
21:24:53

Егор
23.11.2017
21:25:02
Сейчас поддерживаю проект как раз на Yii где куча всяких парсеров и очередей. Запускается из веб-интерфейса, тестировать что-то в изоляции очень тяжело
А тестировать надо, так как логики много
Из веб интерфейса запускается, так как логика в контроллерах

Sergey
23.11.2017
21:26:18
ну так это проблема исключительно разделения ответственности. DI тут не особо поможет)
я могу тебе такой же нетестируемый продуктик запилить и с DI)

Егор
23.11.2017
21:28:01
Ну а как мокать HTTP клиент без DI? Особенно когда "HTTP клиент" это вызов curl_* функций?

Sergey
23.11.2017
21:28:25
HttpClient::setInstance()

Dmitry
23.11.2017
21:28:46
Подменой dns :)

Sergey
23.11.2017
21:28:53
ложишь файлики с респонсами и подсовываешь курлу
вообще задумайся вот о чем
вот у тебя есть класс который забирает данные и обрабатывает их
сколько у этого класса ответственностей?

Google

Sergey
23.11.2017
21:30:22
я вижу две причины для изменений - первая - как и откуда ты данные берешь и вторая - как ты с ними работаешь.
в изоляции тебе по сути имеет смысл тестировать только последнее
а первое в изоляции смысла нет проверять
не стоит мокать то что ты не контролируешь
иначе можешь оказаться в ситуации когда тесты зеленые но ничего не работает)

Arky
24.11.2017
02:08:01
Она же устарела (

Roman
24.11.2017
07:13:37
Она же устарела (
Слушай, тебе уже сказали, куда смотреть: документация.
Если вообще туго, иди на сайт и проходи курсы, можно бесплатно в рид-онли, без видео.
Если не получается, гугли. Если не можешь нагуглить, перефразируй вопрос и гугли еще раз. Потом уже задавай вопросы)
https://knpuniversity.com/

Admin
ERROR: S client not available

Roman
24.11.2017
07:17:02

Sergey
24.11.2017
07:42:37
моков должно быть мало. Для этого тебе надо стараться избавляться от ненужных зависимостей
можешь еще погуглить на тему "dependency as code smell"

Вадим
24.11.2017
07:49:36
Может нубский вопрос, но как красиво вытягивать количество по ассоциациям, при выводе коллекции? $this->getMessages()->count() в коде красиво выглядит, но создает запрос каждый раз, при выводе коллекции. Ткните в какой-то best practices где это описано, плз. Т.к. видел что народ как-то через массивы извращается, но имхо не красиво оно.
Может есть возможность этот count вытащить преждевременно. Смотрел extra_lazy, там не нашел

Vladislav
24.11.2017
07:53:27
Запрос пиши

andrey
24.11.2017
07:55:06

Вадим
24.11.2017
07:55:26
Запрос пиши
Сюда написать ? Я понимаю как запрос писать, но все доп.поля с выборки игнорируются при гидрации

Vladislav
24.11.2017
07:56:18
та не сюда) не игнорируются, добавь в селект алиасы таблиц)
-select(a, b, c)

Вадим
24.11.2017
08:01:09
->createQueryBuilder('u')
->join('u.contacts','uc')
->addSelect('COUNT(uc) as contactsCount')
->groupBy('u.id')
->getQuery()->getResult();

Google

Вадим
24.11.2017
08:01:21
Так?
-select(a, b, c)
Создавал даже гетеры и сетеры в entity, setContactsCount, getContactsCount
А оно тужа не мапится
Или я дибил?

Vladislav
24.11.2017
08:02:55
Сеттеры не помогут )))

Вадим
24.11.2017
08:03:29

Vladislav
24.11.2017
08:05:49
тут я ща не уверен, но кажись если ты просто добавишь uc в селект то count не будет добавлять еще один запрос

Anatoly
24.11.2017
08:05:54
тригеры в бд на инсерт/делейт и соунт поле в нужной таблице.

Вадим
24.11.2017
08:07:15

Anatoly
24.11.2017
08:08:23

Вадим
24.11.2017
08:09:45
обоснуй
Логика должна быть описана в одном месте, если она раздлена на 2 места, тогда ее трудно поддерживать. Елси ты что-то поменял в коде, тебе надо помнить за все тригеры которые есть в базе, и не забыть поменять их.

$iD
24.11.2017
08:10:18

Anatoly
24.11.2017
08:10:40

$iD
24.11.2017
08:10:44
->addSelect('COUNT(uc) as contactsCount') это говно не будет гидрироваться

Вадим
24.11.2017
08:11:02

$iD
24.11.2017
08:11:04
будет массив с объектом и эл-ом contactsCount