
Sergey
08.10.2017
16:59:28
там есть разные варианты и все сильно от задачи зависит

Андрэ
08.10.2017
16:59:39

Sergey
08.10.2017
16:59:47

Google

Sergey
08.10.2017
17:00:13
не прошла транзакция - ну значит что-то там есть)
а для UI есть простая проверочка

Андрэ
08.10.2017
17:00:37
блин) я опечатался вместо БЛ - БД)

Sergey
08.10.2017
17:00:59
давай усложним - представь что у тебя нет бд)

Андрэ
08.10.2017
17:01:32
Ну погоди, мы ж не про БД. Мы про ситуацию, когда контроллеру надо что-то провалидировать так, что это только слой БЛ может сделать
Так я бы не кидал скорее всего эксепшн в слое БЛ, а сделал, чтобы контроллер, получив ответ, что валидация не прошла - решал бы уже что делать, эксепшн или выдача ответа юзеру и тп
Хотя конечно это все "в среднем по больнице"

Sergey
08.10.2017
17:02:35
нужны конкретные примеры и желательно разные

Max
08.10.2017
17:02:35
По исключениям понял, спасибо. Ок, а если мне в контроллере на каждый такой случай надо опрашивать бизнес-логику, получается лапша из if-else. Не проще ли спросить из бизнес-логики одну функцию, которая вернет мне error_msg?

Sergey
08.10.2017
17:03:00

Max
08.10.2017
17:03:03
Допустим, у меня не только ip адресс должен быть уникальным, но и что-то еще (nickname, email, etc)

Андрэ
08.10.2017
17:03:04
А почему вообще в конроллере?

Google

Андрэ
08.10.2017
17:03:15
Не подойдет ли тут какой- middleware например?

Sergey
08.10.2017
17:03:28

Андрэ
08.10.2017
17:03:30
Который до контроллера валидирует поля и кидает экспешн в случае чего

Sergey
08.10.2017
17:03:37
ip это явно уже другое какое-то ограничение

Max
08.10.2017
17:04:33

Ilshat
08.10.2017
17:04:39
403

Sergey
08.10.2017
17:04:41
ну так давай реальные вещи обсуждать
потому что для трэша не стыдно и без объяснения причин вернуть

Андрэ
08.10.2017
17:04:57
403 на поле, не прошедшее валидацию на уникальность?
Ну я бы очень удивился, получив такое

Sergey
08.10.2017
17:05:06
409 - конфликт
403 - нет доступа

Ilshat
08.10.2017
17:05:30
у него ип как часть правила авторизации

Sergey
08.10.2017
17:05:30
422 - универсальный код для валидации

Max
08.10.2017
17:05:40

Sergey
08.10.2017
17:05:43

Андрэ
08.10.2017
17:07:05
Судя по всему, регистрация чего-либо. так как сложно представить, что при логине проверяется поле на уникальность

Google

Sergey
08.10.2017
17:07:15
просто представь
ты пользователь
ты просто кликнул кнопку
вся эта инфа типа ip адрес или там юзер агент браузера - это он не должен контролировать

Max
08.10.2017
17:07:42

Sergey
08.10.2017
17:07:43
и сообщать ему что "чел ты походу браузер сменил" как-то ну такое

Андрэ
08.10.2017
17:07:58
ты так говоришь, будто я с тоббой о чем-то спорю)

Sergey
08.10.2017
17:08:08
он делает нехорошие вещи - просто не давай ему делать и говори что он не хороший человек
заботиться надо только если ты хочешь что бы человек попробовал еще раз

Max
08.10.2017
17:08:56

Sergey
08.10.2017
17:08:59
скажем чел неверно чето ввел при оформлении заказа
доменные ивенты тут хорошо работают
EventStore::remember(IncorrectReferralInfo::occurred(data))
и записываешь ивенты
это наиболее универсальный но более сложный способ

Андрэ
08.10.2017
17:10:50
@fes0r , пока ты тут, хочу спросить о другом. Ты же, если не ошибаюсь, докер используешь сейчас активно? Есть желание поспрашивать разные штуки, но где бы это удобнее сделать?) Тут чат все не про деплой

Sergey
08.10.2017
17:11:08

Google

Андрэ
08.10.2017
17:11:32
Ну там я асбтракно спросил в никуда, так же абстрактно и молчат пока. Ну ок, я тебя понял

Max
08.10.2017
17:13:57
ивенты
логирование всегда только ивентами реализуется?

Sergey
08.10.2017
17:15:03
просто с ивентами было б неплохо тогда вообще все логать
и хорошее и плохое
и ответы с внешних сервисов
словом вообще все что бы можно было данные по этим ивентам восстановить

Max
08.10.2017
17:16:04

Sergey
08.10.2017
17:16:05
(почти event sourcing просто чуть проще)

Max
08.10.2017
17:19:16
ну прикинь плюсы минусы)
Для меня это однозначно плюс, т.к. я вообще пишу на питоне и простом фреймворке, тут нет мощного ООП каркаса типа как у Laravel, мне всё это с нуля реализовывать - большая трата времени. А сколько не глянь проектов с django\flask на гитхабе, люди вообще лепят всю бизнес-логику в контроллер и считают что это ок.

Ilshat
08.10.2017
18:31:58

Max
08.10.2017
19:23:54


Vlad
09.10.2017
13:06:43
Привет!
Подскажите пожалуйста, какой путь лучше выбрать в следующей ситуации?
Пишу на TypeScript класс хранилища каких-то данных одного типа - не вдаваясь в детали - он должен уметь принимать функцию-загрузчик данных и иметь метод subscribe, который возвращает observable, выдающий загруженные данные.
class ObservableList<T> {
setLoader(loader: (...args: Array<any>) => /*вопрос тут*/): void {}
subscribe(): Observable<Array<T>> {}
// другие служебные методы типа merge/remove/reload/reset
}
Дело в том, что функции-загрузчики могут возвращать либо promise с массивом, либо Observable с таким же массивом(ангуляр у нас).
Собственно, вопрос: как поступить с этим знанием того, что загрузчики бывают двух типов?
1) Сперва думал унаследоваться от этого класса и переопределять в новом метод setLoader, не трогая остальное. Например
class ObservableListFromPromise<T> extends ObservableList<T> {
setLoader(loader: (...args: Array<any>) => Promise<Array<T>>)
}
и такой же с Observable
2) Обойтись без наследования и ограничиться тем, что вызывать внутри загрузчик и проверять что он вернул - promise или observable - и от этого дальше танцевать.
А может быть ни один из этих вариантов не хорош?
Объясню зачем мне это - заметил, что часто в проекте встречается одинаковая работа по загрузке/обновлению/удалению данных в списках, и у таких списков несколько представлений в интерфейсе - сам список, фильтры над ним, аггрегаторы типа "100500 позиций, из них over9K таких и чуть-чуть вот таких".
Поэтому захотел максимально унифицировать работу с ними и не писать каждый раз одно и то же


Dmitriy
09.10.2017
13:12:49
Ребята подскажите пожалуйста по Symfony 3, если кто в нем силен. Не работают роутинги на проде. Допустим localhost/app_dev.php - маршруты работают. localhost/app.php - тоже работают. а вот localhost/ - страница отображается, но при попытке перейти куда-то получаю 404. Кеш чистил, не помогает

f4rt~
09.10.2017
13:13:29

Dmitriy
09.10.2017
13:14:13


Aleh
09.10.2017
13:22:20
Привет!
Подскажите пожалуйста, какой путь лучше выбрать в следующей ситуации?
Пишу на TypeScript класс хранилища каких-то данных одного типа - не вдаваясь в детали - он должен уметь принимать функцию-загрузчик данных и иметь метод subscribe, который возвращает observable, выдающий загруженные данные.
class ObservableList<T> {
setLoader(loader: (...args: Array<any>) => /*вопрос тут*/): void {}
subscribe(): Observable<Array<T>> {}
// другие служебные методы типа merge/remove/reload/reset
}
Дело в том, что функции-загрузчики могут возвращать либо promise с массивом, либо Observable с таким же массивом(ангуляр у нас).
Собственно, вопрос: как поступить с этим знанием того, что загрузчики бывают двух типов?
1) Сперва думал унаследоваться от этого класса и переопределять в новом метод setLoader, не трогая остальное. Например
class ObservableListFromPromise<T> extends ObservableList<T> {
setLoader(loader: (...args: Array<any>) => Promise<Array<T>>)
}
и такой же с Observable
2) Обойтись без наследования и ограничиться тем, что вызывать внутри загрузчик и проверять что он вернул - promise или observable - и от этого дальше танцевать.
А может быть ни один из этих вариантов не хорош?
Объясню зачем мне это - заметил, что часто в проекте встречается одинаковая работа по загрузке/обновлению/удалению данных в списках, и у таких списков несколько представлений в интерфейсе - сам список, фильтры над ним, аггрегаторы типа "100500 позиций, из них over9K таких и чуть-чуть вот таких".
Поэтому захотел максимально унифицировать работу с ними и не писать каждый раз одно и то же
loader: () => Promise<T> | Observable<T>?

Google

Vlad
09.10.2017
13:23:14

Aleh
09.10.2017
13:23:46
ну я не понял зачем вам наследование, вроде как проблему не решает

Vlad
09.10.2017
13:28:36
Было сомнение на тему как реализовать - унаследоваться два раза(ObservableListFromPromise и ObservableListFromRx) и переопределить один метод в них(setLoader), или написать if (loader instanceof Promise) { ... } else { ... }
Сейчас прикидываю - наследование внесло бы путаницу - в какой части проекта какой класс использовать - от promise или от observable. А тут универсально - спрячу if и всем хорошо одинаково ?

andretshurotshka?❄️кде
09.10.2017
13:31:33
Either ))

Aleh
09.10.2017
13:32:06
я не понимаю как наследование избавит от if (loader instanceof)

Vlad
09.10.2017
13:41:46
Точно ) Сперва спрашиваю, потом думаю ? От этого if никак не избавиться ) Вот как-то так предполагалось:
class ObservableList<T> {
private loaderType: 'promise' | 'rx';
private loadPromise() {
this.loader().then().catch();
}
private loadRx() {
this.loader().subscribe()...;
}
private load() { this.loaderType === 'promise' ? this.loadPromise() : this.loadRx() } }
}
class ObservableListFromPromise<T> extends ObservableList<T> {
setLoader(loader: (...args: Array<any>) => Promise<Array<T>>) { this.loaderType = 'promise'; ... }
}
и
class ObservableListFromRx<T> extends ObservableList<T> {
setLoader(loader: (...args: Array<any>) => Observer) { this.loaderType = 'rx'; ... }
}

Sergei
09.10.2017
20:26:36
Всем добрый день.
Возник вопрос[наброс]: в какой мере прнципы ООП применимы при проектировании REST API в микросервисной архитектуре?
В моём представлении - SOLID он везде SOLID, но практика может отличаться от теории.

Sergey
09.10.2017
20:27:27
во вторых - микросервисы можно воспринимать как эктор модел
в третьих... это обмен сообщениями между экторами
то есть между модулями
ну а далее все вещи просто становятся менее явными

Sergei
09.10.2017
20:29:00

Sergey
09.10.2017
20:29:46
многие так живут и ничего
ты лучше другую мысль подумай

illiatshurotshka❄️
09.10.2017
20:30:22

Sergey
09.10.2017
20:30:27
у тебя разница только в том что "поведение" описывается протоколом взаимодействия микросервисов
то есть менее явно с одной стороны (скажем ты можешь LSP сломать если у тебя есть несколько реализаций одного микросервиса которые ты подменяешь)