|
2 / 2 / 0
Регистрация: 01.09.2012
Сообщений: 87
|
|||||||||||||||||||||
MVC: CRUD подобное API для моделей – best practices?01.07.2013, 16:38. Показов 3300. Ответов 18
Метки нет (Все метки)
Доброго времени суток!
[offtop]Долго думал куда постить – в "PHP и ООП" или "Для начинающих" ибо вопрос может быть очень простым и глупым. Прошу простить и помочь (:[/offtop] Пишу простой интернет-магазин на своих велосипедах (для себя, в целях обучения и тренировки технологий/паттернов). В нём есть модели User, Product, Comment и так далее. Модели спроектированы по принципу Active Directory, без дополнительного слоя абстракций (пока что). Хочу привести интерфейс работы с ними к единому знаменателю (CRUD) чтобы стандартный интерфейс получался примерно таким:
Теперь же я хочу разделить действия группы пользователей не только по контроллерам/моделям, но и по действиям с ними (например, админ может всё, а модератор – только редактировать, но не удалять). Вопрос номер один: как быть с атрибутом action в формах? Какие пути лучше всего использовать? Пробовал сделать пути вида "user/add", "user/edit" и так далее. Однако, получается, что мне нужно создавать дополнительный контроллер User, который будет тупо переадресовывать реквесты в модель User. Это плодит лишние сущности. Затем решил в роутере сделать проверку на наличие отправленного запроса (`if (count($_POST)>0) { ... }`) и если true, то направлять сразу в модель. Однако, в таком случае, внутри модели уже появляются дополинтельные проверки, условия, не связанные напрямую с генерацией sql-запроса. Когда решал эту проблему, то словил себя на мысли, что заново изобретаю ещё один слой абстракции. Значит ли это, что пора переходить от Active Directory к Data Mapping? Отсюда второй вопрос: например, если мне нужно изменить роль пользователю, то я вызываю метод
И, наконец, более общий третий вопрос: быть может, я что-то делаю совсем криво? Хотелось бы узнать мнение опытных людей в этом вопросе. Спасибо!
0
|
|||||||||||||||||||||
| 01.07.2013, 16:38 | |
|
Ответы с готовыми решениями:
18
Размещение авторизации в MVC с использованием ООП – best practices? где?
Реализация CRUD MVC |
|
270 / 226 / 11
Регистрация: 20.04.2012
Сообщений: 817
|
|||||
| 01.07.2013, 22:22 | |||||
0
|
|||||
|
2 / 2 / 0
Регистрация: 01.09.2012
Сообщений: 87
|
||||||||||
| 01.07.2013, 22:39 [ТС] | ||||||||||
0
|
||||||||||
|
270 / 226 / 11
Регистрация: 20.04.2012
Сообщений: 817
|
|||||||||
| 03.07.2013, 05:31 | |||||||||
|
Конструктор должен принимать массив с информацией о пользователе и тупо создавать лишь новый объект. Если су Вас АР, то надо СRUD вынести в парент класс. В АР методы СRUD одинаковы для ВСЕХ сущьностей.
1
|
|||||||||
|
2 / 2 / 0
Регистрация: 01.09.2012
Сообщений: 87
|
|||||
| 03.07.2013, 05:58 [ТС] | |||||
|
Тогда ещё вопрос: как-нибудь разделяют обычные переходы по страницам от переходов с отправкой запросов? И разделяют ли запросы post/get/ajax между собой чтобы выполнять различные действия? И, если различают, то где (в роутере?), каким образом (дробят контроллер на отдельные классы, дробят один метод на методы внутри одного контроллера или как-нибудь ещё)? Поясню причину. У меня авторизация/регистрация по связке "мыло-пароль". Чтобы не плодить лишних запросов только ради того, чтобы узнать id по email (и наоборот) я и решил сделать главным полем именно мыло.
0
|
|||||
|
270 / 226 / 11
Регистрация: 20.04.2012
Сообщений: 817
|
||||||||
| 03.07.2013, 10:44 | ||||||||
|
на основе выборки данных из СУБД. Вот принцип:
Добавлено через 2 минуты что бы было более ясно о чем я, почитайте про DataMapper
0
|
||||||||
|
2 / 2 / 0
Регистрация: 01.09.2012
Сообщений: 87
|
|||||||||||||||||||||||
| 03.07.2013, 12:18 [ТС] | |||||||||||||||||||||||
|
И как тогда решить возможную неполноту получаемых данных? У меня в БД, например, на поле `role` стоят флаги "NOT NULL" и дефолт "guest" поэтому при неполном запросе выпадет исключение. Значит, чтобы пользователь, созданный из других данных (в обход БД) имел необходимый минимальный обязательный набор полей, нужно закодить проверку внутрь конструктора. А это уже клонирование поведения – при любом изменении архитектуры пользователя в БД, нужно не забыть ещё поправить проверки в конструкторе.
Добавлено через 7 минут
0
|
|||||||||||||||||||||||
|
270 / 226 / 11
Регистрация: 20.04.2012
Сообщений: 817
|
|||||||||||
| 03.07.2013, 12:47 | |||||||||||
обратите внимание на массив $model_attributes и валидаторы, которые применяются к свойству при его впрыскивании в объект. его не должно быть вообще) ИМХО в AR он не вписывается AR - одна запись - один объект foreach по списку пользователей и к каждому применяйте метод delete(), который по id и удаляет запись
0
|
|||||||||||
|
2 / 2 / 0
Регистрация: 01.09.2012
Сообщений: 87
|
||||||
| 03.07.2013, 18:15 [ТС] | ||||||
|
Вы же рассматриваете конструктор модели пользователя как C из CRUD – поэтому тоже добавлен специальный нехватающий метод, только уже для чтения (`$user = User::findByEmail($email);`). Спасибо, реализую Вашим способом, нужно посмотреть в чём практическая разница в подходах! Но идею сделать главной модель в коде (а не в архитектуре) из приведённого кода я понял, так и сделаю. Ещё вопрос по приведённому коду: я правильно понимаю, что RBAC у Вас захардкожен и для расширения нужно изменять много кода (и модель в том числе)? И как тогда происходит проверка на разрешение выполнения запрошенного действия с указанным объектом?
0
|
||||||
|
270 / 226 / 11
Регистрация: 20.04.2012
Сообщений: 817
|
|||||
| 04.07.2013, 11:27 | |||||
|
http://zendframework.ru/anonses/model-with-mvc вот как должен выглядеть контроллер: а не так:
1
|
|||||
|
2 / 2 / 0
Регистрация: 01.09.2012
Сообщений: 87
|
||||||||||||||||||||
| 04.07.2013, 18:40 [ТС] | ||||||||||||||||||||
|
Самый непонятный момент в контроллере – как он должен выглядеть? Например, контроллер редактирования личных данных примерно такой? Я правильно понимаю?
Добавлено через 43 минуты Чтобы не быть голословным приведу пример (как у меня сейчас). Так выглядит часть роутера:
Если есть пользователи, которые могут добавлять комментарии, но не могут их удалять, то доступ к "comment/update" выполняется уже на этапе роутинга и отсеивается. При этом, пользователи с той же самой ролью доступ к "comment/create" имеют и могут постить ответы. А изменение этого (и любого другого) доступа к любому ресурсу – простое редактирование записи в СУБД. То есть, страница админки для этой задачи реализуется феерически просто.
0
|
||||||||||||||||||||
|
508 / 358 / 13
Регистрация: 12.03.2012
Сообщений: 1,896
|
|
| 04.07.2013, 22:25 | |
|
0
|
|
|
2 / 2 / 0
Регистрация: 01.09.2012
Сообщений: 87
|
|
| 04.07.2013, 22:39 [ТС] | |
|
OnYourLips, наверное, в контроллере? Проверка входящих данных и обработка некорректных – в контроллерах. Затем эти (уже готовые и корректные на уровне логики) данные отправляются в модель ("$order->add($data)"), которая отправляет запрос в базу.
0
|
|
|
508 / 358 / 13
Регистрация: 12.03.2012
Сообщений: 1,896
|
||
| 04.07.2013, 22:58 | ||
|
0
|
||
|
2 / 2 / 0
Регистрация: 01.09.2012
Сообщений: 87
|
||||||
| 05.07.2013, 00:40 [ТС] | ||||||
|
OnYourLips, а какие действия "разрешены" контроллеру чтобы им оставаться?
Например, в форме оформления заказа есть поле ввода email. Контроллер проверяет данные на корректность, если введён email, то пишет в массив его, если пользователь залогинен, но ничего не введено – пишет его email в массив, если ни то и ни другое – переадресация на страницу с ошибкой. И только затем уже отправляет эти данные в модель Order для записи в БД. Это всё ещё контроллер? Кстати, пока писал комментарий, возник вопрос – как правильно делать переадресацию из контроллера? Например, в зависимости от результата проверки данных на разные страницы (возможно даже с get-запросом). Я сейчас пишу что-то вроде
0
|
||||||
|
508 / 358 / 13
Регистрация: 12.03.2012
Сообщений: 1,896
|
|||
| 05.07.2013, 00:46 | |||
|
path($routeName, array $params, $absolute = false)
0
|
|||
|
2 / 2 / 0
Регистрация: 01.09.2012
Сообщений: 87
|
||||||||||||||||||
| 05.07.2013, 01:55 [ТС] | ||||||||||||||||||
– Статический метод в нестатическом классе – Вызов через несколько ступеней иерархии – "use Core\Router" во всех классах приложения Можно ли избавиться от данных минусов или такое решение – ок? Добавлено через 21 минуту Я догадываюсь, что нужно как-то раскрутить стек вызовов обратно до роутера или точки входа, но как именно это реализовать – ума не приложу.
0
|
||||||||||||||||||
|
508 / 358 / 13
Регистрация: 12.03.2012
Сообщений: 1,896
|
|||
| 05.07.2013, 08:28 | |||
|
Больше читай чужого кода. Это дает гораздо больше знаний, чем написание своего.
1
|
|||
|
2 / 2 / 0
Регистрация: 01.09.2012
Сообщений: 87
|
|
| 06.07.2013, 22:21 [ТС] | |
|
Посоветуйте, пожалуйста, фреймворк, для разбора кода которого нужен не настолько высокий уровень знаний? Я, видимо, под него пока ещё не подхожу.
Потратил два дня на то, чтобы покопаться в исходниках Симфони2 на Гитхабе, включая статьи, глоссарий и прочие описания на их офсайте. Большинство просто не смог понять. Например, хотел посмотреть код точки входа, определил, что она называется "FrontController" (да и то случайно, пока читал глоссарий) и всё – поиск в github по этому сочетанию возвращает нулевой результат. Файлов типа "index.php" и директорий типа "wwwroot" и подобных не нашёл. Слишком часто возникают три вопроса:"Что это?", "Куда оно это возвращает?" и "Зачем оно вообще нужно?". Не покидает ощущение дикого оверкилла, который имеет смысл разве что для корпоративных crm или чего-то ещё более сложного. Большинство материала (в том числе и книга) посвящено тому, как использовать фреймворк, а я хочу понять как он работает внутри.
0
|
|
| 06.07.2013, 22:21 | |
|
Помогаю со студенческими работами здесь
19
Best practices и worst practices в написании sql запросов MVC, несколько моделей на одной view Ссылки в CRUD-таблице на другие CRUD-таблицы
asp.net mvc 2 проект, работает без контроллеров и моделей. Такое возможно? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2).
Унарный минус обозначается как !
*/
#include <iostream>
#include <stack>
#include <cctype>. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|