packagefactory/atomicfusion-proptypes

用于 fusion-prototypes 包的 react-propTypes 融合版本,适用于 PackageFactory.AtomicFusion:Component 和 Neos.Fusion:Component

v2.2.0 2023-01-09 14:45 UTC

README

Build Status

通过 @propType 注解验证传递给组件的属性。propType 注解的语法来源于 react-propTypes。

注意:此包默认仅验证开发环境中的属性。

prototype(Vendor.Site:Example) < prototype(Neos.Fusion:Component) {
    @propTypes {
        # optional, enforce that only validated props exist
        @strict = true
        # validation rules for props
        title = ${PropTypes.string.isRequired}
        subtitle = ${PropTypes.string}
    }
}

这将使用在 @propTypes 部分创建的验证器来验证给定的属性。

Fusion 验证器原型

属性也可以通过融合对象指定。

@propTypes {
    # all props can be marked as required via `@required = true`
    int = PropTypes:Int {
      @required = true
    }
    float = PropTypes:Float
    bool = PropTypes:Bool

    # strings allow to specify an optional `regularExpression`
    string = PropTypes:String {
        regularExpression = '/hello world/'
    }

    # allows array values that satisfy the `type`
    array = PropTypes:Array {
        type = PropTypes:Int
    }

    # allow values that satisfy one of the given validators
    union = PropTypes:Union {
        int = PropTypes:Int
        string = PropTypes:String
        ...
    }

    # allow exacly the values that are specified
    enum = PropTypes:Enum {     
      value1 = "foo"
      value2 = "bar"
      ...
    }

    # a nested structure that is valid once all children valídate
    dataStructure = PropTypes:DataStructure {
        title = PropTypes:String
        description = PropTypes:String
        ...
    }

    # a php object that satisfies the given interface
    instanceOf = PropTypes:InstanceOf {
        type = '\DateTimeInterface'
    }

    # data structure validator that uses the defined proptypes from another prototype
    fromPrototype = PropTypes:FromPrototype {
        prototypeName = "Vendor.Site:Prototype"
    }
}

propType 辅助工具支持的方法

  • PropTypes.any:接受任何值,包括 null。
  • PropTypes.boolean:验证给定的是布尔值,接受 null。
  • PropTypes.integer:验证给定的是整数,接受 null。
  • PropTypes.float:
    验证给定的是浮点数,接受 null。
  • PropTypes.string:
    验证给定的是字符串,接受 null。
  • PropTypes.regex('/pattern/'):验证给定的字符串与模式匹配。
  • PropTypes.oneOf([123, "foo", "bar"]):验证值等于给定选项之一。
  • PropTypes.arrayOf( PropTypes.string ):验证给定的数组,并使用给定的验证器进行验证,接受 null。
  • PropTypes.anyOf( PropTypes.string, PropTypes.integer ):验证值至少与给定验证器之一进行验证,接受 null。
  • PropTypes.dataStructure({'foo': PropTypes.integer, 'bar': PropTypes.string}):验证给定数组的键与分配的验证器进行验证,接受 null 并忽略所有其他键。键验证器必须定义单个键是否是必需的。
  • PropTypes.shape({'foo': PropTypes.integer, 'bar': PropTypes.string}):验证给定数组的键与分配的验证器进行验证,接受 null 并忽略所有其他键。键验证器必须定义单个键是否是必需的。
  • PropTypes.fileExists:验证给定值是现有文件。
  • PropTypes.instanceOf('Neos.Neos:Document'):验证给定类型,如果值是节点,则检查节点类型而不是 PHP 类,接受 null。

强制值

  • PropTypes.*.isRequired:为了确保提供了一个值,可以在类型验证之后调用 isRequired 方法。这将添加一个额外的 notEmpty 验证器来强制提供值。

工作原理

如果启用验证,则会在 Neos.Fusion:Component 和 PackageFactory.AtomicFusion:Component 实现的 evaluate 方法周围包装一个方面。

此方面将评估 @propTypes 部分中的键,这些键预期返回 Flow-Validators(Neos\Flow\Validation\Validator\ValidatorInterface)。然后评估每个键的当前 prop 值并传递给验证器。如果任何验证结果包含错误,则抛出 fusion-error。

PropTypes-EelHelper 是 PackageFactory\AtomicFusion\PropTypes\Validators\PropTypeValidator 的包装器,它同时是 EelHelper 和验证器。此对象创建了一个复合验证器,该验证器可以通过 eel 以类似 react-propTypes 的语法进行控制。

通过创建返回自定义验证器的 FusionObjects 或 EelHelpers,如果需要,可以扩展此机制。

严格模式

在严格模式下,如果开发环境中将未经验证的属性传递给组件,则会抛出错误。这确保了所有属性都经过验证。

要为组件启用严格模式,请在 @propTypes 中添加 @strict = true

prototype(Vendor.Site:Example) < prototype(Neos.Fusion:Component) {
    @propTypes {
        @strict = true
        ...
    }
}

设置

通过设置启用 propType 验证。默认情况下,此设置在 开发测试 环境中启用,但在 生产 环境中未启用。

PackageFactory:
  AtomicFusion:
    PropTypes:
      enable: false

安装

PackageFactory.AtomicFusion.PropTypes 可通过 packagist 获取。只需运行 composer require packagefactory/atomicfusion-proptypes 即可。

我们使用语义版本控制,每次重大更改都会增加主版本号。

许可证

请参阅许可证文件