Форум программистов, компьютерный форум, киберфорум
PHP: Symfony
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
11 / 11 / 13
Регистрация: 25.04.2012
Сообщений: 1,163

Как можно оптимизировать такой код?

11.04.2018, 21:11. Показов 2743. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Очень много сходств как правильно было бы это сократить?

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/**
     * @Rest\Post("/users/{userId}/group/{groupId}")
     */
    public function addUserToGroupAction($userId, $groupId)
    {
        $userManager = $this->get('fos_user.user_manager');
        $groupManager = $this->get('group_manager');
 
        $user = $userManager->findUserBy(['id' => $userId]);
 
        if (is_null($user)) {
            return $this->handleView($this->view('User not found', Response::HTTP_NOT_FOUND));
        }
 
        $group = $groupManager->getById($groupId);
 
        if (is_null($group)) {
            return $this->handleView($this->view('Group not found', Response::HTTP_NOT_FOUND));
        }
 
        try {
 
            $user->addGroup($group);
            $userManager->updateUser($user);
 
            return $this->handleView($this->view('User assign to group successfull', Response::HTTP_OK));
 
        } catch (\Exception $e) {
            return $this->handleView($this->view($e->getMessage()));
        }
    }
 
    /**
     * @Rest\Delete("/users/{userId}/group/{groupId}")
     */
    public function deleteUserFromGroupAction($userId, $groupId)
    {
        $userManager = $this->get('fos_user.user_manager');
        $groupManager = $this->get('group_manager');
 
        $user = $userManager->findUserBy(['id' => $userId]);
 
        if (is_null($user)) {
            return $this->handleView($this->view('User not found', Response::HTTP_NOT_FOUND));
        }
 
        $group = $groupManager->getById($groupId);
 
        if (is_null($group)) {
            return $this->handleView($this->view('Group not found', Response::HTTP_NOT_FOUND));
        }
 
        try {
 
            $user->removeGroup($group);
            $userManager->updateUser($user);
 
            return $this->handleView($this->view('User remove from group successfull', Response::HTTP_OK));
 
        } catch (\Exception $e) {
            return $this->handleView($this->view($e->getMessage()));
        }
    }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.04.2018, 21:11
Ответы с готовыми решениями:

Можно ли оптимизировать такой запрос?
SELECT * FROM table1 where Name not like '%'+(select name from table2 where id=1)+'%' and Name not like '%'+(select name from...

Как можно оптимизировать код?
Здравствуйте, помогите пожалуйста ускорить работу программы. Программа читает журнал событий винды, и выводит в gridControl. На...

Как можно оптимизировать код?
#include <iostream> #include <algorithm> #include <vector> using namespace std; int main() { int n, temp; cin>>n; ...

29
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
12.04.2018, 16:35
Студворк — интернет-сервис помощи студентам
andr-xw, он не становится ненужным. Таких дополнительных методов на практике будет крайне мало, нп делать же на каждый метод вспомогательным. И param converter делает еще 1 удобную вещь - 404 при отсутствии сущности.
0
123 / 77 / 33
Регистрация: 05.03.2013
Сообщений: 449
12.04.2018, 18:45
Jewbacabra, только это не вспомогательный метод, это обычный метод бизнес логики, он может даже отдельным сервисным классом реализовываться.

Цитата Сообщение от Jewbacabra Посмотреть сообщение
И param converter делает еще 1 удобную вещь - 404 при отсутствии сущности.
Опять же нет гибкости, а если у твоего юзера стоит флаг is_deleted и тебе нужно показать не 404, а 410 ошибку (а это довольно частый кейс), тебе придется писать свой хендлер парам конвертера, размазывая бизнес-логику приложения по инфрастуктурному слою.
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
12.04.2018, 20:27
andr-xw, вот только бизнес логика оперирует сущностями. И сервисы должны оперировать ими. На айди тайпхинты не добавишь. Если надо вдруг возвращать 410 нужно один раз реализовать свой сервис получения usera и использовать его в свреи param converter. И это не "размазывание", а разбиение каждому сервису по своей зоне ответственности.
Вот с param converter на практике ни разу проблем не возникло, с переиспользованием все было отлично. А вот без него были не то что проблемы, но некоторые неприятности доставил.

Добавлено через 32 минуты
И гибкость именно в том и проявляется, что есть несколько небольших сервисов и их можно легко комбинировать между собой добиваясь различного результата. Может 410 нужно возвращать только для одних контроллеров, в других не нужно. Комбинируя конвертеры будет гораздо легче добиться этого, чем с монолиьным сервисом который работает лишь с ид и нуждается во все большем числе завистмостей чтобы различные ситуации разрулить
0
11 / 11 / 13
Регистрация: 25.04.2012
Сообщений: 1,163
12.04.2018, 21:43  [ТС]
а как с assert'a получать нормальную ошибку вместо такой


PHP
1
{"error":{"code":500,"message":"Internal Server Error","exception":[{"message":"An exception occurred while executing 'INSERT INTO users (username, username_canonical, email, email_canonical, enabled, salt, password, last_login, confirmation_token, password_requested_at, roles) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' with params [null, null, null, null, 1, null, null, null, null, null, \"a:1:{i:0;s:0:\\\"\\\";}\"]:\n\nSQLSTATE[23000]: Integrity constraint violation: 1048 Column 'username' cannot be null","class":"Doctrine\\DBAL\\Exception\\NotNullConstraintViolationException","trace":[{"namespace":"","short_class":"","class":"","type":"","function":"","file":"\/home\/dev\/Desktop\/Projects\/nfq_task\/vendor\/doctrine\/dbal\/lib\/Doctrine\/DBAL\/Driver\/AbstractMySQLDriver.php","line":112,"args":[]},{"namespace":"Doctrine\\DBAL\\Driver","short_class":"AbstractMySQLDriver","class":"Doctrine\\DBAL\\Driver\\AbstractMySQLDriver","type":"->","function":"convertException","file":"\/home\/dev\/Desktop\/Projects\/nfq_task\/vendor\/doctrine\/dbal\/lib\/Doctrine\/DBAL\/DBALException.php","line":128,"args":[["string","An exception occurred while executing 'INSERT INTO users (username, username_canonical, email, email_canonical, enabled, salt, password, last_login, confirmation_token, password_requested_at, roles) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' with params [null, null, null, null, 1, null, null, null, null, null, \"a:1:{i:0;s:0:\\\"\\\";}\"]:\n\nSQLSTATE[23000]: Integrity constraint violation: 1048 Column 'username' cannot be null"],["object","Doctrine\\DBAL\\Driver\\PDOException"]]},
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
12.04.2018, 21:57
Цитата Сообщение от sendxt Посмотреть сообщение
а как с assert'a получать нормальную ошибку вместо такой
Тут явно не ошибка валидации
0
11 / 11 / 13
Регистрация: 25.04.2012
Сообщений: 1,163
13.04.2018, 09:08  [ТС]
Jewbacabra, правильно почему вместо constraint'a notBlank вылетает sql exception

Добавлено через 35 минут
С валидацией и выводом ошибок разобрался,

Как быть с полями как пример при создании юзера, если я хочу логику проверок и.т.д вынести в сервис и это API, не использую form component,

предположим у меня есть сервис user_manager и в нём функция createUser мне поля с request передавать $request->request->all и там ещё каждое поля проверять перед добавлением к сущности?

Добавлено через 52 секунды
или соберать сущность в контролере типо


PHP
1
2
3
4
5
6
7
$user = $um->createUser();
        $user
            ->setUsername($request->get('username'))
            ->setEmail($request->get('email'))
            ->setPlainPassword($request->get('password'))
            ->setRoles([$request->get('role')])
            ->setEnabled(true);
0
 Аватар для Borsche
183 / 110 / 44
Регистрация: 03.07.2016
Сообщений: 496
13.04.2018, 09:22
Цитата Сообщение от sendxt Посмотреть сообщение
не использую form component
Зря зря
0
11 / 11 / 13
Регистрация: 25.04.2012
Сообщений: 1,163
13.04.2018, 09:33  [ТС]
Borsche, что значит зря? Я же писал что это API

Добавлено через 1 минуту
Как пример в Laravel есть Request validation создаешь свой валидатор подставляешь вместо Request в параметрах функции контролера и все дела
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
13.04.2018, 10:46
sendxt, а данные приходят в виде json? Тогда я бы сделал отдельные дата классы для объектов запроса, настроил для них правила сериализации и валидации. В fos rest есть param converter, который может тело запроса сконвертить в соответствующие объекты. Также fos rest сможет их провалидировать, но при ошибках сам исключение не кинет, вместо этого добавтся новый аргумнт в action, в котором будет список ошибок валидации, и нужнл самому проверять случай если он не пустой.
1
123 / 77 / 33
Регистрация: 05.03.2013
Сообщений: 449
16.04.2018, 13:05
Цитата Сообщение от Jewbacabra Посмотреть сообщение
andr-xw, вот только бизнес логика оперирует сущностями. И сервисы должны оперировать ими. На айди тайпхинты не добавишь. Если надо вдруг возвращать 410 нужно один раз реализовать свой сервис получения usera и использовать его в свреи param converter. И это не "размазывание", а разбиение каждому сервису по своей зоне ответственности.
Вот с param converter на практике ни разу проблем не возникло, с переиспользованием все было отлично. А вот без него были не то что проблемы, но некоторые неприятности доставил.

Добавлено через 32 минуты
И гибкость именно в том и проявляется, что есть несколько небольших сервисов и их можно легко комбинировать между собой добиваясь различного результата. Может 410 нужно возвращать только для одних контроллеров, в других не нужно. Комбинируя конвертеры будет гораздо легче добиться этого, чем с монолиьным сервисом который работает лишь с ид и нуждается во все большем числе завистмостей чтобы различные ситуации разрулить
Jewbacabra, с моей точки зрения должно быть так: есть первый сервис, принимающий в аргументы сущности, мутирующий их и кладущий в хранилище (и вот никуда ты тут от энтити менеджера не денешься, будь он не ладен). И есть второй сервис, который принимает в аргументы айдишники, достает по ним сущности и передает в обработку первому сервису.

Ты же хочешь переложить задачи второго сервиса (инициализация сущностей) на http-слой, добавляя ему лишнюю ответственность. А если так сильно хочется type hint во втором сервисе - можно сделать ДТО или VO, и для их создания уже юзать парам конвертер (хотя при анемичной модели, на мой взгляд, это выглядит избыточно).

Никакой "универсальны сервис получения юзера" ты все равно не напишешь, если твое приложение чуть сложнее хлебушка. Потому что, например, если профиль юзера удален, то при попытке добавится в группу самому, нужно ему отдать 403, если юзера хочет добавить в группу админ группы - то 410, а если это делает модератор портала - то 201 и таки добавить юзера в группу, несмотря на то, что он удален. И тебе в любом случае придется описать все три юзеркейса, и лучше это будет сделать в разных сервисах.

Правильное использование парам конвертера это:
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Тогда я бы сделал отдельные дата классы для объектов запроса, настроил для них правила сериализации и валидации. В fos rest есть param converter, который может тело запроса сконвертить в соответствующие объекты.
Цитата Сообщение от Jewbacabra Посмотреть сообщение
В fos rest есть param converter, который может тело запроса сконвертить в соответствующие объекты.
ParamСonverter не является частью FOSRestBundle, он является частью SensioFrameworkExtraBundle, который, в свою очередь, только рекомендован для FOSRestBundle (так же как и сериалайзер, и валидатор), но не обязателен.

Пруфы:
https://github.com/FriendsOfSy... poser.json
https://symfony.com/doc/curren... rters.html

А ещё ParamСonverter конфликтует с автовайрингом, появившимся ещё в версии 3.3
https://symfony.com/doc/curren... anges.html

И если нужно использовать type hint, то вместо парам конвертера сенсио-экстра-бандла нужно использовать компонент argument resolver, входящий в состав HttpKernel, вот этот:
https://symfony.com/doc/curren... olver.html

Ну или добавлять класс в исключения.

Добавлено через 14 минут
Цитата Сообщение от Borsche Посмотреть сообщение
Зря зря
Ниче не зря. "form component" - это же кусок говна. Отправлять форму гетом - нельзя, нормально смапить названия параметров запроса к названиям филдов нельзя, какие-то непонятный токены хочет, без которых тоже никак. Залез в исходники - а там тонна каких-то нелепых ограничений, и нет штатных способов их обойти. Нет, возможно, если протрахаться с ним недельку - может и получится что-то из него выдоить. А может и не получится. В любом случае, нафига так себе жизнь усложнять?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.04.2018, 13:05

Как можно оптимизировать код?
Здравствуйте! Столкнулся с проблемой. VBA стал ругаться на сильно длинный код. Надо его оптимизировать, а как сделать не знаю....

Как можно оптимизировать код?
#include <stdio.h> unsigned int A; int main(){ int i,p; p=6; for(i=5;i>=0;i--){ __asm{ //if(i<3) cmp ...

Как можно оптимизировать код?
Здравствуйте. Написал скрипт, позволяющий считывать с сервера картинку, преобразовывать ее в нужный размер и накладывать на нее другую...

Как можно оптимизировать этот код?
Как можно оптимизировать этот код? $preview = 'preview.'; $preview_url = 'images/' . $folder . '/' . $preview; if ( file_exists(...

Подскажите, как можно оптимизировать код?
Код проверяет, что нет такого ид в переменной for (int i = 0; c33 < cd1.Split(';').Length; i++) { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
сукцессия 30. Ансамблевая кластерная параметризаци, часть 1.
anaschu 24.07.2026
Пр# Сопровождение научной статьи ИИ-ассистентом: подготовка публикации и калибровка агентно-ориентированной модели сукцессии микоризных систем **Полевые заметки о двухнедельной совместной работе**. . .
Теория всего 12. ВГК на планете в стратегической игре "терра"
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат» Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru