Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP: Symfony
Войти
Регистрация
Восстановить пароль
 
 
sendxt
9 / 9 / 13
Регистрация: 25.04.2012
Сообщений: 1,156
1

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

11.04.2018, 21:11. Просмотров 430. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2018, 21:11
Ответы с готовыми решениями:

Оптимизировать приведенный код
Добрый всем день! На мое тестовое задание при приеме на курсы php сказали, что...

[Smarty] Как можно сократить код?
Как можно сократить следующий код в Smarty? {if $item.id ne '3' && $item.id...

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

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

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

29
falcons83
7 / 7 / 4
Регистрация: 30.11.2017
Сообщений: 40
Завершенные тесты: 1
11.04.2018, 21:21 2
Открой в QT там есть поиск с заменой и поменяй нафиг имена всех переменных)))
0
sendxt
9 / 9 / 13
Регистрация: 25.04.2012
Сообщений: 1,156
12.04.2018, 09:51  [ТС] 3
falcons83, что такое QT ? ) и что с переменными не так?
0
Borsche
166 / 95 / 41
Регистрация: 03.07.2016
Сообщений: 416
12.04.2018, 11:58 4
Ну во первых почитайте про ParamConverter и вы избавитесь от
PHP
1
2
3
4
5
6
7
8
9
10
11
        $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));
        }
Также можно настроить контроллер для иньекций сервисов и тогда ищё минус две строки
PHP
1
2
        $userManager = $this->get('fos_user.user_manager');
        $groupManager = $this->get('group_manager');
1
sendxt
9 / 9 / 13
Регистрация: 25.04.2012
Сообщений: 1,156
12.04.2018, 12:02  [ТС] 5
Borsche, спасибо, а про настроить контролер это описать его как сервис?
0
Borsche
166 / 95 / 41
Регистрация: 03.07.2016
Сообщений: 416
12.04.2018, 12:42 6
Да. Я не знаю какая у вас версия симфони, но с версии 3.3 можно указать скопом папку с контроллерами
0
sendxt
9 / 9 / 13
Регистрация: 25.04.2012
Сообщений: 1,156
12.04.2018, 12:45  [ТС] 7
Borsche, и что тогда получается в каждый контролер будет добавляться зависимость
0
Borsche
166 / 95 / 41
Регистрация: 03.07.2016
Сообщений: 416
12.04.2018, 12:49 8
Тогда можно писать типо так
PHP
1
public function addHotelSeasonForm(Request $request, Hotel $hotel, EntityManagerInterface $em, Breadcrumbs $breadcrumbs, Router $router)
Любой сервис с контейнера можно заинжектить автоматом.
1
andr-xw
121 / 76 / 32
Регистрация: 05.03.2013
Сообщений: 447
12.04.2018, 14:18 9
Цитата Сообщение от sendxt Посмотреть сообщение
Borsche, спасибо, а про настроить контролер это описать его как сервис?
Нет. Не контроллер. Сделай отдельный сервис, который будет принимать в конструктор $userManager и $groupManager, а в метод addUserToGroupAction() параметры $userId и $groupId. Всю свою логику перенеси туда, только return $this->handleView() замени на throw new EntityNotFoundException().

В контроллере просто вызывай этот сервис и передавай параметры.
1
sendxt
9 / 9 / 13
Регистрация: 25.04.2012
Сообщений: 1,156
12.04.2018, 14:56  [ТС] 10
andr-xw,


у меня сейчас выглядит так

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
     * @Rest\Delete("/users/{userId}/group/{groupId}")
     */
    public function deleteFromGroupAction(User $user, Group $group)
    {
        $um = $this->get('fos_user.user_manager');
 
        try {
 
            $user->removeGroup($group);
            $um->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()));
        }
    }
Этот try catch блок вынести в сервис правильно понимаю?

Добавлено через 1 минуту
PHP
1
$e->getMessage()
что вместо это лучше всего возвращать в блоке catch?
0
andr-xw
121 / 76 / 32
Регистрация: 05.03.2013
Сообщений: 447
12.04.2018, 15:00 11
sendxt, нет, try catch блок выносить не надо, его можно вообще убрать, а эксепшны обрабатывать эксепшн листенером.

Но вообще мой пост адресован к вашему изначальному коду. Сей час же ты размазал свою логику по фреймворку, я бы так определенно делать не стал.
0
sendxt
9 / 9 / 13
Регистрация: 25.04.2012
Сообщений: 1,156
12.04.2018, 15:04  [ТС] 12
andr-xw, а чем это плохо? я воспользовался советом данным выше использовать ParamConverter
0
Jewbacabra
Эксперт PHP
3429 / 2854 / 1285
Регистрация: 24.04.2014
Сообщений: 8,657
12.04.2018, 15:04 13
sendxt, в fos rest bundle есть возможность обрабатывать ошибки в отдельном контроллере, так что try catch не нужен
1
andr-xw
121 / 76 / 32
Регистрация: 05.03.2013
Сообщений: 447
12.04.2018, 15:13 14
sendxt, не все йогурты советы одинаково полезны. Плохо то, что ты не сможешь повторно использовать этот код. Предположим, тебе нужно будет добавить юзера в группу при каком-то условии, выполниющемся в cron-скрипте. Ну будешь же ты ради этого делать http-запрос или поднимать весь контекст контроллера.
0
Jewbacabra
Эксперт PHP
3429 / 2854 / 1285
Регистрация: 24.04.2014
Сообщений: 8,657
12.04.2018, 15:14 15
andr-xw, чем плох в данном случае param converter? Как он помешает добавить при выполнении условия и т.д?
0
sendxt
9 / 9 / 13
Регистрация: 25.04.2012
Сообщений: 1,156
12.04.2018, 15:23  [ТС] 16
Еще вопрос раз уже обсуждение идёт, как делать валидацию если это API, есть вариант с assert constraint, но предположим я использую user bundle и наследую базовый класс user'a, и в createUser мне надо провалидировать поля, username, email, password ?
0
Jewbacabra
Эксперт PHP
3429 / 2854 / 1285
Регистрация: 24.04.2014
Сообщений: 8,657
12.04.2018, 15:26 17
sendxt, валидацию не обязательно прописывать в аннотациях, это можно сделать в yml или xml конфиге. Так что можно задавать правила для "чужих" объектов
1
andr-xw
121 / 76 / 32
Регистрация: 05.03.2013
Сообщений: 447
12.04.2018, 15:58 18
Цитата Сообщение от Jewbacabra Посмотреть сообщение
andr-xw, чем плох в данном случае param converter? Как он помешает добавить при выполнении условия и т.д?
param converter плох в данном случае плох тем, что работает с данными, лежащими за рамками http-контекста.

Мешает он тем, что код нельзя вторично использовать. Когда тебе потребуется добавить юзера в группу в другом месте - тебе придутся писать аналогичный код. А когда придет требование по доработке логики добавления юзера в группу - велика вероятность того, что это изменение будет сделано только в одном месте.
0
Jewbacabra
Эксперт PHP
3429 / 2854 / 1285
Регистрация: 24.04.2014
Сообщений: 8,657
12.04.2018, 16:24 19
andr-xw, как это нельзя повторно использовать. Делаетмя сервис, принимающий два аргумента сущности. Откуда эти сущности берутся: из param converter, из менеджера или как-то еще этот сервис не волнует, он работает с готовыми сущностями

Добавлено через 11 минут
Если проблема в 2 строчках, в которых есть получение объекта, и вызов происходит например из консольной команды, то можно добавить й метод, принимающий идишки вместо сущностей, достающий сущности, и вызывающий первый метод.

Добавлено через 5 минут
PS как-то столкнулся с проектом, где сущности между сервисами передавались в виде id. И в каждом методе сервиса в начале было извлечение сущностей по ид, вот это сильно раздражало. Когда сущность уже есть, но вместо простой передачи ввиде аргумента было размазано ее получение везде. И изза этого entity manager инжектился везде, даже где он не нужен.
0
andr-xw
121 / 76 / 32
Регистрация: 05.03.2013
Сообщений: 447
12.04.2018, 16:31 20
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Если проблема в 2 строчках, в которых есть получение объекта, и вызов происходит например из консольной команды, то можно добавить й метод, принимающий идишки вместо сущностей, достающий сущности, и вызывающий первый метод.
Все верно. И в этом случае парам конвертер становится ненужным.
0
12.04.2018, 16:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.04.2018, 16:31

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

Можно как-то оптимизировать этот код?
#include <iostream> using namespace std; int main() { unsigned int num,...

Как можно оптимизировать/ускорить код?
Здравствуйте, задача примерно такого типа: на экселевском листе есть данные в 3...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru