hchokshi / silverstripe-trait-config
将特性中的 SilverStripe 配置合并到类配置中,同时避免私有静态属性冲突。
Requires
- php: ^5.6 || ^7.0
- silverstripe/framework: ^4.0
This package is not auto-updated.
Last update: 2020-08-22 07:15:38 UTC
README
将特性中的 SilverStripe 配置合并到类配置中,同时避免私有静态属性冲突。
安装
-
需要 composer 包,执行
composer require hchokshi/silverstripe-trait-config
。 -
将
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 没有像 @aliasConfig
为 private 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 的正常配置系统相同(数组合并,较高优先级的标量值覆盖数组)。
类的配置来源优先级如下,从高到低
- 类配置
- 类 YAML
- 类私有静态属性
- 特征配置
- 特征YAML中未映射的配置名称(例如,特征YAML中的
db:
) - 特征YAML中已映射的名称(例如,特征YAML中的
jdalsfjlafdfl_db:
,其中特征有一个private static $jdalsfjlafdfl_db
和@internal @aliasConfig $db
注解。) - 特征私有静态变量
- 嵌套特征配置(例如,如果
Trait1
使用Trait2
,则Trait2
配置在“特征配置”中的优先级合并)