简单的 PHP 解析工具库,用于 API 开发

v4.3 2016-09-07 11:18 UTC

README

Latest Version on Packagist Software License Build Status Coverage Status Quality Score Total Downloads SensioLabsInsight

简单的 PHP 解析库,用于 API 开发,可以将 POST 请求体解析成 PHP 数组。

还可以查看用于处理输出的 Responder 库。

安装

首先通过 Composer 安装此包。在终端中

composer require nathanmac/Parser

Laravel/Lumen 用户

Laravel 用户(添加服务提供者)

如果您是 Laravel 用户,则可以使用服务提供者来自动准备绑定等。

app/config/app.php 中包含服务提供者。

'providers' => [
    '...',
    'Maverickslab\Utilities\Parser\ParserServiceProvider'
];

为了方便,在此文件的底部添加一个外观别名

'aliases' => [
    '...',
    'Parser' => 'Maverickslab\Utilities\Parser\Facades\Parser',
];

Lumen 用户(添加服务提供者)

如果您是 Lumen 用户,则可以使用服务提供者来自动准备绑定等。

// bootstrap/app.php

$app->register('Maverickslab\Utilities\Parser\ParserServiceProvider');

Lumen 用户也可以添加外观别名。

// bootstrap/app.php

class_alias('Maverickslab\Utilities\Parser\Facades\Parser', 'Parser');

使用外观

public function index()
{
    Parser::payload('application/json');

    Parser::json($payload);		    // JSON > Array
    Parser::xml($payload);		    // XML > Array
    Parser::yaml($payload);		    // YAML > Array
    Parser::querystr($payload);	    // Query String > Array
    Parser::serialize($payload);	// Serialized Object > Array
	Parser::bson($payload);	        // BSON > Array
	Parser::msgpack($payload);	    // MSGPack > Array

    Parser::all();                         // Return all values
    Parser::has('key');                    // Does a key exist, with value.
    Parser::get('key', 'default value');   // Get value by key, set an optional default.
    Parser::only('id', 'name', 'email');   // Only return value from the selected keys.
    Parser::except('password');            // Don't return values from the selected keys.
    Parser::mask($mask);                   // Return masked values (see Mask Function, below).
}

以下所有示例都假设您 没有 使用 Laravel(或 Lumen),因此没有访问外观的权限。与其他任何外观一样,而不是

$parser = new Parser();

$parser->{$method}($payload);

只需使用

Parser::{$method}($payload);

用法

解析函数

$parser->json($payload);		// JSON > Array
$parser->xml($payload);		    // XML > Array
$parser->yaml($payload);		// YAML > Array
$parser->querystr($payload);	// Query String > Array
$parser->serialize($payload);	// Serialized Object > Array
$parser->bson($payload);     	// BSON > Array
$parser->msgpack($payload);   	// MSGPack > Array

解析输入/负载(PUT/POST)

$parser = new Parser();
$parser->payload();		                // Auto Detect Type - 'Content Type' HTTP Header
$parser->payload('application/json');	// Specifiy the content type

辅助函数

$parser = new Parser();
$parser->all();                         // Return all values
$parser->has('key');                    // Does a key exist, with value.
$parser->get('key', 'default value');   // Get value by key, set an optional default.
$parser->only('id', 'name', 'email');   // Only return value from the selected keys.
$parser->except('password');            // Don't return values from the selected keys.
$parser->mask($mask);                   // Return masked values (see Mask Function, below).

遮罩函数

遮罩函数使用配置遮罩处理负载数据,从而只返回数据的一部分。它的工作方式与 only 方法类似,但增加了允许您以数组的形式指定遮罩的功能,这意味着您可以根据系统或用户定义的条件动态生成遮罩。

演示
遮罩

定义遮罩,遮罩由基本数组结构组成,对于这个特定的示例,我们有关于要返回的数据的一些规则,包括:- 帖子的标题 - 所有评论的正文。

$mask = [
    'post' => [
        'title' => '*',
        'comments' => [
            'body' => '*'
        ]
    ]
];
示例负载
{
    "post": {
        "title": "Hello World",
        "author": "John Smith",
        "comments": [
            {"body": "This is a comment", "date": "2015-02-20"},
            {"body": "This is another comment", "date": "2015-05-09"}
        ]
    }
}
应用遮罩
    $parser = new Parser();
    $output = $parser->mask($mask);
输出

这是应用遮罩到上面提供的示例负载后生成的输出。

$output = [
    'post' => [
        'title' => 'Hello World',
        'comments' => [
            ['body' => 'This is a comment'],
            ['body' => 'This is another comment']
        ]
    ]
];

通配符/特殊键(*, %, :first, :last, :index[0], :item[0])

$parser = new Parser();
$parser->has('message.*');          // Does a key exist, with value. (Wildcard key returns first item found)
$parser->get('message.*');          // Get value by key. (Wildcard key returns first item found)
$parser->has('message.:first');     // Does a key exist, with value. (:first key returns first item found)
$parser->get('message.:first');     // Get value by key. (:first key returns first item found)
$parser->has('message.:last');      // Does a key exist, with value. (:last key returns last item found)
$parser->get('message.:last');      // Get value by key. (:last key returns last item found)
$parser->has('message.:index[0]');  // Does a key exist, with value. (:index[0] key returns item at index 0)
$parser->get('message.:index[0]');  // Get value by key. (:index[0] key returns item at index 0)
$parser->has('message.:item[0]');   // Does a key exist, with value. (:item[0] key returns item at index 0)
$parser->get('message.:item[0]');   // Get value by key. (:item[0] key returns item at index 0)

解析 JSON

$parser = new Parser();
$parsed = $parser->json('
	{
		"message": {
			"to": "Jack Smith",
			"from": "Jane Doe",
			"subject": "Hello World",
			"body": "Hello, whats going on..."
		}
	}');

解析 XML

$parser = new Parser();
$parsed = $parser->xml('
			<?xml version="1.0" encoding="UTF-8"?>
			<xml xmlns:ns="http://example.com/xmlns">
				<message status="sent">
					<ns:meta hint="created">Created 5 minutes ago</ns:meta>
					<to>Jack Smith</to>
					<from>Jane Doe</from>
					<subject>Hello World</subject>
					<body>Hello, whats going on...</body>
				</message>
			</xml>');

解析查询字符串

$parser = new Parser();
$parsed = $parser->querystr('to=Jack Smith&from=Jane Doe&subject=Hello World&body=Hello, whats going on...');

解析序列化对象

$parser = new Parser();
$parsed = $parser->serialize('a:1:{s:7:"message";a:4:{s:2:"to";s:10:"Jack Smith";s:4:"from";s:8:"Jane Doe";s:7:"subject";s:11:"Hello World";s:4:"body";s:24:"Hello, whats going on...";}}');

解析 YAML

$parser = new Parser();
$parsed = $parser->yaml('
				---
				message:
				    to: "Jack Smith"
				    from: "Jane Doe"
				    subject: "Hello World"
				    body: "Hello, whats going on..."
				');

解析 BSON

$parser = new Parser();
$parsed = $parser->bson('BSON DATA HERE');

解析 MSGPack

$parser = new Parser();
$parsed = $parser->msgpack('MSGPACK DATA HERE');

自定义解析器/格式化器

您可以通过实现 FormatInterface 来创建自己的自定义解析器/格式化器,以下示例演示了使用自定义解析器/格式化器的用法。

use Maverickslab\Utilities\Parser\Formats\FormatInterface;

/**
 * Custom Formatter
 */

class CustomFormatter implements FormatInterface {
    /**
     * Parse Payload Data
     *
     * @param string $payload
     *
     * @return array
     *
     * @throws ParserException
     */
    public function parse($payload)
    {
        $payload; // Raw payload data

        $output = // Process raw payload data to array

        return $output; // return array parsed data
    }
}

使用自定义格式化器

use Acme\Formatters\CustomFormatter;

$parser = new Parser();
$parsed = $parser->parse('RAW PAYLOAD DATA', new CustomFormatter());

自动检测自定义格式化器

use Acme\Formatters\CustomFormatter;

$parser = new Parser();
$parser->registerFormat('application/x-custom-format', 'Acme\Formatters\CustomFormatter');
$parser->payload('application/x-custom-format');

测试

要测试库本身,请运行测试

composer test

贡献

有关详细信息,请参阅 CONTRIBUTING

鸣谢

许可证

MIT 许可证(MIT)。有关更多信息,请参阅 许可证文件

附录

支持的 Content-Type
XML
---
application/xml > XML
text/xml > XML

JSON
----
application/json > JSON
application/x-javascript > JSON
text/javascript > JSON
text/x-javascript > JSON
text/x-json > JSON

YAML
----
text/yaml > YAML
text/x-yaml > YAML
application/yaml > YAML
application/x-yaml > YAML

BSON
----
application/bson > BSON

MSGPack
-------
application/msgpack > MSGPack
application/x-msgpack > MSGPack

MISC
----
application/vnd.php.serialized > Serialized Object
application/x-www-form-urlencoded' > Query String