
Dinar
08.09.2017
12:16:09
Так не сказано же :)
Кстати, можно еще указать Accessor
Тогда он будет пытаться из геттера достать

Виктор
08.09.2017
12:17:06
все получилось, спасибо

Google

Виктор
08.09.2017
12:18:08
буду еще очень благодарен за понябельную статью, желательно на русском, как заюзать сериалайзер встроенный - пробовал гуглить и читать на английском - че-то туго пошло и времени особо нет пока рзаобраться
вроде как все советуют его юзать а не jms

Dmitry
08.09.2017
12:19:19
мне JMS нравится... до какого-то момента он удобнее, чем встроенный, ибо часть вещей делается аннтациями, тогда как во встроенном уже пришлось бы кодить

Виктор
08.09.2017
12:19:48
ну можно же свой велосипед накодить с аннотациями?
мне щас пока такой подход видится проще - но я тока изучаю сф
с JMS просидел пару часов - чтобы разобраться как сделать чтобы свойства у объектов были в camelCase

Dmitry
08.09.2017
12:24:50
Ну не знаю что там пару часов делать, гуглится все быстро

Evgenii
08.09.2017
13:44:46
Присоединяюсь к просьбе о внятном туториале по встроенному сериалайзеру.
Чето не получается нормализация. Ругается на цикличные зависимости. Читал в доке как это обходить но так и не получилось реализовать

Alexey
08.09.2017
14:12:27
Привет. А в чем вообще сокральный смысл делать вот так
services:
my_entity_repository:
class: AppBundle\Repository\MyEntityRepository
factory: ["@doctrine", getRepository]
arguments:
- %entity.my_entity%
??
Почему просто не сделать свой репозиторий и инжектить туда что захочешь? Оттуда же можно получить доктироновский репозиторий если нужно.

Sergey
08.09.2017
14:16:17
ну так будут доступны методы из базового репоса, плюс разные плюшки типа createQueryBuilder, _entityName и тд
но лучше не наследоваться)

Google

Alexey
08.09.2017
14:22:04
но лучше не наследоваться)
Так зачем наследоваться. Можно же в конструкторе сделать вот так
$this->doctrineRepository = $em->getRepository(Entity::class);
если нужно пользоваться

Sergey
08.09.2017
14:32:07
не, не стоит. тесты писать потом на это дело не очень

Sergey
08.09.2017
17:29:54

Sergey
08.09.2017
20:02:52

Andrew
08.09.2017
20:13:33

Sergey
08.09.2017
21:35:24

Andrew
08.09.2017
21:41:55
чти доки к symfony 3.3
Читал, но вот момент с ServiceSubscriberInterface остался неясен. Вообще интересны успешные кейсы с контроллерами как сервисами, есть ли реальный профит в этом помимо морального удовлетворения? Тестируемость теоретически намного лучше, но на контроллеры редко пишутся юниттесты

Sergey
08.09.2017
21:42:54
смотря что в контроллерах
я б тоже глянул как другие делают ибо то как делаю я мне не нравится

Alan
08.09.2017
22:11:53
у нас __construct + __invoke
и
AppBundle\Action\:
resource: '../../../src/AppBundle/Action'
tags: ['controller.service_arguments']
экшены

Виктор
08.09.2017
22:22:13
Вопрос по Доктрине. Как написать условие запроса - если поле таблицы это айдишник другой сущности (@ORM\ManyToOne)? Criteria бы идеально использовать - но там типа через точку писать нельзя, может я что-то не докопал в доке/гугле? Писать именно запросом как бэ не хочется...

Sergey
09.09.2017
01:40:48

Alexey
09.09.2017
19:22:57
Привет. Вот такая трабла. Не знаю как лучше сделать. Например есть модели с такой иерархией. Catalog (1)-> (M)Group (1) ->(M) Post. И находясь в каталоге необходимо фильтровать их по филтрам которые относятся к постам. То есть 3 join минимум будет. В итоге в выборка должна иметь такую структуру :
`[
[
'id' => 1,
'name' => 'catalog1',
'groups' => [
[
'id' => 1,
'name' => 'group1',
'postCount' => 10
],
[
'id' => 2,
'name' => 'group2',
'postCount' => 24
],
]
],
[
'id' => 2,
'name' => 'catalog2',
'groups' => [
[
'id' => 3,
'name' => 'group4',
'postCount' => 102
],
[
'id' => 4,
'name' => 'group5',
'postCount' => 241
],
]
]
]`
То есть выдаю каталоги, в которых группы, а в группах Count (post) для нее.

Sergey
09.09.2017
19:24:46
так а в чем трабла? не умеешь в SQL?
или есть какие-то конкретные опасения?

Alexey
09.09.2017
19:26:07

Sergey
09.09.2017
19:26:21
что будет эффективнее, 3+N SQL запросов или 1 запрос?
что будет лучше, гадать что лучше или написать запрос и сделать explain?

Google

Alexey
09.09.2017
19:27:44

Sergey
09.09.2017
19:27:49
есть ситуации при которых "1 запрос" не очень эффективно, но это исключение из правила
count + group by, ну и ты всегда можешь native sql замутить
замэпить результат count сразу в group твои всеравно не выйдет, можно было бы через "new" оператор в dql но доктрина пока не умеет так как тебе надо

Alexey
09.09.2017
19:34:16

Sergey
09.09.2017
20:29:42
делай селект групп и от них уже плеши
в любом случае тебе придется делать какую-то пост-обработку того что тебе доктрина выплюнула

Dinar
09.09.2017
21:32:57
Кто нибудь в Workflow работал?
close:
from: in_work
to: closed
cancel:
from: [draft, new]
to: cancelled
cancel_admin:
from: [draft, new, in_work, closed]
to: cancelled
И когда я проверяю, $workflow->getEnabledTransitions((new Order())->setStatus('in_work'))
Он выдает мне только один транзишен :(
Вот результат.
Почему так?
Вот так выглядит workflow:
https://pastebin.com/vr3gdpiq
Должно же 2 быть? close и cancel_admin, так?

Ad
09.09.2017
23:07:28
Доброй ночи. Посоветуйте бандл для RSS. Сейчас юзаю Eko Feed но он не умеет в пагинацию.

Sergey
10.09.2017
08:22:17
с таким подходом кстати сервисы можно держать приватными

Google

Sergey
10.09.2017
10:53:43

Sergey
10.09.2017
11:18:12


Sergey
10.09.2017
11:21:12
что мне не нравится:
- если у тебя больше чем один экшен на контроллер то не будет ли у тебя ситуации когда в класс инджектятся 10 зависимостей из которых на экшен используется только 3?
- если у тебя только один экшен на контроллер, что там будет и чего там точно быть не может? Приведу пример - нам нужно получить репорт за последние 7 дней. Простая операция вычисления дэйт рэйнджа, она у тебя в контроллере будет или в сервисах? или быть может ты будешь юзать argument resolver?
я сейчас использую вариант следующий:
- все операции вынесены в сервисы, по сервису на операцию (на юзкейс).
- все что относится к циклу запрос/ответ - в контроллерах.
- много экшенов в одном контроллере
- сервисы инжжектятся как аргументы экшена, а не в конструктор. При этом работает и автовайринг и все сервисы можно делать приватными.
но мне этот вариант так же не нравится из-за абилия болейрплейта для простых операций
но ничего лучше придумать пока не смог (есть идие но они безумны пока)_


Sergey
10.09.2017
11:23:25
если сервисы не все используются в экшенах, то наверное этому экшену не место в контроллере

Sergey
10.09.2017
11:23:48
ну тогда мы приходитм со временем к ситуации где у тебя на один контроллер один экшен)
ну может 2

Sergey
10.09.2017
11:23:56
ну я не большой сторонник одного экшена в контроллере, особенно если нужен круд

Sergey
10.09.2017
11:24:20
давай круд возьмем
вот у тебя есть старый добрый crud для товаров. Есть update и есть delete
у тебя либо один сервис-менеджер либо у тебя разный набор зависимостей для этих действий
и следовательно ты delete например будешь выносить куда-то еще.
где я ошибся?

Sergey
10.09.2017
11:25:58
один сервис манагер да

Sergey
10.09.2017
11:32:22
ясно, не, мне такое не катит
ненавижу сервисы-менеджеры
их невозможно нормально тестами покрывать
окей, давай по другому

Google

Sergey
10.09.2017
11:33:48
хотя не. внутри менеджера будет примерно одинаковый набор зависимостей
а что ты делаешь когда у тебя внутри менеджера происходит ситуация когда для двух операций нужны разные зависимости?

Dmitriy
10.09.2017
11:56:54
У меня в экшн идет параметром класс юзкейса.. ничего отдельно не настраиваю

Sergey
10.09.2017
12:40:10
ну вот у меня так же сейчас, и контроллер служит больше прослойкой для конвертации http в объекты приложения и обратно в респонс.

Pavel
10.09.2017
13:13:47
Меня вот подкупает в контроллерах через __invoke что не надо вручную парсить имена методов, если хочешь повесить общее поведение. Да и вообще попахивает процедурщиной.
У меня был кейс, юзался жквери на фронте, а он слал запрос OPTIONS на некоторые роуты, я просто добавил интерфейс аля CanHandleOptions, проверял в event listener и в случае успеха отдавал специфичный респонс.
Не знаю насколько это элегантно, но удалось убрать кучу копипасты)


Sergey
10.09.2017
13:15:43
хм.... OPTIONS запросы шлются с клиента для того что бы определить что можно делать с ресурсом (в твоем случае считай экшеном). Мол какие http verbs оно умеет и все такое. Ну и CORS.
немного непонятно зачем тебе этот инитерфейс и что в нем было
ибо по моему разумению все что касается options запросов можно захэндлить при помощи листенеров и на худой конец аннотаций
и никакой копипасты
а так контроллеры через __invoke хороши когда у тебя юзкейсы в контроллере и реализованы, но тогда высока вероятность нарушить separation of concerns ибо если с реквестами все будет ок (ArgumentResolver-ы всякие и те же листенеры для того что бы скрыть http) то с респонсами уже не все так радужно и реализация будет напорядок сложнее....
ну либо у тебя там RPC или все хорошо с редиректами и прочим, тогда можно от респонсов в целом отказаться
ну короч много слишком НО и ЕСЛИ
Command/Query Separation короч позволяет красиво юзать __invoke контроллеры


Pavel
10.09.2017
13:26:14
Круто, столько нюансов, о которых раньше не задумывался, спасибо.
По поводу options, нужно было возвращать пустой респонс с заголовками Access-Control-Allow-Origin, Access-Control-Allow-Headers и Access-Control-Allow-Methods, но при этом не выполнять логику контроллера. Я это и делал с помощью листенера, просто такой логику надо было сделать не в одном контроллерею. И получается, что в одном контроллере больше 1 экшена, надо парсить имена методов. А если через __invoke, то надо просто чекнуть instanceof и все.
» ArgumentResolver-ы всякие и те же листенеры для того что бы скрыть http
Об этом задумываюсь. Мне в этом очень нравится идея request-objects

Sergey
10.09.2017
13:50:37
> И получается, что в одном контроллере больше 1 экшена, надо парсить имена методов. А если через __invoke, то надо просто чекнуть instanceof и все
аннотации
/**
* @Route("/cool_stuff", methods={"POST"})
* @CORS()
*/
public function someCoolAction(SomeCoolService $service)
{
}
и проблема решена

Max
10.09.2017
15:21:28
> а так контроллеры через __invoke хороши когда у тебя юзкейсы в контроллере и реализованы, но тогда высока вероятность нарушить separation of concerns ибо если с реквестами все будет ок (ArgumentResolver-ы всякие и те же листенеры для того что бы скрыть http) то с респонсами уже не все так радужно и реализация будет напорядок сложнее....
это уже больше chain of interceptors, тогда отпадает смысл в привычных экшенах, можно рассматривать аргумент ресолверы, лисенеры, аппликейшен (домен) сервисы, трансформеры как равноправные элементы цепочки