pchec / cakephp-inheritance
CakePHP插件,具有单表继承行为
Requires
- php: >=5.4.16
Requires (Dev)
- cakephp/cakephp: ~3.6
- phpunit/phpunit: *
This package is not auto-updated.
Last update: 2022-06-11 06:30:32 UTC
README
注意:此存储库已存档且不再维护。
CakePHP的继承插件
此插件使CakePHP ORM具有单表继承功能。
主要特性
此插件允许您创建子类并将它们的数据存储在一个表中。一个字段用于确定记录属于哪个类。插件有两种主要的工作模式
- 具有类层次结构
- 没有类层次结构
类层次结构以由|
字符分隔的连接字符串形式构建。它与当前类型名称一起放入type
字段中。这使得祖先类可以了解其子类并与它们交互,使用它们共享的方法和属性。这是一个重要的特性,可以有许多应用。
如果您不需要此功能,您可以禁用它并仅使用基本模式,在该模式下,祖先类和子类不会直接相互交互,但仅共享方法和属性。这是通过使type
字段仅包含当前类名称来实现的。
为了说明类层次结构可能在哪里有用,让我们看看一个例子。
Contact是基类。Client和Supplier是其子类。Client有订单,Supplier有交货。所有Contacts都有地址。具有查看Contact详细信息权限的用户可以查看和纠正所有地址,无论它们属于哪个子类。然而,从Contact级别无法访问子类的更具体属性,如订单或交货。
安装
您可以使用composer将此插件安装到您的CakePHP应用程序中。
安装composer包的推荐方法是
composer require pchec/cakephp-inheritance
用法
在您打算使用的基表中创建type
列,并使其较长,例如varchar(255)
,以提供足够的存储空间以存储更广泛的应用程序。按照惯例,它将由行为存储有关记录所属类类型的有关信息。您也可以使用具有不同名称的列,但您必须在稍后配置中定义它。
在所有将使用该行为的模型中加载行为。确保所有模型使用相同的表名称。建议您将其命名为基类的名称。
class YourTable extends Table
{
public function initialize(array $config)
{
parent::initialize($config);
$this->table('your_table_name');
$this->addBehavior('Inheritance.SingleTable');
// Rest of the initialization code...
}
// Rest of the code...
}
在定义基类之后,您可以创建扩展它的子类。
class YourChildTable extends YourTable
{
public function initialize(array $config)
{
parent::initialize($config);
$this->table('your_table_name'); // Needs to be the same as in the parent
$this->addBehavior('Inheritance.SingleTable');
// Rest of the initialization code...
}
// Rest of the code...
}
自定义配置
您可以通过将hierarchy
选项设置为false
来关闭类层次结构生成。
$this->addBehavior('Inheritance.SingleTable', [
'hierarchy' => false,
]);
您可以通过传递到field_name
数组键中来使用您自己的字段名称而不是type
。
$this->addBehavior('Inheritance.SingleTable', [
'field_name' => 'your_field_name',
]);
您还可以通过设置table
选项来使用行为列的另一个表,而不是类所用的表。
$this->addBehavior('Inheritance.SingleTable', [
'table' => 'your_table_name',
]);
默认情况下,类名YourClassTable
接收YourClass
的类型。您可以通过传递type
选项来自定义此操作。
$this->addBehavior('Inheritance.SingleTable', [
'type' => 'your_type_name',
]);