syousoufov / alexa-skills-php
处理为Alexa技能设置自定义Web服务的繁琐事务的实用包。
1.0
2016-07-27 20:23 UTC
Requires
- php: >=5.6.5
- ext-openssl: *
- illuminate/routing: 5.2.*
- laravel/framework: 5.2.*
- nesbot/carbon: ~1.21
Requires (Dev)
- mockery/mockery: 0.9.*
- orchestra/testbench: ~3.0
- phpunit/phpunit: 4.0.*
This package is not auto-updated.
Last update: 2024-09-14 19:47:32 UTC
README
处理为Alexa技能设置自定义Web服务的繁琐事务的实用包。
设置
-
需要安装包:
composer require syousoufov/alexa-skills-php
-
将服务提供商附加到
config/app.php
// ..etc /* * Third Party Service Providers */ AlexaPHP\Providers\AlexaServiceProvider::class, // ..etc
-
使用
php artisan vendor:publish --provider="AlexaPHP\Providers\AlexaServiceProvider"
发布alexa-skills-php
配置并更改所需的值。除了application_id
之外的所有默认值都应该可以正常工作。 -
将路由中间件添加到
app/Http/Kernel.php
中的$routeMiddleware
栈/** * The application's route middleware. * * @var array */ protected $routeMiddleware = [ 'alexa' => \AlexaPHP\Middleware\AlexaRequestMiddleware::class, ];
-
现在可以通过中间件提供路由
$router->group( ['middleware' => ['alexa'],], function (Router $router) { $router->post('alexa', 'AlexaSkillsController@handleAlexaRequest'); });
处理请求并返回响应
Alexa请求可以路由到单个控制器方法,该方法可以作为传递请求到适当处理器的漏斗。
<?php namespace App\Http\Controllers; use AlexaPHP\Request\AlexaRequestInterface; use AlexaPHP\Request\IntentRequest; use AlexaPHP\Request\LaunchRequest; use AlexaPHP\Request\SessionEndedRequest; use AlexaPHP\Response\ResponseInterface; class AlexaSkillsController extends Controller { /** * Handle Alexa requests * * @param \AlexaPHP\Request\AlexaRequestInterface $alexa_request * @param \AlexaPHP\Response\ResponseInterface $response * @return array */ public function handleAlexaRequest(AlexaRequestInterface $alexa_request, ResponseInterface $response) { // Pass to its appropriate handler $method = camel_case($alexa_request->requestType()); return $this->$method($alexa_request, $response); } /** * Handle a launch request * * @param \AlexaPHP\Request\LaunchRequest $alexa_request * @param \AlexaPHP\Response\ResponseInterface $response * @return array */ public function launchRequest(LaunchRequest $alexa_request, ResponseInterface $response) { return $response->say('LaunchRequest handled.'); } /** * Handle an intent request * * @param \AlexaPHP\Request\IntentRequest $alexa_request * @param \AlexaPHP\Response\ResponseInterface $response * @return array */ public function intentRequest(IntentRequest $alexa_request, ResponseInterface $response) { $intent = $alexa_request->getIntent(); return $response->say("$intent handled."); } /** * Handle a session end request * * @param \AlexaPHP\Request\SessionEndedRequest $alexa_request * @param \AlexaPHP\Response\ResponseInterface $response * @return array */ public function sessionEndedRequest(SessionEndedRequest $alexa_request, ResponseInterface $response) { return $response->endSession()->say('SessionEndedRequest handled.'); } }
响应类型
语音响应 - 返回一些语音以渲染给用户
/** * Handle an intent request * * @param \AlexaPHP\Request\IntentRequest $alexa_request * @param \AlexaPHP\Response\ResponseInterface $response * @return array */ public function intentRequest(IntentRequest $alexa_request, ResponseInterface $response) { $intent = $alexa_request->getIntent(); return $response->say("$intent handled."); }
卡片 - 返回一个用于渲染到Amazon Alexa应用的卡片
/** * Handle an intent request * * @param \AlexaPHP\Request\IntentRequest $alexa_request * @param \AlexaPHP\Response\ResponseInterface $response * @return array */ public function intentRequest(IntentRequest $alexa_request, ResponseInterface $response) { $intent = $alexa_request->getIntent(); $card = new Card([ 'type' => 'Simple', 'title' => 'SomeTitle', 'content' => "Handled $intent!", 'text' => 'SomeText', 'image' => [ 'smallImageUrl' => 'http://someimg.com/url.jpg', 'largeImageUrl' => 'http://someimg.com/urlx2.jpg', ], ]); $card->content; // Handled TestIntent! return $response->card($card); }
重试请求 - 发出重试请求
/** * Handle an intent request * * @param \AlexaPHP\Request\IntentRequest $alexa_request * @param \AlexaPHP\Response\ResponseInterface $response * @return array */ public function intentRequest(IntentRequest $alexa_request, ResponseInterface $response) { $intent = $alexa_request->getIntent(); return $response->reprompt("$intent handled."); }
输出类型
您还可以为 say
和 reprompt
指定纯文本或SSML语音输出类型
/** * Handle an intent request * * @param \AlexaPHP\Request\IntentRequest $alexa_request * @param \AlexaPHP\Response\ResponseInterface $response * @return array */ public function intentRequest(IntentRequest $alexa_request, ResponseInterface $response) { return $response->reprompt("<speak>This output speech uses SSML.</speak>", ResponseInterface::TYPE_SSML); }
从请求中提取数据
这并不是所有可用方法的完整列表,请查阅源代码以更好地了解在readme填写完毕时的可用性。
/** * Handle Alexa requests * * @param \AlexaPHP\Request\AlexaRequestInterface $alexa_request * @param \AlexaPHP\Response\ResponseInterface $response * @return array */ public function handleAlexaRequest(AlexaRequestInterface $alexa_request, ResponseInterface $response) { $request_type = $alexa_request->requestType(); $session = $alexa_request->getSession(); $session_will_expire = $session->expiring(); $user = $session->user(); $attributes = $session->getAttribute('some.attribute'); $verifier = $alexa_request->getVerifier(); $lets_check_again = $verifier->verifyTimestamp(); if (! $lets_check_again) { throw new AccessDeniedHttpException("Naughty, naughty"); } return $response->say('I did stuff!'); }
测试
- 运行
composer install
然后phpunit
。 - 代码覆盖率:
phpunit --coverage-html tests/coverage/ && open tests/coverage/index.html
待办事项
- 完成文档
- 开源示例Web服务
- 重新评估API决策以获得更流畅的语法
- 将代码覆盖率从96%提升到100%