slavielle / grabbag
一种简单安全的请求PHP对象链的方法,类似于路径表达式
v1.0.1
2017-11-09 14:49 UTC
Requires
- php: >=5.6.0
Requires (Dev)
- phpunit/phpunit: ^5.7
This package is not auto-updated.
Last update: 2024-09-29 03:26:01 UTC
README
安装
$ composer require slavielle/grabbag
Grabbag是一个PHP库,旨在通过路径表达式简单安全地访问PHP对象/数组链。
特性
- 紧凑的路径表达式语法,使用统一的语法来访问对象属性、获取器和数组键
- 在解析路径时防止异常,并在路径无法解析时提供默认值
- 使用%any返回多个值
- 使用查询构建结构化结果
什么是Grabbag?...一个示例
使用原始PHP
当你开发——比如——基于PHP面向对象框架或CMS时,你经常需要使用长表达式来访问对象/数组链。以Drupal 8为例:通过指向媒体实体的实体引用字段从节点获取图像URL会得到类似这样的结果
$result = $node->get('field_media_image')->first()->get('entity')->getTarget()->getValue()->get('field_image')->entity->getFileUri() echo $result;
使用Grabbag
使用Grabbag可以通过路径表达式访问对象/数组链
$result = Grabbag::grab($node, 'get("field_media_image")/first/get("entity")/target/value/get("field_image")/entity/fileUri'); echo $result;
两种方法的比较
- 原始PHP方法不是隐式安全的:表达式中的某些方法/属性在某些情况下可能返回或为NULL,然后引发异常。如果你真的想确保表达式安全,你必须在访问之前测试一些值。这是一个开发者经常需要处理的真正无聊的点:它是重复的、不吸引人的,可能引入错误,并使代码可读性降低。
- Grabbag方法隐式安全。如果无法沿着对象/数组链前进,则默认结果为NULL,或设置为指定的默认值。
使用%any返回多个值
Grabbag可以使用路径中的%any关键字收集多个简单值。让我们考虑以下示例,它类似于前面的示例,但使用%any关键字
$result = Grabbag::grab($node, 'get("field_media_image")/%any/get("entity")/target/value/get("field_image")/entity/fileUri'); var_dump($result);
如果路径中对应于%any的值可以用foreach(如果它是一个数组或可遍历对象)使用,则%any将解析路径,考虑每个值,并产生多值结果。
例如,如果
$node->get('field_media_image')
包含4个条目,则前面示例的结果将是一个类似下面的数组
[
"my/image/1.jpg",
"my/image/2.jpg",
"my/image/3.jpg",
"my/image/4.jpg"
]
使用Grabbag查询构建结构化结果
Grabbag查询允许通过收集路径来生成结构化结果。让我们以一个示例来说明
$result = Grabbag::grab($node, [ 'content-title:get("title").value', 'images:get("field_media_image")/%any/get("entity")/target/value/get("field_image")' => [ 'uri:entity/fileUri', 'alt:alt' ] ]); var_dump($result);
将生成一个结构化数组,如下所示
[
'content-title' => 'My node title',
'images' => [
[
'uri' => "my/image/1.jpg",
'alt' => "My image 1 alt"
],
[
'uri' => "my/image/2.jpg",
'alt' => "My image 2 alt"
],
[
'uri' => "my/image/3.jpg",
'alt' => "My image 3 alt"
],
]
]
想了解更多吗?
在
使用范围
Grabbag几乎可以用于大多数PHP项目。
你可以简单地用它来安全地访问对象/数组链,或者更复杂地产生结构化结果。
Grabbag对于在Drupal 8、Symfony、Laravel等面向对象框架/CMS上构建的项目尤其有用,并且可以用于任何需要从PHP对象/数组中操作值的地方。
以下是我心中可能的使用快速列表
- 为RESTful Web服务生成JSON数据。
- JSON转换
- 为Twig模板生成变量。
- 数据导出