Skip to content

Commit 965a5b8

Browse files
committed
Response mapping
1 parent db75590 commit 965a5b8

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+1018
-6
lines changed

README.md

+76-2
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,76 @@
1-
# Amazon alexa php library
2-
This library is a helper for google actions with php.
1+
# Google actions php library
2+
This library is a helper for google actions with php.
3+
4+
## Install via composer
5+
Require the package with composer:
6+
```
7+
composer require maxbeckers/google-actions-php
8+
```
9+
10+
## Usage
11+
Handle the request:
12+
- map request data to request object
13+
- validate request
14+
- handle request data
15+
- create response
16+
- send response
17+
18+
### Map request data to request object
19+
Map needed request headers and request body to `Request`.
20+
```php
21+
use MaxBeckers\GoogleActions\Request\Request;
22+
...
23+
$requestBody = file_get_contents('php://input');
24+
$googleRequest = Request::fromGoogleRequest($requestBody);
25+
```
26+
### Validate request
27+
The `RequestValidator` will handle the google request validation.
28+
```php
29+
use MaxBeckers\GoogleActions\Validation\RequestValidator;
30+
...
31+
$validator = new RequestValidator();
32+
$validator->validate($googleRequest);
33+
```
34+
### Register request handlers
35+
For different requests it's helpful to create different RequestHandlers.
36+
```php
37+
use MaxBeckers\GoogleActions\RequestHandler\RequestHandlerRegistry;
38+
...
39+
$requestHandlerRegistry = new RequestHandlerRegistry();
40+
$requestHandlerRegistry->addHandler($myRequestHandler);
41+
```
42+
### Use registry to handle request
43+
```php
44+
use MaxBeckers\GoogleActions\RequestHandler\RequestHandlerRegistry;
45+
...
46+
$requestHandler = $requestHandlerRegistry->getSupportingHandler($googleRequest);
47+
$response = $requestHandler->handleRequest($googleRequest);
48+
```
49+
### Render response
50+
```php
51+
header('Content-Type: application/json');
52+
echo json_encode($response);
53+
exit();
54+
```
55+
### Create a new request handler
56+
The new request handler must extend `AbstractRequestHandler`.
57+
First implement the abstract `supportsRequest`-method.
58+
```php
59+
public function supportsRequest(Request $request): bool
60+
{
61+
return true; // check request data
62+
}
63+
```
64+
Then implement the `handleRequest`-method. For simple responses there is a `ResponseHelper`.
65+
```php
66+
use MaxBeckers\GoogleActions\Helper\ResponseHelper;
67+
...
68+
/** @var ResponseHelper */
69+
private $responseHelper;
70+
...
71+
public function handleRequest(Request $request): Response
72+
{
73+
// todo set needed response data
74+
return $responseHelper->respond('Success :)');
75+
}
76+
```

composer.json

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
"keywords": [
66
"google",
77
"actions",
8+
"home",
89
"php"
910
],
1011
"license": "MIT",
+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
use MaxBeckers\GoogleActions\Helper\ResponseHelper;
4+
use MaxBeckers\GoogleActions\Request\Request;
5+
use MaxBeckers\GoogleActions\RequestHandler\AbstractRequestHandler;
6+
use MaxBeckers\GoogleActions\Response\Response;
7+
8+
/**
9+
* Just a simple example request handler.
10+
*
11+
* @author Maximilian Beckers <[email protected]>
12+
*/
13+
class SimpleRequestHandler extends AbstractRequestHandler
14+
{
15+
/**
16+
* @var ResponseHelper
17+
*/
18+
private $responseHelper;
19+
20+
/**
21+
* {@inheritdoc}
22+
*/
23+
public function supportsRequest(Request $request): bool
24+
{
25+
// support all requests, should not be done.
26+
return true;
27+
}
28+
29+
/**
30+
* {@inheritdoc}
31+
*/
32+
public function handleRequest(Request $request): Response
33+
{
34+
return $this->responseHelper->respond('Success :)');
35+
}
36+
}

examples/simple-request.php

+14-4
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,26 @@
11
<?php
22

33
use MaxBeckers\GoogleActions\Request\Request;
4-
use MaxBeckers\GoogleActions\Response\Response;
4+
use MaxBeckers\GoogleActions\RequestHandler\RequestHandlerRegistry;
5+
use MaxBeckers\GoogleActions\Validation\RequestValidator;
56

67
require '../vendor/autoload.php';
8+
require 'Handlers/SimpleRequestHandler.php';
79

810
$requestBody = file_get_contents('php://input');
911
if ($requestBody) {
10-
$alexaRequest = Request::fromGoogleRequest($requestBody);
12+
$googleRequest = Request::fromGoogleRequest($requestBody);
1113

12-
// todo generate response
13-
$response = new Response();
14+
// Request validation
15+
$validator = new RequestValidator();
16+
$validator->validate($googleRequest);
17+
18+
// add handlers to registry
19+
$mySimpleRequestHandler = new SimpleRequestHandler();
20+
$requestHandlerRegistry = new RequestHandlerRegistry();
21+
$requestHandlerRegistry->addHandler($mySimpleRequestHandler);
22+
23+
$response = $requestHandlerRegistry->getSupportingHandler($googleRequest)->handleRequest($googleRequest);
1424
// render response
1525
header('Content-Type: application/json');
1626
echo json_encode($response);
+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
namespace MaxBeckers\GoogleActions\Exception;
4+
5+
/**
6+
* @author Maximilian Beckers <[email protected]>
7+
*/
8+
class InvalidRequestException extends \Exception
9+
{
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
namespace MaxBeckers\GoogleActions\Exception;
4+
5+
/**
6+
* @author Maximilian Beckers <[email protected]>
7+
*/
8+
class MissingRequestHandlerException extends \Exception
9+
{
10+
}

src/Helper/ResponseHelper.php

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
<?php
2+
3+
namespace MaxBeckers\GoogleActions\Helper;
4+
5+
use MaxBeckers\GoogleActions\Response\ExpectedIntent;
6+
use MaxBeckers\GoogleActions\Response\InputPrompt;
7+
use MaxBeckers\GoogleActions\Response\Item;
8+
use MaxBeckers\GoogleActions\Response\Response;
9+
use MaxBeckers\GoogleActions\Response\ExpectedInput;
10+
use MaxBeckers\GoogleActions\Response\RichResponse;
11+
use MaxBeckers\GoogleActions\Response\SimpleResponse;
12+
13+
/**
14+
* @author Maximilian Beckers <[email protected]>
15+
*/
16+
class ResponseHelper
17+
{
18+
19+
/**
20+
* @var Response
21+
*/
22+
public $response;
23+
24+
/**
25+
* ResponseHelper constructor creates a new response object.
26+
*/
27+
public function __construct()
28+
{
29+
$this->response = new Response();
30+
}
31+
32+
/**
33+
* @param string $text
34+
*
35+
* @return Response
36+
*/
37+
public function respond(string $text): Response
38+
{
39+
$simpleResponse = new SimpleResponse();
40+
$simpleResponse->textToSpeech = $text;
41+
$simpleResponse->displayText = $text;
42+
$item = new Item();
43+
$item->simpleResponse = $simpleResponse;
44+
$richInitialPrompt = new RichResponse();
45+
$richInitialPrompt->items[] = $item;
46+
$inputPrompt = new InputPrompt();
47+
$inputPrompt->richInitialPrompt = $richInitialPrompt;
48+
49+
$intent = new ExpectedIntent();
50+
$intent->intent = ExpectedIntent::TYPE_TEXT;
51+
52+
$expectedInput = new ExpectedInput();
53+
$expectedInput->inputPrompt = $inputPrompt;
54+
$expectedInput->possibleIntents[] = $intent;
55+
56+
$this->response->expectedInputs[] = $expectedInput;
57+
58+
return $this->response;
59+
}
60+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
namespace MaxBeckers\GoogleActions\RequestHandler;
4+
5+
use MaxBeckers\GoogleActions\Request\Request;
6+
use MaxBeckers\GoogleActions\Response\Response;
7+
8+
/**
9+
* @author Maximilian Beckers <[email protected]>
10+
*/
11+
abstract class AbstractRequestHandler
12+
{
13+
/**
14+
* Check if the request handler can handle given request.
15+
*
16+
* @param Request $request
17+
*
18+
* @return bool
19+
*/
20+
public abstract function supportsRequest(Request $request): bool;
21+
22+
/**
23+
* Handle the given request end return a response object.
24+
*
25+
* @param Request $request
26+
*
27+
* @return Response
28+
*/
29+
public abstract function handleRequest(Request $request): Response;
30+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
namespace MaxBeckers\GoogleActions\RequestHandler;
4+
5+
use MaxBeckers\GoogleActions\Exception\MissingRequestHandlerException;
6+
use MaxBeckers\GoogleActions\Request\Request;
7+
8+
/**
9+
* @author Maximilian Beckers <[email protected]>
10+
*/
11+
class RequestHandlerRegistry
12+
{
13+
/**
14+
* @var AbstractRequestHandler[]
15+
*/
16+
private $requestHandlers = [];
17+
18+
/**
19+
* @param Request $request
20+
*
21+
* @throws MissingRequestHandlerException
22+
*
23+
* @return AbstractRequestHandler
24+
*/
25+
public function getSupportingHandler(Request $request): AbstractRequestHandler
26+
{
27+
foreach ($this->requestHandlers as $requestHandler) {
28+
if ($requestHandler->supportsRequest($request)) {
29+
return $requestHandler;
30+
}
31+
}
32+
33+
throw new MissingRequestHandlerException();
34+
}
35+
36+
/**
37+
* @param AbstractRequestHandler $handler
38+
*/
39+
public function addHandler(AbstractRequestHandler $handler)
40+
{
41+
$this->requestHandlers[] = $handler;
42+
}
43+
}

src/Response/Action.php

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
namespace MaxBeckers\GoogleActions\Response;
4+
5+
/**
6+
* @author Maximilian Beckers <[email protected]>
7+
*/
8+
class Action
9+
{
10+
const TYPE_UNKNOWN = 'UNKNOWN';
11+
const TYPE_VIEW_DETAILS = 'VIEW_DETAILS';
12+
const TYPE_MODIFY = 'MODIFY';
13+
const TYPE_CANCEL = 'CANCEL';
14+
const TYPE_RETURN = 'RETURN';
15+
const TYPE_EXCHANGE = 'EXCHANGE';
16+
const TYPE_EMAIL = 'EMAIL';
17+
const TYPE_CALL = 'CALL';
18+
const TYPE_REORDER = 'REORDER';
19+
const TYPE_REVIEW = 'REVIEW';
20+
const TYPE_CUSTOMER_SERVICE = 'CUSTOMER_SERVICE';
21+
22+
/**
23+
* @var string|null
24+
*/
25+
public $type;
26+
27+
/**
28+
* @var Button|null
29+
*/
30+
public $button;
31+
}

src/Response/BasicCard.php

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
namespace MaxBeckers\GoogleActions\Response;
4+
5+
/**
6+
* @author Maximilian Beckers <[email protected]>
7+
*/
8+
class BasicCard
9+
{
10+
/**
11+
* @var string|null
12+
*/
13+
public $title;
14+
15+
/**
16+
* @var string|null
17+
*/
18+
public $subtitle;
19+
20+
/**
21+
* @var string|null
22+
*/
23+
public $formattedText;
24+
25+
/**
26+
* @var Image|null
27+
*/
28+
public $image;
29+
30+
/**
31+
* @var Button[]
32+
*/
33+
public $buttons = [];
34+
}

0 commit comments

Comments
 (0)