paul85
28.09.2014 - 01:14
Добрый день, уважаемые гуру!
За время работы возникло несколько вопросов, которые самостоятельно решить не получается. Все они касаются архитектуры.
1. Правильно ли я понимаю, что для работы с суперглобальными переменными лучше использовать отдельный класс, через который забирать данные. Там же производить trim, и в нем же валидацию? Если да, то к какой части MVC он должен принадлежать?
2. Есть модель user, в которой хранятся данные пользователя: его привилегии, имя, uid и т.д. Каждый раз при обращении к ресурсу эта модель (экземпляр) заполняется и контроллеры берут данные уже из нее. Там же реализованы всплывающие сообщения и прочее. Такая особая модель с синглтоном. Вопрос в том, куда девать методы типа getUserCart и getUserProfile, те самые, из личного кабинета? Создавать обыкновенную модель client или пихать в user? С одной стороны у них сущности очень похожи - и там и тут речь идет о пользователе. Но с другой - совершенно разные цели и ситуации для работы с ними. В моем случае user больше создавалась для межстраничного взаимодействия. Работа с сессией и т.д.
3. Куда девать различные "штуки" такие как пагинатор? И откуда этот пагинатор вызывать? Это ведь обработка данных, значит ему место где-то около моделей, так?
4. Не хватает некоторого интерфейса взаимодействия между моделями. Гнать через контроллер не всегда удобно и не всегда логично. Вот как раз ситуация с пагинатором тем же... Как эти моменты решаются у дядек во фреймворках?
inpost
28.09.2014 - 02:27
1) Разработчики ПХП сделали его открытым. Разработчики какой-то CMS или Фреймворка, который ежедневно выпускает новые версии и меняет постоянно архитектуру (laravel 4, Yii 2, Kohana 3, Drupal 8) решили, что надо его засунуть в определённую видимость, чтобы закрыть прямой доступ. Вопрос, кто из них мудрее? Заметь, что за около 10 лет никто не решил над сессией повесить оболочку особую, хотя ввели и ООП и неймспейсы, но суперглобальный остался суперглобальным.
П.С. Тут возразят фанаты объектного представления данных.
2) Смотря что выполнять будет твой getUserProfile. Если это прослойка для доступа к данным, то почему бы не реализовать как отдельный класс User, в нём этот метод для доступа к юзеру. А если это как страничка профиля, то в модели этой страницы.
3) Ты же учишь laravel, там пагинатор как отдельный класс библиотеки идёт (тоже самое и в пункте 2 говорил). Это не модель (класс) определённой страницы, это подключаемые библиотеки функционала. Вызывать пагинатор стоит из модели (в идеальном MVC) или из вида, вызывать модель можно как из контроллера, так и из вида. Я сторонник прямого вызова из вида.
4) Пагинатор идёт отдельно и относится к общим библиотекам, отсюда вызвать можно откуда угодно.
ИМХО

Будут уточняющие вопросы - можешь в скайп написать.
_____________
Обучаю веб-программированию качественно и не дорого:
http://school-php.comФрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Invis1ble
28.09.2014 - 04:16
Привет.
Цитата |
1. Правильно ли я понимаю, что для работы с суперглобальными переменными лучше использовать отдельный класс, через который забирать данные. Там же производить trim, и в нем же валидацию? Если да, то к какой части MVC он должен принадлежать? |
Да.
Нет.
Ни к какой, это ядро системы. Можно конечно к контроллеру отнести с огромной натяжкой.
Цитата |
2. Есть модель user, в которой хранятся данные пользователя: его привилегии, имя, uid и т.д. Каждый раз при обращении к ресурсу эта модель (экземпляр) заполняется и контроллеры берут данные уже из нее. Там же реализованы всплывающие сообщения и прочее. Такая особая модель с синглтоном. Вопрос в том, куда девать методы типа getUserCart и getUserProfile, те самые, из личного кабинета? Создавать обыкновенную модель client или пихать в user? С одной стороны у них сущности очень похожи - и там и тут речь идет о пользователе. Но с другой - совершенно разные цели и ситуации для работы с ними. В моем случае user больше создавалась для межстраничного взаимодействия. Работа с сессией и т.д. |
В отдельную сущность вынести лучше, думаю. И, например, при создании объекта передавать объект User, если эта сущность зависит от User. Ну или в каждый метод, что-то типа Client::getUserProfile(User $user). Хотя мне не совсем понятно назначение этих методов.
Вообще, тут есть множество мнений и еще надо смотреть конкретный случай.
Цитата |
3. Куда девать различные "штуки" такие как пагинатор? И откуда этот пагинатор вызывать? Это ведь обработка данных, значит ему место где-то около моделей, так? |
Пагинатор обычно идет отдельным сервисом, и к MVC не должен иметь отношения.
Цитата |
4. Не хватает некоторого интерфейса взаимодействия между моделями. Гнать через контроллер не всегда удобно и не всегда логично. Вот как раз ситуация с пагинатором тем же... Как эти моменты решаются у дядек во фреймворках? |
Это обычно решается самим программистом. Можно и через контроллер.
_____________
Профессиональная разработка на заказЯ на GitHub |
второй профиль
Michael
28.09.2014 - 10:08
Валидация модели должна быть привязана к модели.
Валидация данных запроса в контроллере и его обвязке.
Пагинатор - элемент вида.
Цитата |
getUserCart и getUserProfile, те самые, из личного кабинета? Создавать обыкновенную модель client или пихать в user? |
думаю в user будет логично.
Расширить объект динамически можно через магию, типа того как поведения в yii работают. Есть базовый объект user. Если это сборка для магазина, то подключаешь модуль магазина и тюнишь объекты ядра нужными поведениями.
_____________
There never was a struggle in the soul of a good man that was not hard
paul85
28.09.2014 - 20:36
Спасибо за помощь, я теперь решил для себя кой-какие вопросы.
Цитата (inpost @ 28.09.2014 - 02:27) |
за около 10 лет никто не решил над сессией повесить оболочку особую |
Я сейчас работаю в NetBeans и там при обращении к тому же $_POST уже нотис вылетает, мол, не обращайтесь к массиву напрямую. А как же к нему обращаться!? Ведь в конечном счете все-равно напрямую получится. Если не я, так библиотека или класс будет обращаться. Непонятно, вобщем.
Цитата (inpost @ 28.09.2014 - 02:27) |
ИМХО Будут уточняющие вопросы - можешь в скайп написать. |
Благодарю! ) Воспользуюсь как-нибудь! )
Цитата (Invis1ble @ 28.09.2014 - 04:16) |
Хотя мне не совсем понятно назначение этих методов. |
Ну вот клиент заходит в свой личный кабинет. Там ведь должны отображаться какие-то его настройки, история заказов и т.д. Эти данные каким-то образом надо получать из БД. Я вот об этих методах модели типа getUserOrders($uid).
Цитата (Invis1ble @ 28.09.2014 - 04:16) |
Пагинатор обычно идет отдельным сервисом, и к MVC не должен иметь отношения. |
То есть его в принципе тоже можно запихнуть куда-нибудь в библии и вызывать через ядро? Хотя штука настолько часто используемая, что ее наверное можно запилить в само ядро.
Цитата (Michael @ 28.09.2014 - 10:08) |
Валидация модели должна быть привязана к модели. Валидация данных запроса в контроллере и его обвязке. |
Вот тут я не понял. Если мы произвели валидацию в контроллепе, то что же тогда валидировать в модели? Мы уже контроллером проверили данные, можем смело отдавать в модель без валидации. Разве нет?
inpost
28.09.2014 - 20:46
paul85
Цитата |
То есть его в принципе тоже можно запихнуть куда-нибудь в библии и вызывать через ядро? Хотя штука настолько часто используемая, что ее наверное можно запилить в само ядро. |
Ну ты же Lareval учишь? Там перечень классов есть доступных ядра. В Yii так же.
Цитата |
Ведь в конечном счете все-равно напрямую получится. |
Именно. Представляешь до какого мозги вскипели, что такую ошибку допускать? Кому-то явно надо отдыхать

Цитата |
Вот тут я не понял. Если мы произвели валидацию в контроллепе, то что же тогда валидировать в модели? |
http://framework.zend.com/manual/2.3/en/ge...udio/tasks.htmlГлянь пример с TaskController.php
_____________
Обучаю веб-программированию качественно и не дорого:
http://school-php.comФрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Invis1ble
29.09.2014 - 06:01
Цитата |
Я сейчас работаю в NetBeans и там при обращении к тому же $_POST уже нотис вылетает, мол, не обращайтесь к массиву напрямую. А как же к нему обращаться!? Ведь в конечном счете все-равно напрямую получится. Если не я, так библиотека или класс будет обращаться. Непонятно, вобщем. |
Эти предупреждения можно отключить в настройках, если ты знаешь, что делаешь и тебя эти нотайсы реально напрягают. Лично я отключил предупреждения о превышении рекомендумого кол-ва строк в методах и классах и еще некоторые

Цитата |
Там ведь должны отображаться какие-то его настройки, история заказов и т.д. Эти данные каким-то образом надо получать из БД. Я вот об этих методах модели типа getUserOrders($uid). |
Ну лично я обычно напрямую обращаюсь к соответствующим моделям. Хотя, если такой код встречается в нескольких местах, то можно ввести доп. слой абстракции типа Клиент.
Цитата |
То есть его в принципе тоже можно запихнуть куда-нибудь в библии и вызывать через ядро? Хотя штука настолько часто используемая, что ее наверное можно запилить в само ядро. |
Да не, в ядре таким вещам точно не место. Если это уже отдельная библиотека, то и пользуйся ей в контроллере/виде (в зависимости от уровня абстракции, которую предоставляет API пагинатора).
_____________
Профессиональная разработка на заказЯ на GitHub |
второй профиль
Michael
29.09.2014 - 08:12
Цитата (paul85) |
Вот тут я не понял. Если мы произвели валидацию в контроллепе, то что же тогда валидировать в модели? Мы уже контроллером проверили данные, можем смело отдавать в модель без валидации. Разве нет? |
А как твой контроллер может знать что там валидировать в модели?
Он вызовет $model->validate() и все.
Валидация в контроллере - для остальных вещей. Например showPost($id), проверка что модель с записью $id существует.
_____________
There never was a struggle in the soul of a good man that was not hard
bestxp
29.09.2014 - 10:41
Валидация данных приходящих в модель лежит на контролере или на форме
если нужно проверить еще раз конкретные данные нужно сделать в идеале спецификацию
1. Лучше реализовать хэлпер класс, в котором производить всякие манипуляции и обрабатывать $_GET, $_POST. Во многих фреймворках есть оболочки. Для чего это нужно? Для того, чтобы каждый раз не заморачиваться по поыоду минимальных проверок.
2. Модель User может содержать поле - ссылку на объект UserCart и прочие. Но вот всплывающие сообщения реализовывать в моделе.. это как-то не очень правильно. Если это, конечно, реализовано в моделе, а не в контроллере.
3. Paginator тоже можно реализовывать в виде класса - хэлпера. И делать DI моделей. Например: две "части" Paginstor`a: 1. вычислить общее кол-во записей в бд - в модели сделать метод GetCount(), 2. выбрать массив - GetArray(); Ну, это грубый пример, но идея именно в DI. К тому же надо думать на уровне абстракций, то есть не классов, а интерфейсов. Грубо говоря, все модели должны иметь методы GetCount и GetArray, чтобы в Paginator передавать объекты типа этого интерфейса. Как-то так.
paul85
30.09.2014 - 07:47
Цитата (Invis1ble @ 29.09.2014 - 06:01) |
Эти предупреждения можно отключить в настройках, если ты знаешь, что делаешь и тебя эти нотайсы реально напрягают. |
Да нет, вобщем не напрягают. Больше напрягает, что NetBeans никак не возьмет в толк, что я пишу стилем Олмана. И постоянно пытается поставить скобки в стиле K&R. Вот это действительно напрягает. А тут ни с того ни с сего при переносе строки с открытой одинарной кавычкой стал лепить конкатенацию. Тоже бесит жутко. Короче IDE-шка такая, мне кажется, чуть-чуть на своей волне... Причем то нормально работает, то как ей хочется... Как-то раз пытался в настройках ковыряться, но особых успехов не добился.
Цитата (Michael @ 29.09.2014 - 08:12) |
А как твой контроллер может знать что там валидировать в модели? |
Аааа... Ну у меня архитектура чуть-чуть другая. У меня совсем всё простенько пока что... Я понимаю о чем речь, видел такое в RoR. Только там серьезный валидатор с параметрами, мне такой реализовать будет тяжело.
Цитата (wd3 @ 29.09.2014 - 16:58) |
Но вот всплывающие сообщения реализовывать в моделе.. |
Ну там несовсем модель в классическом понимании. Это скорее спец-класс (объект). Но он у меня лежит вместе с моделями, потому, что я просто до конца не понял куда его девать. Просто сущности очень похожи, вот я и запутался. Вроде как и то и другое - user, а плодить похожие сущности, если не ошибаюсь, негоже...
Я пока что понял, что все "штуки", которые не имеют прямого отношения к MVC нужно раскладывать куда-то отдельно. Часть в функционал ядра, часть в хэлперы и т.д.
Цитата (bestxp @ 29.09.2014 - 10:41) |
Валидация данных приходящих в модель лежит на контролере или на форме |
Ну фактически часть у меня так и реализована. Поскольку фреймворк самопальный, то там много чего не хватает.
Вот с одной стороны, своим продуктом пользоваться гораздо проще. А с другой стороны я уже давно склоняюсь к какому-то фреймворку. Ну потому, что вот такие мелочи архитектурные они немного запарили. Тем более что от проекта к проекту в связи с эволюцией, получается сильное изменение моего детища. И в итоге на каждый проект своя версия фреймворка (если его так можно назвать). У меня уже 3 сильно разные версии. Скоро в них путаться начну... =(
Но вот беда: настолько привык к Smarty и goDB, настолько чужда мне идеология AR, что ну никак не могу подобрать себе готовый фреймворк по душе. Это похоже как в мультике Малыш к собаке вентилятор привязывал, чтобы получился Карлсон...
Цитата (paul85 @ 30.09.2014 - 07:47) |
Ну там несовсем модель в классическом понимании. Это скорее спец-класс (объект). Но он у меня лежит вместе с моделями, потому, что я просто до конца не понял куда его девать. Просто сущности очень похожи, вот я и запутался. Вроде как и то и другое - user, а плодить похожие сущности, если не ошибаюсь, негоже...
Я пока что понял, что все "штуки", которые не имеют прямого отношения к MVC нужно раскладывать куда-то отдельно. Часть в функционал ядра, часть в хэлперы и т.д. |
Посмотри как реализован любой из фреймворков. например, самые простенькие, как kohana или yii. Просто модель - это модель. Хэлпер - это хэлпер. Может, и схожие сущности, но лучше их разнести по разным каталогам. С остальными тоже также. Часть из них, которые будут использоваться часто, можно реализовать в ядре.
Цитата (paul85 @ 30.09.2014 - 07:47) |
Да нет, вобщем не напрягают. Больше напрягает, что NetBeans никак не возьмет в толк, что я пишу стилем Олмана. И постоянно пытается поставить скобки в стиле K&R. Вот это действительно напрягает. А тут ни с того ни с сего при переносе строки с открытой одинарной кавычкой стал лепить конкатенацию. Тоже бесит жутко. Короче IDE-шка такая, мне кажется, чуть-чуть на своей волне... Причем то нормально работает, то как ей хочется... Как-то раз пытался в настройках ковыряться, но особых успехов не добился. |
Я тоже пишу в этой IDE. Отключить перенос строк в кавычках можно так: Сервис - Параметры - Редактор - PHP - снять галочку использовать автоматическую конкатенацию строк после вставки разрыва.
inpost
30.09.2014 - 12:12
paul85Бери ЗЕНД и страдай пару лет. Зато потом полюбишь.
_____________
Обучаю веб-программированию качественно и не дорого:
http://school-php.comФрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
paul85
30.09.2014 - 20:16
Цитата (wd3 @ 30.09.2014 - 10:26) |
Я тоже пишу в этой IDE. Отключить перенос строк в кавычках можно так: |
Спасибо за подсказку, но у меня оказалось немного по-другому. Но в итоге нашел!
Цитата (inpost @ 30.09.2014 - 12:12) |
Бери ЗЕНД и страдай пару лет. Зато потом полюбишь. |
Да хоть бы понять, какой из фреймворков наиболее востребован. А там можно и пострадать какое-то время, это не проблема... Вот открываю вакансии на hh, а там кому что нужно: Yii, Kohana, Zend, Symfony... Становится ясно, что особого конкурентного преимущества изучив какой-то один я не получу. В силу разнообразия рынка и малой востребованностью конкретно взятого. Изучать все тоже мне кажется неуместно. Пока изучишь последний - первый уже настолько изменится, что можно будет начинать изучать заново.
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.