@symfony_php

Страница 416 из 1418
Andrey
23.11.2017
19:51:11
Vladislav
23.11.2017
19:53:17
ну он сделал то что ему обьяснили 909))))

Sergey
23.11.2017
19:54:49
А так? class Flush extends EntityManager
дай определение слову "изоляция" и что от чего мы хотим изолировать)

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

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-разработчиков, ниша для которой изначально создавался язык - по-быстрому клепать простенькие сайтики

Егор
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

Контейнер ведь не обязателен для рефакторинга, просто без него неудобно инстанциировать классы

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

Sergey
23.11.2017
21:24:53
Чтобы подменять в тестах
http://devhumor.com/content/uploads/images/February2017/tests.png

Егор
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
Подменой dns :)
тоже верно

ложишь файлики с респонсами и подсовываешь курлу

вообще задумайся вот о чем

вот у тебя есть класс который забирает данные и обрабатывает их

сколько у этого класса ответственностей?

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

А оно тужа не мапится

Или я дибил?

Вадим
24.11.2017
08:03:29
Add select
Там есть addSelect

Сеттеры не помогут )))
А что тогда поможет? )

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

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

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

$iD
24.11.2017
08:10:18
Да, но и каунт красиво не достать, без операций с резульаттом, и ручного мапинга
в addSelect пихаешь 'u' чтобы явно было приджойнено и $this->getMessages()->count() не будет отправлять запрос

$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

Страница 416 из 1418