robotusers / cakephp-table-inheritance
Robotusers CakePHP STI & CTI 模式插件
0.5.0
2020-11-20 09:08 UTC
Requires
- php: >=7.2.0
- cakephp/orm: ^4.0
Requires (Dev)
- php: >=7.2.0
- cakephp/cakephp: ^4.0
- cakephp/cakephp-codesniffer: @stable
- phpunit/phpunit: ^8.0
README
此插件实现了单一表继承(并有望在未来实现类表继承)模式,用于 CakePHP ORM。
安装
CakePHP 4.x
使用 composer
composer require robotusers/cakephp-table-inheritance
对于 CakePHP 3.x,请使用插件的 0.4 版本
composer require robotusers/cakephp-table-inheritance:^0.4
StiBehavior
目前只支持 STI。只需将行为添加到您的表中
//in ClientsTable: public function initialize(array $config) { $this->addBehavior('Robotusers/TableInheritance.Sti', [ 'table' => 'users', 'discriminator' => 'client' ]); } //alternative config in AdministratorsTable: public function initialize(array $config) { $this->table('users'); $this->addBehavior('Robotusers/TableInheritance.Sti'); $this->setDiscriminator('admin'); }
现在,ClientsTable
和 AdministratorsTable
将共享 users
数据库表。表必须有一个 discriminator
字段,该字段将用于确定哪条记录存储在行中。
多个辨别器
您还可以配置允许的辨别器列表。例如,当处理文件时非常有用。例如
//in ImagesTable: public function initialize(array $config) { $this->addBehavior('Robotusers/TableInheritance.Sti', [ 'table' => 'files', 'discriminatorField' => 'mime', 'acceptedDiscriminators' => [ 'image/jpeg', 'image/gif', 'image/png', 'image/tiff' ] ]); } //or using wildcards: public function initialize(array $config) { $this->addBehavior('Robotusers/TableInheritance.Sti', [ 'table' => 'files', 'discriminatorField' => 'mime', 'acceptedDiscriminators' => [ 'image/*' ] ]); }
ImagesTable
将共享 files
数据库表,并仅匹配指定的 MIME 类型。
您还可以在运行时添加接受的辨别器
$table->addAcceptedDiscriminator('image/bmp');
配置
StiBehavior
支持以下选项
discriminatorField
- 用于辨别模型的数据库表字段,默认为 'discriminator'discriminator
- 默认的辨别器值,默认为$table->alias()
table
- 要共享的数据库表,使用此选项或$table->table()
方法。checkRules
- 默认为true
。允许启用/禁用对辨别器值的内置规则检查。acceptedDiscriminators
- 接受的辨别器列表。
StiParentBehavior
此插件还允许配置父表,以便根据子表创建和填充实体。
//in UsersTable: public function initialize(array $config) { $this->addBehavior('Robotusers/TableInheritance.StiParent', [ 'tableMap' => [ 'Administrators' => [ 'admin', 'administrator' ], 'Clients' => 'client' ] ]); }
tableMap
选项接受一个数组,将表注册别名映射到辨别器字段值。
您还可以使用 discriminatorMap
选项将辨别器值映射到指定的表对象。
//in UsersTable: public function initialize(array $config) { $this->addBehavior('Robotusers/TableInheritance.StiParent', [ 'discriminatorMap' => [ 'admin' => $this->tableLocator()->get('Administrators'), 'client' => $this->tableLocator()->get('Clients') ] ]); }
此行为还提供了一个 newStiEntity()
方法,该方法将根据辨别器值代理 newEntity()
到配置的表之一。
$data = [ 'name' => 'super-admin', 'discriminator' => 'admin' ]; $admin = $this->Users->newStiEntity($data); //will call AdministratorsTable::newEntity() and return an Administrator entity instance.
之后,您可以使用 stiTable()
方法获取 STI 表,并使用其实际的 Table
对象处理实体。
$table = $this->Users->stiTable($admin); $table->save($admin); //it will save an entity using AdministratorsTable
您还可以直接从数据数组中检测 STI 表
$data = [ 'name' => 'super-admin', 'discriminator' => 'admin' ]; $table = $this->Users->stiTable($data); $admin = $table->newEntity($data); $table->save($admin);