hchokshi/silverstripe-trait-config

此包已被废弃,不再维护。未建议替代包。

将特性中的 SilverStripe 配置合并到类配置中,同时避免私有静态属性冲突。

安装数: 4 715

依赖: 0

建议者: 0

安全: 0

星标: 1

关注者: 1

分支: 0

开放问题: 0

类型:silverstripe-vendormodule

1.0.2 2018-07-25 00:45 UTC

This package is not auto-updated.

Last update: 2020-08-22 07:15:38 UTC


README

将特性中的 SilverStripe 配置合并到类配置中,同时避免私有静态属性冲突。

安装

  1. 需要 composer 包,执行 composer require hchokshi/silverstripe-trait-config

  2. TraitConfigTransformer 添加到您的配置生成链中,在 /index.php/public/index.php 中(4.1+)。

<?php

// ...

$kernel = new CoreKernel(BASE_PATH); // Already there from default SilverStripe install
TraitConfigTransformer::addToKernel($kernel); // Add this line

为什么?

特性为使用它们的类提供特性。默认情况下,SilverStripe 不处理来自特性的 YAML 配置,PHP 也限制类不能覆盖特性设置的属性,这意味着如果特性定义了一个 private static 配置,使用该特性和其子类的任何类都不能通过 YAML 定义该配置值。

此包允许特性通过它们的 private static 中的某些非冲突名称定义配置,并将它们映射到实际的 SilverStripe 配置。此模块还将特性 YAML 合并到使用类中,这是 SilverStripe 默认不做的。

SilverStripe 建议扩展来实现所需的行为,但这带来了一些自身的缺点 - 性能、方法调用的 IDE 提示、代码不够明确。虽然扩展仍然需要将代码应用到供应商等的类中,但特性允许您的类更明确地说明其行为。

如何实现?

按照上面的 安装 指令安装模块。

创建一个特性并在您的类中使用它。在您的特性中定义以下 private static 属性。此模块需要应用 @internal@aliasConfig 注释才能将静态映射到不同的名称。不要添加 @config 注释,因为这会导致 SilverStripe 捕获该属性未映射的名称/值并将其合并到使用类中。

特性的私有静态属性应随机命名或使用某些唯一前缀,以确保使用类没有使用相同名称属性的意图。

特性可以通过映射的 private static 属性或通过使用别名/非别名的 YAML 定义配置。例如,特性可以定义 YAML 中的 db:,它将被合并到使用类的配置中。

虽然特性也可以使用别名定义 YAML,但建议在 YAML 中使用非别名名称,因为没有命名冲突,YAML 没有像 @aliasConfigprivate static 变量提供的关于值将合并到何处的信息。如果使用别名和非别名名称定义配置值,非别名名称将以更高的优先级合并。

示例

在下面的示例中,MyTrait 的数据库列将合并到 MyObject 中。

<?php

trait MyTrait {
    /**
     * @internal
     * @aliasConfig $db
     * @var array 
     */
    private static $_mytrait_db = [ // This could be called $a09sdf0asfoiasdfj - "@aliasConfig $db" is the important part
        // ...
    ];
}

class MyObject extends DataObject {
    use MyTrait;
    
    private static $db = [
        // ...
    ];
}

优先级

配置合并的方式与 SilverStripe 的正常配置系统相同(数组合并,较高优先级的标量值覆盖数组)。

类的配置来源优先级如下,从高到低

  1. 类配置
  • 类 YAML
  • 类私有静态属性
  1. 特征配置
  • 特征YAML中未映射的配置名称(例如,特征YAML中的db:
  • 特征YAML中已映射的名称(例如,特征YAML中的jdalsfjlafdfl_db:,其中特征有一个private static $jdalsfjlafdfl_db@internal @aliasConfig $db注解。)
  • 特征私有静态变量
  • 嵌套特征配置(例如,如果Trait1使用Trait2,则Trait2配置在“特征配置”中的优先级合并)