slavielle/grabbag

一种简单安全的请求PHP对象链的方法,类似于路径表达式

v1.0.1 2017-11-09 14:49 UTC

README

Build Status Coverage Status Maintainability Latest Version on Packagist license

安装

$ 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模板生成变量。
  • 数据导出