
Sergey
23.04.2017
12:07:28

Valentin
23.04.2017
12:07:45
А в случае ошибок – возвращаю информацию о том, что не так

Sergey
23.04.2017
12:07:49
это значит что у тебя между входом запроса до сохранения в базу ты не знаешь что происходит

Google

Sergey
23.04.2017
12:08:16
а это значит что можно выкинуть все формы и тупо юзать symfony/serializer
в противном случае ты получишь искаженный репорт об ошибках
в моем же случае валидируется сам запрос, а между запросом и базой уже мое дело как сохранить валидность данных
оно так и проще
(меньше валидировать кейсов)
и гибче (валидация не зависит от контекста)

Andrew
23.04.2017
12:09:33
Кстати, апи через OptionResolver удобно делать и потом через какую-нибудь фабрику или named constructor создавать модель

Sergey
23.04.2017
12:09:43

Andrew
23.04.2017
12:09:58
Да? Мне понравилось

Sergey
23.04.2017
12:10:20
для простых проектов норм, для посложнее удобнее компоновать правила валидации через symfony validation
тупо больше возможностей
мой флоу в средней такой:
валидирую request
-> мэпим реквест на объект описывающий этот реквест (его можно генерить)
-> контроллер (пока не могу от них избавиться но все еще пытаюсь)
-> сервис который отвечает за операцию
-> билдер объекта
-> объект билдится и передается в репозиторий

Google

Sergey
23.04.2017
12:13:50
именованные конструкторы хорошо когда у тебя 1-2 аргумента или зависит от контекста
передавать массив - уже не так удобно
лучше билдеры, их делать минуту занимает, а читабельность и поддерживаемость повышается ух

Valentin
23.04.2017
12:14:23
У меня примерно такое было в API:
PUT /entity/{id}
- Достаём из БД объект, иначе - 404
- Проверяем, что юзер может редактировать, иначе - 403
- Создаем FormType с этой сущностью в качестве initial data
- Берем данные $request->request->all(), сабмитим их в этот FormType
- FormType внутри себя использует валидатор, если есть ошибки - возвращаем их с кодом 400
- Пытаемся сохранить в базу (с optimistic lock, если не получилось - отвечаем 409)
- Сериализуем обратно в JSON и отдаем с кодом 200

Sergey
23.04.2017
12:14:50
> - Достаём из БД объект, иначе - 404
PUT - идемпотентная операция. Если ничего небыло - надо сделать

Valentin
23.04.2017
12:15:08
Почему, PUT - по ID

Sergey
23.04.2017
12:15:11
короч я делал так как ты описываешь года два

Valentin
23.04.2017
12:15:12
Если не было - надо в POST

Sergey
23.04.2017
12:15:27
POST - не требует потому через него можно делать все
ну то есть если ты хочешь именно REST

Valentin
23.04.2017
12:16:11
Мне надо было по REST

Sergey
23.04.2017
12:16:12
то изволь соблюдать стандарты
https://www.youtube.com/watch?v=2nELo4fJMNQ
даже прочитаю)
короч я в последний раз использовал описанный тобой флоу в 2013-ом
потом мы начали эксперементировать

Valentin
23.04.2017
12:17:53
Я когда-то тогда это и писал
Может, в 2014

Sergey
23.04.2017
12:17:55
сначала отказались от форм и перешли на просто сериализацию/десериализацию

Google

Sergey
23.04.2017
12:18:11
потом вот год назад перешли на request objects
и дико удобно

Valentin
23.04.2017
12:21:41
Окей, посмотрю)

Sergey
23.04.2017
12:22:16
если после этого захочешь похоливарить - я буду только рад) всегда интересно послушать другую точку зрения

Valentin
23.04.2017
12:22:46
> Note: PUT replaces an existing entity. If only a subset of data elements are provided, the rest will be replaced with empty or null.
Мне вот просто такое не норм было бы (это я полез посмотреть сейчас и в мане Spring нашёл). К тому же клиент был всего один, фактически - эпп на AngularJS, который мы же и писали

Sergey
23.04.2017
12:30:01
у спринга весьма своеобразное толкование вещей
в частности меня забавляет как они HATEOAS описывают
для меня было откровением узнать что для андройдщиков например HATEOAS бесполезен

Valentin
23.04.2017
12:37:26
Забавно. Надо бы ещё для расширения кругозора попробовать GraphQL – просто какой-нибудь demo project сделать. Смотрел на него где-то год-полтора назад – философия выглядит неплохо, но пока не попробуешь на практике – не ясно, как это соотносится с насущными потребностями при создании API
Вроде уже завезли в PHP библиотеку соответствующую

Sergey
23.04.2017
12:37:48
и не одну

Sergey
23.04.2017
12:37:59
я вот все надеюсь что на этих выходных допилю свой пример хотя бы до какой-то точки

Valentin
23.04.2017
12:38:00
Ещё лучше – есть из чего выбрать

Tatiana Fomicheva
23.04.2017
19:39:51
Здравствуйте! Я новичок в Симфони, пока что сделала только админку с базовым CRUD, и возможно у меня глупый вопрос
Но мне нужно реализовать вот такую примерно штуку
То есть есть 2 списка и надо сделать массовое проставление отметок пунктов из одного списка во второй
то есть например в одном списке участники, а во втором пройденные курсы, и надо после прохождения курса отметить его у всех участников
В какую сторону здесь вообще копать?

Google

Tatiana Fomicheva
23.04.2017
20:00:34
Буду благодарна за любые подсказки

Pavel
23.04.2017
20:16:22
Татьяна, уточните пожалуйста свой вопрос. Что конкретно вы не знаете как сделать?
Фронтед можете построить на http://rubaxa.github.io/Sortable/
Далее имея список отправить его на роутер симфони с id пользователей кому проставить и проставляете
вопрос то в чем?))

finkel
23.04.2017
21:34:48
да, вопрос слишком размытый

Tatiana Fomicheva
23.04.2017
23:40:45
да, вопрос получился очень размытым, потому что плаваю в архитектуре симфони
пока что пришла к тому что на первом этапе прописать в yml файле связи много ко многим, на основе них сгенерировать CRUD, и на основе него сделать кастомную аадминку с возможностью выбора в одних списках опций из других списков

Admin
ERROR: S client not available

Tatiana Fomicheva
23.04.2017
23:42:49
а потом уже в роутинге прописать экшны для массового редактирования
спасибо за внимание к моему вопросу и участие!


Yuriy
24.04.2017
05:49:40
Всем привет, хотел выбрать количество оцененых заявкок
но в результате выборки получил не масив значенией а масив масивов значений:
array (size=4)
0 =>
array (size=1)
1 => string '4' (length=1)
1 =>
array (size=1)
1 => string '7' (length=1)
2 =>
array (size=1)
1 => string '7' (length=1)
3 =>
array (size=1)
1 => string '6' (length=1)
следовательно груповая функция count начала ругатся.
Подскажите пожалуйста в чем я ошибся?
$works = $query->select('IDENTITY(e.workId)')
->from('AvtorBundle:Estimated','e')
->where('e.dateAssignment IS NULL')
->andWhere(
$query->expr()->notIn(
'e.workId', '3'
)
)
->groupBy('e.workId')
->getQuery()
->getArrayResult()
// ->getSingleScalarResult()
;
CREATE TABLE IF NOT EXISTS estimated (
id int(11) NOT NULL AUTO_INCREMENT,
work_id int(11) DEFAULT NULL,
avtor_id int(11) DEFAULT NULL,
date_assignment datetime DEFAULT NULL ,
date_consent datetime DEFAULT NULL,
PRIMARY KEY (id),
KEY IDX_66B3529BB3453DB (work_id),
KEY IDX_66B3529253C4123 (avtor_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=36 ;


YR
24.04.2017
07:37:19
Доброе утро! Не подскажите , как в Доктрине сделать SQL_CALC_FOUND_ROWS ?

Алексей
24.04.2017
09:23:54

YR
24.04.2017
09:35:11

Daniel
24.04.2017
15:58:49
Omit the @return tag if the method does not return anything;
The @package and @subpackage annotations are not used.
Окей, вроде подрублен phpcs для Symfony2 в PHPStorm
Но оказывается он не форматирует код, а лишь варнинги показывает, если что-то не так
Можно ли настроить PHPStorm так, чтобы @package не ставился например?

Алексей
24.04.2017
16:00:23

Google

Daniel
24.04.2017
16:00:46
Т.е. шаблоны файлов?

Алексей
24.04.2017
16:00:54

Daniel
24.04.2017
16:01:10
А что за хоткей? При Ctrl + S?

Алексей
24.04.2017
16:01:18

Daniel
24.04.2017
16:01:32
Ну-к, ща погуглю

Алексей
24.04.2017
16:01:32

Daniel
24.04.2017
16:01:39
Два раза спасибо

Алексей
24.04.2017
16:02:19
Плюс реформат еще по коммиту есть.

Daniel
24.04.2017
16:02:34
Тоже IDEшная тема?
Или какая то тулза на pre-commit?

Алексей
24.04.2017
16:03:29
Ну да, в окне коммита в шторме. Но можно и на хуки гита php-cs-fixer повесить например.


Daniel
24.04.2017
17:13:01
При проверке через php vendor/bin/phpcs ./src -p --encoding=utf-8 --extensions=php --ignore=Tests --standard=./vendor/escapestudios/symfony2-coding-standard/Symfony2 есть еще такие ошибки:
FILE: /var/www/html/src/ChatBundle/Manager/ChatManager.php
----------------------------------------------------------------------
FOUND 1 ERROR AFFECTING 1 LINE
----------------------------------------------------------------------
15 | ERROR | Missing class doc comment
----------------------------------------------------------------------
FILE: /var/www/html/src/ChatBundle/Controller/DefaultController.php
----------------------------------------------------------------------
FOUND 3 ERRORS AFFECTING 3 LINES
----------------------------------------------------------------------
10 | ERROR | Missing class doc comment
12 | ERROR | Doc comment for parameter "$room" missing
15 | ERROR | Missing @return tag in function comment
----------------------------------------------------------------------
FILE: /var/www/html/src/ChatBundle/Topic/ChatTopic.php
----------------------------------------------------------------------
FOUND 5 ERRORS AFFECTING 5 LINES
----------------------------------------------------------------------
15 | ERROR | Missing class doc comment
53 | ERROR | Missing function doc comment
70 | ERROR | Missing function doc comment
84 | ERROR | Missing function doc comment
117 | ERROR | Missing function doc comment
----------------------------------------------------------------------
А раньше вроде была в - - rules "phpdoc_params"


Dinar
25.04.2017
08:22:15
Там убери сроку с Package всю

Daniel
25.04.2017
08:43:15
Спасибо
Еще вопрос есть по Process компоненту сф
Реально ли отключить обработку $process->wait кэллбека и сразу отдать пользователю ответ, не вырубая сам процесс?
Т.е. я в wait ожидаю, что у меня будет вывод текста "Введите капчу", как только я ловлю это событие в wait, я хочу не отрубать процесс, а просто говорить PHP что больше не надо ждать ничего, отдаю pid клиенту и все, а сам процесс так и требует ввода каптчи
Ох чую на пайтон все придется переписывать, чтобы python скрипты не запускать из PHP((

YR
25.04.2017
09:04:17
Доброе утро,не подскажите как можно проверять GET параметры в роуте, requirements не работает

Alexander
25.04.2017
09:06:01
Так:
if ($request->get('page')) {
smth();
}