libriciel / cakephp-database
CakePHP 2.x 插件,用于简化数据格式化和验证
Requires
- php: >=5.3.0
README
简介
此插件为 CakePHP 添加了与任何数据库管理系统 (SGBD) 一起工作的功能,无论使用何种 SGBD。
兼容性
已测试与 CakePHP 2.2.4 和 2.9.0 以及 PHP 5.5.9 一起使用。
安装
在文件 app/Config/bootstrap.php 中
CakePlugin::load( 'Database', array( 'bootstrap' => true ) );
描述
控制台/命令
DatabaseCheckRelationsShell
此 Shell 遍历模型类并检查它们之间的关系是否在两个方向上正确定义。
命令行
sudo -u www-data lib/Cake/Console/cake Database.database_check_relations
DatabaseDictionaryShell
此 Shell 遍历模型类并创建一个 HTML 数据字典,包括所有关联的数据库表。
命令行
sudo -u www-data lib/Cake/Console/cake Database.database_dictionary
库
别名
alias
函数允许递归地在字符串或数组中替换单词,包括键和值。
// Retournera 'SELECT "Bar"."id" AS "Foo__id" FROM "public"."foos" AS "Bar" WHERE "Bar"."name" = \'FooBar\';'
alias( 'SELECT "Foo"."id" AS "Foo__id" FROM "public"."foos" AS "Foo" WHERE "Foo"."name" = \'FooBar\';', array( 'Foo' => 'Bar' ) );
行为
DatabaseAutovalidateBehavior
此 behavior 根据数据库中的表模式自动向关联的模型添加验证规则(参见 CakePHP Model::schema() 方法)。
此 behavior 添加了三个验证规则:ascii
、integer
和 compareWith
。
ascii
:确保字段值是只包含 ASCII 字符的字符串integer
:确保字段值是一个整数compareWith
:允许比较字段值与另一个字段的值
以下规则被推导出来
- notBlank:如果字段是 NOT NULL(对于 CakePHP 版本 >= 2.7.0,否则 notEmpty)
- maxLength:如果字段是 CHAR 或 VARCHAR 类型
- integer:如果字段是整数类型
- numeric:如果字段是数值类型
- date:如果字段是日期类型
- datetime:如果字段是日期和时间类型
- time:如果字段是时间类型
- isUnique:如果字段具有唯一索引
在模型类中使用的示例,默认配置
public $actsAs = array(
'Database.DatabaseAutovalidate' => array(
'rules' => array(
// notBlank pour CakePHP en version >= 2.7.0, sinon notEmpty
'notBlank' => true,
'maxLength' => true,
'integer' => true,
'numeric' => true,
'date' => true,
'datetime' => true,
'time' => true,
'isUnique' => true,
),
'domain' => 'validation',
'translate' => true
)
);
DatabaseEnumerableBehavior
此 behavior 向模型添加了 enums
和 enum
方法。
enum($fieldName)
方法允许,对于给定模型中具有 inList
验证规则的字段,获取翻译后的值列表(或未翻译)。
插件 Postgres 允许通过 Pl/PgSQL 函数 cakephp_validate_in_list
定义字段的有限值集合,并通过 PostgresAutovalidateBehavior
类在模型中自动获取这些验证规则。
在 Item
模型类中使用的示例,默认配置
public $actsAs = [
'Database.DatabaseEnumerableBehavior' => [
'domain' => null,
'translate' => ['__d', '%domain%']
]
];
// Règles de validation écrites à la main ou venant de l'utilisation de la classe `PostgresAutovalidateBehavior`
public $validate = [
'color' => [
[
'rule' => ['inList', ['red', 'green', 'blue']]
]
],
'size' => [
'inList' => [
'rule' => ['inList', ['xs', 'sm', 'md', 'lg', 'xl']]
]
]
];
在翻译文件 app/Locale/fra/LC_MESSAGES/item.po
中
#-------------------------------------------------------------------------------
# Valeurs du champ color
#-------------------------------------------------------------------------------
msgid "ENUM::COLOR::red"
msgstr "Rouge"
msgid "ENUM::COLOR::green"
msgstr "Vert"
msgid "ENUM::COLOR::blue"
msgstr "Blue"
#-------------------------------------------------------------------------------
# Valeurs du champ size
#-------------------------------------------------------------------------------
msgid "ENUM::SIZE::xs"
msgstr "Très petit"
msgid "ENUM::SIZE::sm"
msgstr "Petit"
msgid "ENUM::SIZE::md"
msgstr "Moyen"
msgid "ENUM::SIZE::lg"
msgstr "Grand"
msgid "ENUM::SIZE::xl"
msgstr "Très grand"
调用 $this->Item->enums()
将返回以下结果
[
'Item' => [
'color' => [
'red' => 'Rouge',
'green' => 'Vert',
'blue' => 'Bleu'
],
'size' => [
'xs' => 'Très petit',
'sm' => 'Petit',
'md' => 'Moyen',
'lg' => 'Grand',
'xl' => 'Très grand'
]
]
]
调用 $this->Item->enum('color')
将返回
[
'red' => 'Rouge',
'green' => 'Vert',
'blue' => 'Bleu'
]
在控制器中,可以使用以下方式使用 enums
方法
public function edit($id)
{
// ...
$options = $this->Item->enums();
$this->set(compact('options'));
}
在模型类中的一个使用示例,翻译是通过插件 __m
函数完成的,该插件位于 Translator
public $actsAs = [
'Database.DatabaseEnumerableBehavior' => [
'translate' => ['__m']
]
];
如果不希望翻译 inList 的值(此时键和值将是相同的字符串)
public $actsAs = [
'Database.DatabaseEnumerableBehavior' => [
'translate' => false
]
];
DatabaseFormattableBehavior
此 行为 允许在验证和记录之前,将实用工具类的方法应用于模型字段的值。
实用工具类必须位于 Utility/DatabaseFormatters。
在模型类中使用的示例,默认配置
public $actsAs = array(
'Database.DatabaseFormattable' => array(
'Database.DatabaseDefaultFormatters' => array(
'formatTrim' => array( 'NOT' => array( 'binary' ) ),
'formatNull' => true,
'formatNumeric' => array( 'float', 'integer' ),
'formatSuffix' => '/_id$/'
)
)
);
对于每个格式化程序,接受的值是
- true/null
- false
- array()
- string (字段名的正则表达式)
- 在数组中可以有一个 NOT 键来取
- 如果值是数组(例如:
array( 'NOT' => array( 'binary' ) )
),则所有类型,除了该键的值 - 如果值是字符串(例如:
array( 'NOT' => '/password/' )
),则所有字段,除了与该键的正则表达式匹配的字段
- 如果值是数组(例如:
类型(PostgreSQL)包括
- binary
- boolean
- date
- datetime
- float
- inet
- integer
- string
- text
- time
可以禁用默认格式化程序的使用,并按以下方式配置其他格式化程序
public $actsAs = array(
'Database.DatabaseFormattable' => array(
'Database.DatabaseDefaultFormatters' => false,
'MyDefaultFormatters' => array(
'formatTrim' => array( 'NOT' => array( 'binary' ) )
)
)
);
DatabaseTableBehavior
此 行为 向与表关联的模型添加以下方法
- fields: 返回模型的字段列表
- hasUniqueIndex: 允许判断模型给定列是否具有唯一索引
- join: 返回一个数组,用于在 CakePHP 中进行临时代数联接
- joinAssociationData: 返回与模型别名关联的关联数据(参见 join)
- joins: 允许通过仅指定模型名称(以及可选的类型、条件、别名、表)以及键中的子联接来描述要应用于模型的联接,类似于 contain 的方式
- sql: 从查询数据返回 SQL 查询(例如,用于子查询)
- types: 返回关联表的字段类型列表
- uniqueIndexes: 返回关联表的唯一索引列表
在文件 app/Model/AppModel.php 中
public $actsAs = array( 'Database.DatabaseTable' );
Utility
DatabaseRelations
此类可以从模型类中获取有关模型之间联接的信息。
DatabaseFormatters/DatabaseDefaultFormatter
此类具有用于与 DatabaseFormattableBehavior 一起使用的公共格式 <rule> 方法。
与 Jenkins 的持续集成
测试
sudo -u www-data ant quality -f plugins/Database/Vendor/Jenkins/build.xml
待办事项列表
- 在 DatabaseAutovalidate 后添加实际值验证
- 检查 Validate::range 在 2.2.4 和 2.9.0 之间的变化
准备
sudo -u www-data ant clear -f plugins/Database/Vendor/Jenkins/build.xml
mkdir app/tmp/build
sudo chmod a+rw app/tmp/build
wget https://:8080/jnlpJars/jenkins-cli.jar
在 Jenkins 中添加作业
java -jar jenkins-cli.jar -s https://:8080 create-job "Plugin CakePHP 2.x Database" < plugins/Database/Vendor/Jenkins/jobs/build.xml
java -jar jenkins-cli.jar -s https://:8080 create-job "Plugin CakePHP 2.x Database Qualité" < plugins/Database/Vendor/Jenkins/jobs/quality.xml