nathanmac/parser

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

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

README

Latest Version on Packagist Software License Build Status Total Downloads

简单PHP解析库,用于API开发,将HTTP POST请求数据解析为PHP数组。

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

安装

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

composer require nathanmac/parser

Laravel/Lumen用户

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

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

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

'providers' => [
    ...,
    Nathanmac\Utilities\Parser\ParserServiceProvider::class
];

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

'aliases' => [
    ...,
    'Parser' => Nathanmac\Utilities\Parser\Facades\Parser::class,
];

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

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

// bootstrap/app.php

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

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

// bootstrap/app.php

class_alias('Nathanmac\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 Nathanmac\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
    }
}

使用CustomFormatter

use Acme\Formatters\CustomFormatter;

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

自动检测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-Types
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