libriciel/cakephp-database

CakePHP 2.x 插件,用于简化数据格式化和验证

安装: 655

依赖者: 0

建议者: 0

安全: 0

类型:cakephp-plugin

2.1.0 2024-09-09 13:24 UTC

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 添加了三个验证规则:asciiintegercompareWith

  • 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 向模型添加了 enumsenum 方法。

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