Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/14: Рейтинг темы: голосов - 14, средняя оценка - 4.71
Заблокирован

Нужно ли бояться и избегать больших классов-контроллеров и дробить их на кучу?

12.11.2020, 09:55. Показов 2888. Ответов 6
Метки php (Все метки)

Студворк — интернет-сервис помощи студентам
Кликните здесь для просмотра всего текста

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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
<?php
 
 
namespace app\controllers;
 
 
use app\models\User;
use core\App;
 
class UserController extends AppController
{
    public function progressAction()
    {
        // try-catch-handler
        $this->userArea();
        $this->setTitle('Достижения');
        $user = $this->user->getAfter();
        $this->setVars(compact('user'));
    }
 
    public function infoAction()
    {
        // try-catch-handler
        $this->userArea();
        $this->setTitle('Информация');
        $user = $this->user->getAfter();
        $this->setVars(compact('user'));
    }
 
    public function trophiesAction()
    {
        // try-catch-handler
        $this->userArea();
        $this->setTitle('Трофеи');
        $user = $this->user->getAfter();
        $this->setVars(compact('user'));
    }
 
    public function propertyAction()
    {
        // try-catch-handler
        $this->userArea();
        $this->setTitle('Имущество');
        $user = $this->user->getAfter();
        $this->setVars(compact('user'));
    }
 
    public function skillsAction()
    {
        // try-catch-handler
        $this->userArea();
        $this->setTitle('Навыки');
        $user = $this->user->getAfter();
        $this->setVars(compact('user'));
    }
 
    public function indexAction()
    {
        // try-catch-handler
        $this->userArea();
        $this->setTitle('Профиль');
        $user = $this->user->getAfter();
        $this->setVars(compact('user'));
    }
 
    public function signinAction()
    {
        $this->guestArea();
        try {
            if ($this->formButton('signin')) {
                $login = filter_input(INPUT_POST, 'login');
                $password = filter_input(INPUT_POST, 'password');
                $token = $this->generateRandomString(30);
                $user = User::signin($login, $password, $token);
                if ($user) {
                    $_SESSION['id_token'] = $user->id . ':' . $user->token;
                    $this->redirectToPage();
                }
            }
        } catch (App $app) {
            $this->alert('danger', $app->getMessage());
        }
        $this->setTitle('Вход');
    }
 
    public function forgotAction()
    {
        $this->guestArea();
        try {
            if ($this->formButton('forgot')) {
                $email = filter_input(INPUT_POST, 'email');
                $new_password = $this->generateRandomString(10);
                $user = User::forgot($email, $new_password);
                if ($user) {
                    $this->sendMail($user->email, 'Новый пароль: ' . $new_password);
                    $this->redirectToPage();
                }
            }
        } catch (App $app) {
            $this->alert('danger', $app->getMessage());
        }
        $this->setTitle('Восстановление пароля');
    }
 
    public function signoutAction()
    {
        $this->userArea();
        $_SESSION = [];
        $this->redirectToPage('/');
    }
}

Соответственно ссылки у нас:

/user
/user/signin
/user/forgot
/user/skills
/user/progress
/user/info
/user/property
/user/trophies
/user/signout

Мне говорили, что не нужно бояться больших классов-контроллеров, но я хотел бы узнать у Вас, разделяли бы Вы такой контроллер на кучу контроллеров?

И если разделяли бы, то ради чего? Ради ссылок:

/user
/signin
/forgot
/skills
/progress
/info
/property
/trophies
/signout

?

Стоит ли заморачиваться выделением?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.11.2020, 09:55
Ответы с готовыми решениями:

Перегрев блока питания - нужно ли бояться?
Имею БП OCZ Fatal1ty 550W, на котором пришлось сменить кулер. Но новый кулер оказался &quot;туговат&quot; - при старте компьютера, если не...

Нужно 2 кода слепить в кучу (деревья)
нужно 2 кода слепить в кучу...чтоб получилось что-то существенное...ато я не понимаю....помогите кому не сложно....:-| #include...

Нужно вынести часть контроллеров в отдельный проект одного приложения
Всем привет! Создала приложение, где два проекта: основной(Application MVC 3)под названием Fruit и еще один (Class Library) под...

6
14 / 8 / 7
Регистрация: 09.01.2018
Сообщений: 151
14.11.2020, 13:56
Коротко - нафига? Если твой контролёр разрастается то ты просто выносишь все вычисления в сторонние классы типа Trait - чисто как пример не пропаганда.
например:
SecurityController:
Цитата Сообщение от Verolomstvo Посмотреть сообщение
/signin
Цитата Сообщение от Verolomstvo Посмотреть сообщение
/signout
AccountController:
/user
/skills
/progress
/info
/property
0
 Аватар для sad67man
2604 / 1508 / 689
Регистрация: 23.08.2015
Сообщений: 3,839
14.11.2020, 17:53
Лучший ответ Сообщение было отмечено Verolomstvo как решение

Решение

Verolomstvo, Трейты точно не нужно использовать. В данном случае лучше разнести контроллеры по группам.

AuthController (вход/выход)
SignUpController (Система регистрации)
RecoveryController (Система восстановления пароля)

Тут имеет важную роль такое понятие как "Контекст".
Нужно рассматривать сущность User не просто как набор данных, но и набор методов/действий, которые можно с ним совершить. Т.е. сущность User отвечает за регистрацию, вход, восстановления пароля. А для skills progress и т.д. я бы выделил отдельную сущность к примеру Player со своим набором методов, контроллеров операций и т.д.

К примеру можно и выделить отдельный модуль - Система обучения (блок в самом начале игры), соответственно выделить сущность "Ученик". И в этом модуле уже сконцентрироваться на его прогрессе и т.д. Где уже не будет никаких упоминаний о регистрации, восстановления пароля, подтревждения Email и т.д. - которые будут только мешать, более того изменяя модуль Обучения, у вас не будет риска повредить уже готовую систему регистрации, так эти вещи слабо пересекаются.
А после прохождения обучения - уже зарегистрировать пользователя. И создать уже полноценного Player-а. У которого уже не будет упоминаний - на какой стадии обучения он находится, так как он уже давным давно ее уже прошел и не нужно будет тянуть этот блок "Ученика" для "Игрока" (Player) всю оставшуюся его жизнь)
1
Заблокирован
15.11.2020, 07:21  [ТС]
sad67man, progress - это не уровень обучения в начале игры, это система учёта: сколько убил, отрезал ушей, сорвал жетонов, помиловал, вложил денег, совершил обменов, убил диверсантов, пригласил в альянс ........................ ДОСТИЖЕНИЯ

то есть открываем /user/progress и progressAction генерит нам HTML из таблицы учёта достижений - это просто страница, не модуль, но часть модуля User (Профиль)
Миниатюры
Нужно ли бояться и избегать больших классов-контроллеров и дробить их на кучу?   Нужно ли бояться и избегать больших классов-контроллеров и дробить их на кучу?  
0
Заблокирован
15.11.2020, 07:22  [ТС]
sad67man, а так-то я понял: нужно профиль написать отдельным модулем (в отдельной папке, чтобы при переносе не нарушить целостность мода)
0
20 / 16 / 4
Регистрация: 01.12.2018
Сообщений: 106
17.11.2020, 13:35
Лучший ответ Сообщение было отмечено Verolomstvo как решение

Решение

Для больших контроллеров предусматривают вынос действий в отдельные классы. Для нужного действия создается нужный объект. И нет необходимости грузить гигантский контроллер. Yii в пример. Да и непонятно в чем проблема раздробить большой контроллер на несколько маленьких. Тем более, что можно и не заморачиваться. Чтобы возникли тормоза из-за размеров контроллера его код должен измеряться мегабайтами. Единственное, что с большой портянкой кода сложнее работать, вот и все.
1
Заблокирован
19.11.2020, 11:54  [ТС]
Цитата Сообщение от iplaton Посмотреть сообщение
Единственное, что с большой портянкой кода сложнее работать, вот и все.
оно и тут не будет сложности

/user/info

Идём в UserController, работаем с infoAction

А вот если я создам InfoController и захочу открывать его /user/info, то вот тут-то и начинается геморрой: я, как разраб, знаю, что это прописано правилом в роутах, но другому разрабу мне нужно будет пояснить, что есть где-то в дебрях скрипта файл с массивом роутов, которыми мы подменяем нужные нам урлы, потому что всё остальное автоматом делается, мне для /user/info не нужно роут на данный момент прописывать, у меня роутер по этому урлу работает с UserController::infoAction.

Но я решил вынести в отдельные контроллеры, НО одним модулем-папкой, у меня заморочки есть - не люблю когда всё разбросано.

Добавлено через 2 минуты
Цитата Сообщение от iplaton Посмотреть сообщение
Yii в пример
не пользуюсь ФВ

Добавлено через 3 часа 51 минуту
iplaton, а чё я туплю, мне ну нужно роуты подменять правилами, у меня же отработает /user-info и это UserInfoController
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.11.2020, 11:54
Помогаю со студенческими работами здесь

Полный 0 в JavaScript, JQuery и.т.д, а нужно сделать кучу всего для сайта
Доброго времени суток! Хочу добавить на сайт страницу авторизации на которой будет изображён подвесной мост и тролль страж, тролль...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru