Простой/многоразовый CRUD в PHP (БЕЗ славы и больших классов)
-
23-08-2019 - |
Вопрос
Я работаю над проектом, похожим на PHP CMS, и пытаюсь выяснить, какой наиболее удобный способ работы с функциональностью CRUD в PHP.
CMS полностью запрограммирована на процедурном PHP (без ООП - я знаю, что многие из вас с этим не согласятся...) и была разработана с учетом максимально простого и легкого подхода, а также создания функций и фрагментов кода с возможностью многократного использования. .
CMS позволяет устанавливать/активировать несколько модулей по мере необходимости.Эти модули описывают различные типы контента, поэтому, вероятно, в конечном итоге у меня будет что-то вроде страниц, новостей, блогов и это лишь некоторые из них.
Для каждого из этих типов контента мне придется создать операции CRUD, и теперь я пытаюсь найти наиболее удобный способ добиться этого.
Одним из требований будет то, чтобы форма для каждого из этих типов контента содержалась в одном внешнем файле (как для вставки, так и для редактирования), и если есть какой-то способ интегрировать проверку ввода на стороне сервера, это было бы плюсом.
Решение
Под операциями CRUD вы подразумеваете только (утомительные) запросы к базе данных?
Вы можете так же легко настроить свою базу данных так, чтобы, за исключением нескольких общих полей среди типов контента, все данные для определенного типа контента хранились в виде сериализованного ассоциативного массива в поле TEXT.
Таким образом, вам понадобится только один набор запросов к CRUD любого конкретного типа контента, поскольку данные, передаваемые в функции CRUD, просто сериализуются вслепую.
Например, предположим, что мы заявляем, что заголовок контента, дата создания/обновления, теги и краткое описание считаются общими данными.Отсюда у нас есть блог и тип контента страницы.
Я бы, возможно, создал таблицу базы данных как таковую:
CREATE TABLE `content` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR NOT NULL,
`short_description` TEXT NOT NULL,
`tags` TEXT ,
`data` TEXT ,
`content_type` INT NOT NULL,
`created_at` DATETIME NOT NULL,
`updated_at` DATETIME NOT NULL,
PRIMARY KEY (`id`)
)
(Предположим, что мы создадим справочные таблицы для content_type)
И хотя для блога могут потребоваться такие данные, как «пингбэки», а для страницы может потребоваться только тело, вы просто сохраняете выходные данные, подобные приведенному ниже примеру для блога:
$data = serialize(array(
"body" => "Lorem ipsum",
"pingbacks" => array()
));
Обновления просты: всякий раз, когда вы извлекаете данные из базы данных, вы десериализуете их для редактирования в форму, выбранную в зависимости от типа контента.Отображение работает таким же образом: просто возьмите шаблон на основе типа контента и отправьте ему несериализованный массив данных.Шаблону никогда не нужно беспокоиться о том, как хранятся данные, он просто получает $data['pingbacks'].
Что касается ваших форм, я предлагаю нарушить ваш завет против ООП и найти библиотеку генерации форм.Если вы можете извлечь его из фреймворка, используя Zend_Form с Zend_Config и Zend_Validate из Zend-фреймворк (все, что Zend_Config в этой ситуации представляет собой удобный интерфейс для загрузки и просмотра файлов XML и INI) делает жизнь действительно приятной.Вы можете сделать так, чтобы ваши XML-файлы определяли форму для каждого типа контента, и все, что вам нужно сделать, это просто отобразить форму на своей странице (захватив XML на основе типа контента), получить отфильтрованные данные, удалить «общие поля», такие как имя, даты создания/обновления, а затем сериализацию оставшегося в базу данных.Никакого знания схемы для конкретного типа контента не требуется (если вы не хотите быть строгим).
Хотя лично я бы настоятельно рекомендовал вам изучить Zend_Form (с Zend_Validate и Zend_Config), а также использовать Доктрина как уровень абстракции ORM/базы данных.Вы можете обнаружить, что, по крайней мере, Doctrine значительно облегчит вам жизнь, когда дело доходит до выполнения операций с базой данных.
Другие советы
Хотя лично я бы настоятельно рекомендовал вам изучить Zend_Form (с Zend_Validate и Zend_Config), а также использовать Doctrine в качестве уровня абстракции ORM/базы данных.Вы можете обнаружить, что, по крайней мере, Doctrine значительно облегчит вам жизнь, когда дело доходит до выполнения операций с базой данных.
Я согласен с Кузино.Зачем сворачивать свое, если оно уже сделано?я бы тоже посмотрел Зенд БД, и если вам нужно решение PHP4 и 5 PHP ADOdb.
Недавно я начал академический проект и имел то же желание, что и вы;в конце концов я выбрал PHP ADoDB.
Я предлагаю www.ajaxcrud.com — он прост в использовании, легок и позволяет вам приступить к работе за считанные секунды.
Вы можете попробовать это: http://xcrud.com, действительно полезно