Skip to content

Commit 45fbe33

Browse files
authored
Merge pull request #56 from lode/request-helper
2 parents 0ce7543 + 071ba1f commit 45fbe33

11 files changed

+1074
-5
lines changed

README.md

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,14 +150,19 @@ It has support for generating & sending documents with:
150150
- v1.1 extensions via profiles
151151
- v1.1 @-members for JSON-LD and others
152152

153+
Also there's tools to help processing of incoming requests:
154+
155+
- parse request options (include paths, sparse fieldsets, sort fields, pagination, filtering)
156+
- parse request documents for creating, updating and deleting resources and relationships
157+
153158
Next to custom extensions, the following [official extensions](https://jsonapi.org/extensions/) are included:
154159

155160
- Cursor Pagination ([example code](/examples/cursor_pagination_profile.php), [specification](https://jsonapi.org/profiles/ethanresnick/cursor-pagination/))
156161

157162
Plans for the future include:
158163

159-
- parse request options: sparse fields, sorting, pagination, filtering ([#44](https://github.com/lode/jsonapi/issues/44))
160-
- parse requests for creating, updating and deleting resources and relationships ([#5](https://github.com/lode/jsonapi/issues/5))
164+
- validate request options ([#58](https://github.com/lode/jsonapi/issues/58))
165+
- validate request documents ([#57](https://github.com/lode/jsonapi/issues/57))
161166

162167

163168
## Contributing

composer.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@
2222
}
2323
},
2424
"require-dev": {
25-
"phpunit/phpunit": "^5.7|^6.5|^7.5|^8.0"
25+
"phpunit/phpunit": "^5.7|^6.5|^7.5|^8.0",
26+
"psr/http-message": "^1.0"
27+
},
28+
"suggests": {
29+
"psr/http-message": "Allows constructing requests from Psr RequestInterface"
2630
}
2731
}

composer.lock

Lines changed: 57 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ <h3>Relationship responses</h3>
4545

4646
<h3>Misc</h3>
4747
<ul>
48+
<li><a href="request_superglobals.php">Processing query parameters and request documents</a></li>
4849
<li><a href="null_values.php">Null values if explicitly not available</a></li>
4950
<li><a href="meta_only.php">Meta-only use-cases</a></li>
5051
<li><a href="status_only.php">Status-only</a></li>

examples/request_superglobals.php

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
<?php
2+
3+
use alsvanzelf\jsonapi\Document;
4+
use alsvanzelf\jsonapi\helpers\RequestParser;
5+
6+
require 'bootstrap_examples.php';
7+
8+
/**
9+
* preparing request data in superglobals from a webserver
10+
*/
11+
$_GET = [
12+
'include' => 'ship,ship.wing',
13+
'fields' => [
14+
'user' => 'name,location',
15+
],
16+
'sort' => 'name,-location',
17+
'page' => [
18+
'number' => '2',
19+
'size' => '10',
20+
],
21+
'filter' => '42',
22+
];
23+
$_POST = [
24+
'data' => [
25+
'type' => 'user',
26+
'id' => '42',
27+
'attributes' => [
28+
'name' => 'Foo',
29+
],
30+
'relationships' => [
31+
'ship' => [
32+
'data' => [
33+
'type' => 'ship',
34+
'id' => '42',
35+
],
36+
],
37+
],
38+
],
39+
'meta' => [
40+
'lock' => true,
41+
],
42+
];
43+
44+
$_SERVER['REQUEST_SCHEME'] = 'https';
45+
$_SERVER['HTTP_HOST'] = 'example.org';
46+
$_SERVER['REQUEST_URI'] = '/user/42?'.http_build_query($_GET);
47+
$_SERVER['CONTENT_TYPE'] = Document::CONTENT_TYPE_OFFICIAL;
48+
49+
/**
50+
* parsing the request
51+
*
52+
* if you have a PSR request object you can use `$requestParser = RequestParser::fromPsrRequest($request);`
53+
*/
54+
$requestParser = RequestParser::fromSuperglobals();
55+
56+
/**
57+
* now you can check for certain query parameters and document values in an easy way
58+
*/
59+
60+
// useful for filling a self link in responses
61+
var_dump($requestParser->getSelfLink());
62+
63+
// useful for determining how to process the request (list/get/create/update)
64+
var_dump($requestParser->hasIncludePaths());
65+
var_dump($requestParser->hasSparseFieldset('user'));
66+
var_dump($requestParser->hasSortFields());
67+
var_dump($requestParser->hasPagination());
68+
var_dump($requestParser->hasFilter());
69+
70+
// these methods often return arrays where comma separated query parameter values are processed for ease of use
71+
var_dump($requestParser->getIncludePaths());
72+
var_dump($requestParser->getSparseFieldset('user'));
73+
var_dump($requestParser->getSortFields());
74+
var_dump($requestParser->getPagination());
75+
var_dump($requestParser->getFilter());
76+
77+
// use for determinging whether keys were given without having to dive deep into the POST data yourself
78+
var_dump($requestParser->hasAttribute('name'));
79+
var_dump($requestParser->hasRelationship('ship'));
80+
var_dump($requestParser->hasMeta('lock'));
81+
82+
// get the raw data from the document, this doesn't (yet) return specific objects
83+
var_dump($requestParser->getAttribute('name'));
84+
var_dump($requestParser->getRelationship('ship'));
85+
var_dump($requestParser->getMeta('lock'));
86+
87+
// get the full document for custom processing
88+
var_dump($requestParser->getDocument());

0 commit comments

Comments
 (0)