[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Структурный вопрос
Страницы: 1, 2
paul85
Добрый день, уважаемые гуру!

За время работы возникло несколько вопросов, которые самостоятельно решить не получается. Все они касаются архитектуры.

1. Правильно ли я понимаю, что для работы с суперглобальными переменными лучше использовать отдельный класс, через который забирать данные. Там же производить trim, и в нем же валидацию? Если да, то к какой части MVC он должен принадлежать?

2. Есть модель user, в которой хранятся данные пользователя: его привилегии, имя, uid и т.д. Каждый раз при обращении к ресурсу эта модель (экземпляр) заполняется и контроллеры берут данные уже из нее. Там же реализованы всплывающие сообщения и прочее. Такая особая модель с синглтоном. Вопрос в том, куда девать методы типа getUserCart и getUserProfile, те самые, из личного кабинета? Создавать обыкновенную модель client или пихать в user? С одной стороны у них сущности очень похожи - и там и тут речь идет о пользователе. Но с другой - совершенно разные цели и ситуации для работы с ними. В моем случае user больше создавалась для межстраничного взаимодействия. Работа с сессией и т.д.

3. Куда девать различные "штуки" такие как пагинатор? И откуда этот пагинатор вызывать? Это ведь обработка данных, значит ему место где-то около моделей, так?

4. Не хватает некоторого интерфейса взаимодействия между моделями. Гнать через контроллер не всегда удобно и не всегда логично. Вот как раз ситуация с пагинатором тем же... Как эти моменты решаются у дядек во фреймворках?
inpost
1) Разработчики ПХП сделали его открытым. Разработчики какой-то CMS или Фреймворка, который ежедневно выпускает новые версии и меняет постоянно архитектуру (laravel 4, Yii 2, Kohana 3, Drupal 8) решили, что надо его засунуть в определённую видимость, чтобы закрыть прямой доступ. Вопрос, кто из них мудрее? Заметь, что за около 10 лет никто не решил над сессией повесить оболочку особую, хотя ввели и ООП и неймспейсы, но суперглобальный остался суперглобальным.
П.С. Тут возразят фанаты объектного представления данных.

2) Смотря что выполнять будет твой getUserProfile. Если это прослойка для доступа к данным, то почему бы не реализовать как отдельный класс User, в нём этот метод для доступа к юзеру. А если это как страничка профиля, то в модели этой страницы.

3) Ты же учишь laravel, там пагинатор как отдельный класс библиотеки идёт (тоже самое и в пункте 2 говорил). Это не модель (класс) определённой страницы, это подключаемые библиотеки функционала. Вызывать пагинатор стоит из модели (в идеальном MVC) или из вида, вызывать модель можно как из контроллера, так и из вида. Я сторонник прямого вызова из вида.

4) Пагинатор идёт отдельно и относится к общим библиотекам, отсюда вызвать можно откуда угодно.

ИМХО smile.gif Будут уточняющие вопросы - можешь в скайп написать.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Invis1ble
Привет.

Цитата
1. Правильно ли я понимаю, что для работы с суперглобальными переменными лучше использовать отдельный класс, через который забирать данные. Там же производить trim, и в нем же валидацию? Если да, то к какой части MVC он должен принадлежать?

Да.
Нет.
Ни к какой, это ядро системы. Можно конечно к контроллеру отнести с огромной натяжкой.

Цитата
2. Есть модель user, в которой хранятся данные пользователя: его привилегии, имя, uid и т.д. Каждый раз при обращении к ресурсу эта модель (экземпляр) заполняется и контроллеры берут данные уже из нее. Там же реализованы всплывающие сообщения и прочее. Такая особая модель с синглтоном. Вопрос в том, куда девать методы типа getUserCart и getUserProfile, те самые, из личного кабинета? Создавать обыкновенную модель client или пихать в user? С одной стороны у них сущности очень похожи - и там и тут речь идет о пользователе. Но с другой - совершенно разные цели и ситуации для работы с ними. В моем случае user больше создавалась для межстраничного взаимодействия. Работа с сессией и т.д.


В отдельную сущность вынести лучше, думаю. И, например, при создании объекта передавать объект User, если эта сущность зависит от User. Ну или в каждый метод, что-то типа Client::getUserProfile(User $user). Хотя мне не совсем понятно назначение этих методов.
Вообще, тут есть множество мнений и еще надо смотреть конкретный случай.

Цитата
3. Куда девать различные "штуки" такие как пагинатор? И откуда этот пагинатор вызывать? Это ведь обработка данных, значит ему место где-то около моделей, так?


Пагинатор обычно идет отдельным сервисом, и к MVC не должен иметь отношения.

Цитата
4. Не хватает некоторого интерфейса взаимодействия между моделями. Гнать через контроллер не всегда удобно и не всегда логично. Вот как раз ситуация с пагинатором тем же... Как эти моменты решаются у дядек во фреймворках?


Это обычно решается самим программистом. Можно и через контроллер.

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

Michael
Валидация модели должна быть привязана к модели.
Валидация данных запроса в контроллере и его обвязке.

Пагинатор - элемент вида.

Цитата
getUserCart и getUserProfile, те самые, из личного кабинета? Создавать обыкновенную модель client или пихать в user?

думаю в user будет логично.
Расширить объект динамически можно через магию, типа того как поведения в yii работают. Есть базовый объект user. Если это сборка для магазина, то подключаешь модуль магазина и тюнишь объекты ядра нужными поведениями.

_____________
There never was a struggle in the soul of a good man that was not hard
paul85
Спасибо за помощь, я теперь решил для себя кой-какие вопросы.

Цитата (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
paul85
Цитата
То есть его в принципе тоже можно запихнуть куда-нибудь в библии и вызывать через ядро? Хотя штука настолько часто используемая, что ее наверное можно запилить в само ядро.

Ну ты же Lareval учишь? Там перечень классов есть доступных ядра. В Yii так же.

Цитата
Ведь в конечном счете все-равно напрямую получится.

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

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

http://framework.zend.com/manual/2.3/en/ge...udio/tasks.html
Глянь пример с TaskController.php

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Invis1ble
Цитата
Я сейчас работаю в NetBeans и там при обращении к тому же $_POST уже нотис вылетает, мол, не обращайтесь к массиву напрямую. А как же к нему обращаться!? Ведь в конечном счете все-равно напрямую получится. Если не я, так библиотека или класс будет обращаться. Непонятно, вобщем.

Эти предупреждения можно отключить в настройках, если ты знаешь, что делаешь и тебя эти нотайсы реально напрягают. Лично я отключил предупреждения о превышении рекомендумого кол-ва строк в методах и классах и еще некоторые smile.gif

Цитата
Там ведь должны отображаться какие-то его настройки, история заказов и т.д. Эти данные каким-то образом надо получать из БД. Я вот об этих методах модели типа getUserOrders($uid).

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

Цитата
То есть его в принципе тоже можно запихнуть куда-нибудь в библии и вызывать через ядро? Хотя штука настолько часто используемая, что ее наверное можно запилить в само ядро.

Да не, в ядре таким вещам точно не место. Если это уже отдельная библиотека, то и пользуйся ей в контроллере/виде (в зависимости от уровня абстракции, которую предоставляет API пагинатора).

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

Michael
Цитата (paul85)
Вот тут я не понял. Если мы произвели валидацию в контроллепе, то что же тогда валидировать в модели? Мы уже контроллером проверили данные, можем смело отдавать в модель без валидации. Разве нет?

А как твой контроллер может знать что там валидировать в модели?
Он вызовет $model->validate() и все.
Валидация в контроллере - для остальных вещей. Например showPost($id), проверка что модель с записью $id существует.

_____________
There never was a struggle in the soul of a good man that was not hard
bestxp
Валидация данных приходящих в модель лежит на контролере или на форме
если нужно проверить еще раз конкретные данные нужно сделать в идеале спецификацию
wd3
1. Лучше реализовать хэлпер класс, в котором производить всякие манипуляции и обрабатывать $_GET, $_POST. Во многих фреймворках есть оболочки. Для чего это нужно? Для того, чтобы каждый раз не заморачиваться по поыоду минимальных проверок.

2. Модель User может содержать поле - ссылку на объект UserCart и прочие. Но вот всплывающие сообщения реализовывать в моделе.. это как-то не очень правильно. Если это, конечно, реализовано в моделе, а не в контроллере.

3. Paginator тоже можно реализовывать в виде класса - хэлпера. И делать DI моделей. Например: две "части" Paginstor`a: 1. вычислить общее кол-во записей в бд - в модели сделать метод GetCount(), 2. выбрать массив - GetArray(); Ну, это грубый пример, но идея именно в DI. К тому же надо думать на уровне абстракций, то есть не классов, а интерфейсов. Грубо говоря, все модели должны иметь методы GetCount и GetArray, чтобы в Paginator передавать объекты типа этого интерфейса. Как-то так.
paul85
Цитата (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, что ну никак не могу подобрать себе готовый фреймворк по душе. Это похоже как в мультике Малыш к собаке вентилятор привязывал, чтобы получился Карлсон... biggrin.gif
wd3
Цитата (paul85 @ 30.09.2014 - 07:47)
Ну там несовсем модель в классическом понимании. Это скорее спец-класс (объект). Но он у меня лежит вместе с моделями, потому, что я просто до конца не понял куда его девать. Просто сущности очень похожи, вот я и запутался. Вроде как и то и другое - user, а плодить похожие сущности, если не ошибаюсь, негоже...

Я пока что понял, что все "штуки", которые не имеют прямого отношения к MVC нужно раскладывать куда-то отдельно. Часть в функционал ядра, часть в хэлперы и т.д.

Посмотри как реализован любой из фреймворков. например, самые простенькие, как kohana или yii. Просто модель - это модель. Хэлпер - это хэлпер. Может, и схожие сущности, но лучше их разнести по разным каталогам. С остальными тоже также. Часть из них, которые будут использоваться часто, можно реализовать в ядре.
wd3
Цитата (paul85 @ 30.09.2014 - 07:47)
Да нет, вобщем не напрягают. Больше напрягает, что NetBeans никак не возьмет в толк, что я пишу стилем Олмана. И постоянно пытается поставить скобки в стиле K&R. Вот это действительно напрягает. А тут ни с того ни с сего при переносе строки с открытой одинарной кавычкой стал лепить конкатенацию. Тоже бесит жутко. Короче IDE-шка такая, мне кажется, чуть-чуть на своей волне... Причем то нормально работает, то как ей хочется... Как-то раз пытался в настройках ковыряться, но особых успехов не добился.

Я тоже пишу в этой IDE. Отключить перенос строк в кавычках можно так: Сервис - Параметры - Редактор - PHP - снять галочку использовать автоматическую конкатенацию строк после вставки разрыва.
inpost
paul85
Бери ЗЕНД и страдай пару лет. Зато потом полюбишь.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
paul85
Цитата (wd3 @ 30.09.2014 - 10:26)
Я тоже пишу в этой IDE. Отключить перенос строк в кавычках можно так:

Спасибо за подсказку, но у меня оказалось немного по-другому. Но в итоге нашел!

Цитата (inpost @ 30.09.2014 - 12:12)
Бери ЗЕНД и страдай пару лет. Зато потом полюбишь.

Да хоть бы понять, какой из фреймворков наиболее востребован. А там можно и пострадать какое-то время, это не проблема... Вот открываю вакансии на hh, а там кому что нужно: Yii, Kohana, Zend, Symfony... Становится ясно, что особого конкурентного преимущества изучив какой-то один я не получу. В силу разнообразия рынка и малой востребованностью конкретно взятого. Изучать все тоже мне кажется неуместно. Пока изучишь последний - первый уже настолько изменится, что можно будет начинать изучать заново.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.