PHP中的简单/可重用CRUD(无famework或大型类)

PHP中的简单/可重用CRUD(无famework或大型类),php,crud,code-reuse,Php,Crud,Code Reuse,我正在从事一个类似于PHPCMS的项目,我试图找出在PHP中处理CRUD功能最方便的方法 CMS完全是用过程化PHP编程的(没有OOP——我知道你们中的许多人都不会同意这一点……),它的设计使一切尽可能简单明了,并创建高度可重用的函数和代码片段 CMS允许根据需要安装/激活多个模块。这些模块描述了不同类型的内容,所以我可能最终会有一些页面、新闻、博客等等 对于每种内容类型,我都必须创建CRUD操作,现在我正试图找到最方便的方法来实现这一点 一个要求是,这些内容类型的表单都包含在单个外部文件中(用

我正在从事一个类似于PHPCMS的项目,我试图找出在PHP中处理CRUD功能最方便的方法

CMS完全是用过程化PHP编程的(没有OOP——我知道你们中的许多人都不会同意这一点……),它的设计使一切尽可能简单明了,并创建高度可重用的函数和代码片段

CMS允许根据需要安装/激活多个模块。这些模块描述了不同类型的内容,所以我可能最终会有一些页面、新闻、博客等等

对于每种内容类型,我都必须创建CRUD操作,现在我正试图找到最方便的方法来实现这一点


一个要求是,这些内容类型的表单都包含在单个外部文件中(用于插入和编辑),如果有某种方式集成服务器端输入验证,这将是一个加号。

CRUD操作指的是(繁琐的)数据库查询吗

您可以同样轻松地设置数据库,以便除内容类型中的几个公共字段外,特定内容类型的所有数据都存储为文本字段中的序列化关联数组

这样,您只需要1组查询就可以对任何特定的内容类型进行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\u类型创建引用表)

虽然博客可能需要“pingbacks”之类的数据,而页面可能只需要正文,但您只需要为博客存储以下示例的输出:

$data = serialize(array(
    "body" => "Lorem ipsum",
    "pingbacks" => array()
));
更新很容易,只要从数据库中获取数据,就可以取消序列化数据,以便编辑到基于内容类型选择的表单中。显示的工作原理相同,只需根据内容类型获取模板并将其发送到未序列化的数据数组。模板永远不需要担心数据是如何存储的,只需要得到$data['pingbacks']

至于你的表单,我的建议是打破你的反OOP约定,找到一个表单生成库。如果您可以从框架中提取它,那么使用with和from(在这种情况下,所有Zend_配置都是一个加载和遍历XML和INI文件的方便接口)会让生活变得非常美好。您可以让XML文件为每种内容类型定义表单,您所要做的只是在页面上呈现表单(根据内容类型获取XML),获取过滤后的数据,删除诸如名称、创建/更新日期等“公共字段”,然后将剩余内容序列化到数据库中。不需要了解特定内容类型的模式(除非您希望严格要求)


尽管从个人角度来说,我强烈建议您考虑使用Zend_表单(使用Zend_验证和Zend_配置)以及作为ORM/数据库抽象层。您可能会发现,至少在数据库上运行操作时,条令会使您的生活变得更加轻松。

CRUD操作指的是(繁琐的)数据库查询吗

您可以同样轻松地设置数据库,以便除内容类型中的几个公共字段外,特定内容类型的所有数据都存储为文本字段中的序列化关联数组

这样,您只需要1组查询就可以对任何特定的内容类型进行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\u类型创建引用表)

虽然博客可能需要“pingbacks”之类的数据,而页面可能只需要正文,但您只需要为博客存储以下示例的输出:

$data = serialize(array(
    "body" => "Lorem ipsum",
    "pingbacks" => array()
));
更新很容易,只要从数据库中获取数据,就可以取消序列化数据,以便编辑到基于内容类型选择的表单中。显示的工作原理相同,只需根据内容类型获取模板并将其发送到未序列化的数据数组。模板永远不需要担心数据是如何存储的,只需要得到$data['pingbacks']

至于你的表单,我的建议是打破你的反OOP约定,找到一个表单生成库。如果您可以从框架中提取它,那么使用with和from(在这种情况下,所有Zend_配置都是一个加载和遍历XML和INI文件的方便接口)会让生活变得非常美好。您可以让XML文件为每种内容类型定义表单,您所要做的只是在页面上呈现表单(根据内容类型获取XML),获取过滤后的数据,删除诸如名称、创建/更新日期等“公共字段”,然后将剩余内容序列化到数据库中。不需要了解特定内容类型的模式(除非您希望严格要求)

尽管从个人角度来说,我强烈建议您考虑使用Zend_表单(使用Zend_验证和Zend_配置)以及作为ORM/数据库抽象层。您可能会发现,至少在数据库上运行操作时,条令会让您的生活变得更加轻松

尽管从个人角度来说,我强烈建议您考虑使用Zend_表单(使用Zend_验证和Zend_配置)以及使用条令作为ORM/数据库抽象层。你可能会发现