pchec/cakephp-inheritance

此包已被弃用且不再维护。未建议替代包。

CakePHP插件,具有单表继承行为

安装: 24

依赖: 0

建议者: 0

安全: 0

星标: 0

关注者: 2

分支: 0

开放问题: 0

类型:cakephp-plugin

1.1 2018-11-18 17:12 UTC

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',
]);