eventjet/ausdruck
Composer 安装命令:
composer require eventjet/ausdruck
包简介
A small expression engine for PHP
README 文档
README
A small expression engine for PHP.
Quick start
composer require eventjet/ausdruck
use Eventjet\Ausdruck\Parser\ExpressionParser; use Eventjet\Ausdruck\Parser\Types; use Eventjet\Ausdruck\Type; $expression = ExpressionParser::parse( 'joe:MyPersonType.name:string()', new Types(['MyPersonType' => Type::listOf(Type::string())]), ); $scope = new Scope( // Passing values to the expression ['joe' => ['joe']], // Custom function definitions ['name' => static fn (array $person): string => $person[0]], ); $name = $expression->evaluate($scope); assert($name === 'Joe');
Documentation
Accessing scope variables
Syntax: varName:type
Scope variables are passed from PHP when it calls evaluate() on the expression:
use Eventjet\Ausdruck\Parser\ExpressionParser; use Eventjet\Ausdruck\Scope; $x = ExpressionParser::parse('foo:int') ->evaluate(new Scope(['foo' => 123])); assert($x === 123);
Examples
foo:int, foo:list<string>
See Types
Literals
123: Integer"foo": String1.23: Float[1, myInt:int, 3]: List of integers["foo", myString:string, "bar"]: List of strings
Operators
Both operands must be of the same type.
| Operator | Description | Example | Note |
|---|---|---|---|
=== |
Equality | foo:string === "bar" |
|
- |
Subtraction | foo:int - bar:int |
Operands must be of type int or float |
> |
Greater than | foo:int > bar:int |
Operands must be of type int or float |
|| |
Logical OR | foo:bool || bar:bool |
Operands must be of type bool |
| && | Logical AND | foo:bool && bar:bool |
Operands must be of type bool |
Where's the rest? We're implementing more as we need them.
Types
The following types are supported:
int: Integerstring: Stringbool: Booleanfloat: Floating point numberlist<T>: List of type Tmap<K, V>: Map with key type K and value type V- Any other type will be treated as an alias that you will have to provide when parsing the expression:
use Eventjet\Ausdruck\Parser\ExpressionParser; use Eventjet\Ausdruck\Type; ExpressionParser::parse('foo:MyType', ['MyType' => Type::alias(Type::listOf(Type::string()))]);
Functions
Syntax: target.functionName:returnType(arg1, arg2, ...)
The target can be any expression. It will be passed as the first argument to the function.
Example
haystack:list<string>.contains:bool(needle:string)
Built-In Functions
| Function | Description | Example |
|---|---|---|
count |
Returns the number of elements in a list | foo:list<string>.count:int() |
contains |
Returns whether a list contains a value | foo:list<string>.contains:bool("bar") |
head |
Returns the first element of a list as an Option |
foo:list<string>.head:Option<string>() |
isSome |
Takes an Option and returns whether it is Some |
foo:Option<int>.isSome:bool() |
map |
Returns a new list with the results of applying a function | foo:list<int>.map:list<int>(|i| i:int - 2) |
some |
Returns whether any element matches a predicate | foo:list<int>.some:bool(|item| item:int > 5) |
substr |
Returns a substring of a string | foo:string.substr:string(0, 5) |
tail |
Returns all elements of a list except the first | foo:list<string>.tail:list<string>() |
take |
Returns the first n elements of a list | foo:list<string>.take:list<string>(5) |
unique |
Returns a list with duplicate elements removed | foo:list<string>.unique:list<string>() |
Custom Functions
You can pass custom functions along with the scope variables:
use Eventjet\Ausdruck\Parser\ExpressionParser;use Eventjet\Ausdruck\Scope; $scope = new Scope( ['foo' => 'My secret'], ['mask' => fn (string $str, string $mask) => str_repeat($mask, strlen($str))] ); $result = ExpressionParser::parse('foo:string.mask("x")')->evaluate($scope); assert($result === 'xxxxxxxxx');
The target of the function/method call (foo:string in the example above) will be passed as the first argument to the
function.
Lambdas
Syntax: |arg1, arg2, ... | expression
To access an argument, you must specify its type, just like when accessing scope variables.
Example
|item| item:int > 5
eventjet/ausdruck 适用场景与选型建议
eventjet/ausdruck 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 35.86k 次下载、GitHub Stars 达 0, 最近一次更新时间为 2023 年 10 月 11 日, 在 PHP 生态内属于活跃度较高的组件。
我们在过去多个企业项目中使用过 eventjet/ausdruck 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 eventjet/ausdruck 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
统计信息
- 总下载量: 35.86k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 9
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2023-10-11