Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
165 / 150 / 58
Регистрация: 15.06.2013
Сообщений: 1,107

Как лучше организовать контроллер

19.07.2016, 23:02. Показов 1993. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Есть такой вопрос. Предположим что у меня есть контроллер и есть класс Parser.
PHP
1
2
3
4
5
6
7
class Parser{
    public function getLinks(){
        $links = [];
        /* Здесь мы получаем с какого-то сайта ссылки и записываем их в  $links */
        return $links;
    }
}
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
class Controller{
    public function index(){
        $parser = new Parser();
        $links = $parser->getLinks();
        if(gettype($links) != 'array' || count($links) <= 0){
            /* Обрабатываем ошибку */
        }
        foreach($links as $link){
            /* Здесь мы проходим по каждой ссылке и изменяем ее */
        }
        /* Передаем ссылки в представление */
    }
}
На сколько я понимаю обработка ссылок так же должна происходить в классе Parser. Как лучше сделать: оставить в контроллере проверку массива и перебор, а в классе парсера создаем метод изменения ссылки? Оставляем проверку, а в класс парсера выносим перебор и изменение ссылок? Или всё выносим в класс парсера и возвращаем false в случае некорректного входного массива или измененный массив, если все в порядке?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.07.2016, 23:02
Ответы с готовыми решениями:

Как лучше всего организовать изменение списков учеников на сайте?
Тема затрагивает несколько технологий, поэтому точно не знал, куда писать. Итак. Делаю сайт, который рандомно выбирает ученика для ответа...

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

Как лучше организовать поиск?
Есть несколько полей по которым нужно вести поиск в представлении, но не могу сообразить как это сделать в лотусе. В акцессе я писал...

23
Эксперт PHP
 Аватар для Fedor Vlasenko
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
19.07.2016, 23:24
Пишем класс роутера который вызывает нужный класс контролера
мини роутер можете глянуть здесь https://www.cyberforum.ru/post9376335.html
вам же стоит применить Reflection считывая параметры метода контроллера искать данные в $_REQUEST и подставлять их вместо аргументов и отрабатывать ошибку когда параметры не совпадают
0
165 / 150 / 58
Регистрация: 15.06.2013
Сообщений: 1,107
19.07.2016, 23:36  [ТС]
Спасибо. Но я не имею ввиду роутер. В данном примере его можно опустить. Предположим что нужный контроллер подключился и вызван нужный экшэн - index. Здесь меня волнует вопрос что должно быть в контроллере, а что из него нужно вынести?
0
Эксперт PHP
 Аватар для Fedor Vlasenko
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
19.07.2016, 23:45
Controller только контролирует(фильтрует) вход и передает данные для обработки модели
не совсем понятно как на входе контроллера может отказаться массив ссылок
0
165 / 150 / 58
Регистрация: 15.06.2013
Сообщений: 1,107
20.07.2016, 00:03  [ТС]
Ну это просто упрощенный пример. Можно предположить что речь идет о модели.
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
20.07.2016, 08:53
Контроллер должен быть тонким и отвечать за получение данных из модели (модель -- не обязательно один класс, это слой) и отдачу ответа клиенту в нужном виде.
0
165 / 150 / 58
Регистрация: 15.06.2013
Сообщений: 1,107
20.07.2016, 14:52  [ТС]
В этом я понял свою ошибку. Но все же, что нужно вынести из модели?
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
20.07.2016, 17:21
Цитата Сообщение от MadHatter Посмотреть сообщение
Но все же, что нужно вынести из модели?
Из модели контроллер должен получить то, что должен передать виду. Все проверки и действия над массивом, должны быть в модели.
0
165 / 150 / 58
Регистрация: 15.06.2013
Сообщений: 1,107
20.07.2016, 19:16  [ТС]
То есть должно быть примерно так?
PHP
1
2
3
4
5
6
7
class Parser{
    public function getLinks(){
        $links = [];
        /* Здесь мы получаем с какого-то сайта ссылки и записываем их в  $links */
        return $links;
    }
}
PHP
1
2
3
4
5
6
7
8
9
10
11
12
class IndexController{
    public function index(){
        $parser = new Parser();
        $links = $parser->getLinks();
        $model = new IndexModel();
        $modifiedLinks = $model->getModifiedLinks($link);
        if($modifiedLinks === false){
            /* Обрабатываем ошибку */
        }
        /* Передаем модифицированные ссылки в представление */
    }
}
PHP
1
2
3
4
5
6
7
8
9
10
11
class IndexModel{
    public function getModifiedLinks($links){
        if(gettype($links) != 'array' || count($links) <= 0){
            return false;
        }
        foreach($links as $link){
            /* Здесь мы проходим по каждой ссылке и изменяем ее */
        }
        return $links;
    }
}
И из модели в класс парсера ничего выносить не нужно?
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
20.07.2016, 20:35
Почти. Контроллер ничего не должен знать о том, откуда и каким образом получаются данные.
Его дело маленькое:
PHP
1
2
3
4
5
6
7
8
9
10
class IndexController{
    public function index(){
        $model = new IndexModel;
        $links = $model->getLinks();
        if(!$links){
            /* Обрабатываем ошибку */
        }
        /* Передаем модифицированные ссылки в представление */
    }
}
То есть -- получили массив. Если пуст -- возвращаем нужный HTTP статус или перенаправляем, например.
Если заполнен -- вызываем вид и отдаём ему массив.

А уже модель должна работать с источниками данных (в данном случае это парсер):
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class IndexModel{
    public function getLinks(){
        $parser = new Parser();
        $links = $parser->getLinks(); 
 
        if(!is_array($links) || empty($links)){
            return false;
        }
        foreach($links as $link){
            /* Здесь мы проходим по каждой ссылке и изменяем ее */
        }
        return $links;
    }
}
Из модели в Parser функционал следует перенести в том случае, если он работает с данными, специфичными только для этого источника.
Что будет, если вы решите сменить источник данных?
Вот отсюда и надо танцевать.
0
165 / 150 / 58
Регистрация: 15.06.2013
Сообщений: 1,107
21.07.2016, 08:32  [ТС]
Понятно, спасибо. Просто я в последнее время осваиваю Laravel и во всех примерах которые я видел, вся обработка данных происходит в контроллерах. А модели чисто для работы с БД. И иногда контроллеры получаются крайне жирными. Как в таких ситуациях быть?
0
 Аватар для php10
146 / 105 / 44
Регистрация: 30.04.2016
Сообщений: 550
21.07.2016, 09:38
Para bellum, скорее всего вы неверно мыслите, разве в модель данные не должны попадать из контроллера? По вашей логике зачем контроллер тогда нужен?

Контроллер как раз и передает эти данные в модель. Грубо говоря берет их из $_POST и кидает в модель через конструктор или сеттер, без разницы. Затем модель эти данные обрабатывает и возвращает контроллеру, который в свою очередь возвращает данные в вид. Контроллер это посредник между видом и моделью. А у вас получается, что контроллер можно опустить.

Модель не должна работать напрямую с окружением, $_POST, $_GET и так далее. Эти данные в модель заносит контроллер.

PHP
1
2
public function getLinks(){
        $parser = new Parser();
Также не очень хороший пример, у вас есть зависимость от Parser, но ее лучше внедрить:
PHP
1
2
3
4
public function setParser(Parser $parser)
{
     $this->_parser = $parser;
}
А еще лучше внедрить через интерфейс, тогда связь будет еще ниже.
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
21.07.2016, 22:45
Цитата Сообщение от php10 Посмотреть сообщение
разве в модель данные не должны попадать из контроллера?
У автора темы совсем другой пример ведь. Я под получением данных имел в виду парсер. Зачем контроллеру знать, откуда идут данные? Будь то чужой сайт, XML, или база данных? Его дело простое -- получил от модели данные в виде готового массива и отдал виду или отправил в JSON.
Про запрос от пользователя я молчал.
Цитата Сообщение от php10 Посмотреть сообщение
Также не очень хороший пример
Знаю. Я просто код автора темы переставил туда, где он должен быть, по идее.
А теперь вопрос по Вашему примеру: кто должен вызвать метод setParser? По-моему, тут вообще лучше использовать контейнер с объектами для автоматического внедрения зависимостей.

Добавлено через 7 минут
Цитата Сообщение от MadHatter Посмотреть сообщение
А модели чисто для работы с БД.
Это сущности, а не модели приложения, как таковые. Их не нужно загружать, как и контроллер.
Цитата Сообщение от MadHatter Посмотреть сообщение
И иногда контроллеры получаются крайне жирными. Как в таких ситуациях быть?
Очень правильный вопрос. Контроллеры не должны быть толстыми. Основную логику приложения нужно перенести в Service Layer.
0
 Аватар для php10
146 / 105 / 44
Регистрация: 30.04.2016
Сообщений: 550
21.07.2016, 22:48
Para bellum на счет контейнера - не спорю
Прочитал еще раз первый топик ТСа. У него по-сути должно быть два метода:
PHP
1
2
3
4
5
6
7
8
9
public function getLinks()
{
      return [];
}
 
public function parseLink($link)
{
 
}
А так получается в геттере, происходит какая-то дополнительная обработка и сохранение данных, что в корне неправильно.

Кстати, никто не запрещает использовать контроллер как посредник, т.е. вызвали в контроллере getLinks(), а потом вызвали метод parseLink($link), чтобы обработать по ссылке какую-то информацию.
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
21.07.2016, 23:15
Цитата Сообщение от php10 Посмотреть сообщение
У него по-сути должно быть два метода
В IndexModel? Там уж как получится. Дело в том, что мы не знаем, за что отвечает класс Parser и зачем ссылки обрабатывать в модели. Может их стоит перенести в класс Parser. Следует просто задать вопрос: а если потребуется сменить поставщика данных (т.е. парсер) -- мне всё ещё нужна будет эта обработка модели?
Если да -- то оставляем в модели, если нет -- смело убираем в Parser, так как эта обработка специфична лишь для него.
Цитата Сообщение от php10 Посмотреть сообщение
Кстати, никто не запрещает использовать контроллер как посредник, т.е. вызвали в контроллере getLinks()
А где же тогда низкая связанность, ради которой всё и меняем?
1
 Аватар для php10
146 / 105 / 44
Регистрация: 30.04.2016
Сообщений: 550
22.07.2016, 08:28
Цитата Сообщение от Para bellum Посмотреть сообщение
А где же тогда низкая связанность, ради которой всё и меняем?
Она в Symfony
Больше, как таковой ее нигде нет. Контроллер пусть засовывает данные в модель, это как раз MVC подход.
1
165 / 150 / 58
Регистрация: 15.06.2013
Сообщений: 1,107
22.07.2016, 19:34  [ТС]
Спасибо большое за ваши ответы. Получил много интересной информации.
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
24.07.2016, 21:52
Цитата Сообщение от php10 Посмотреть сообщение
Она в Symfony
Вот. Как минимум, можно посмотреть (если именно "велосипед" нужен), как там реализовано и сделать также в своём проекте. Не монополия же у Symfony на низкую связанность.
Цитата Сообщение от php10 Посмотреть сообщение
Контроллер пусть засовывает данные в модель, это как раз MVC подход.
Не согласен. Как минимум, это можно в Service Layer перенести.
0
 Аватар для php10
146 / 105 / 44
Регистрация: 30.04.2016
Сообщений: 550
25.07.2016, 08:03
Para bellum, во многих фреймворках, в т.ч. и в Symfony в модель данные приходят из контроллера.
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
25.07.2016, 09:18
Пример можете показать? Вот не укладывается у меня в голове, с чего вдруг контроллер манипулирует с ресурсами, с которыми должен работать слой модели.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.07.2016, 09:18
Помогаю со студенческими работами здесь

Как лучше организовать базу
Нужно создать базу-мед карточку ребенка. У меня есть 1 общая таблица состоящая из (фио, дата рожд и других общих сведений), затем есть 2...

Как лучше организовать данные
Добрый день. Создаю класс CError для хранения в нём ошибок. От класса требуется хранить информацию о всех возникающих в процессе работы...

Как лучше организовать структуру?
Добрый вечер, поскажите как правильнее решить такую задачку, думал 2 дня а ничего толкового не придумал. Есть две таблички, Item и...

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

Как лучше организовать сортировку?
Добрый день. Есть некий класс, он хранит у себя коллекцию обьектов. Обновляется следующим образом: 1) Получает обновление (коллекцию...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru