foa / responder-bundle
响应器用于动作域响应器(ADR)模式
0.4.1
2014-11-20 08:36 UTC
Requires
- aura/accept: 2.*
- aura/web: 2.*
- foa/domain-payload: 1.*
Requires (Dev)
- foa/html-view-bundle: 2.*
- league/plates: ~3.0
- mustache/mustache: ~2.0
- smarty/smarty: ~3.1
- twig/twig: ~1.0
Suggests
- foa/html-view-bundle: For integrating aura view and html seamlessly
- league/plates: For integrating plates templating
- mustache/mustache: For integrating Mustache.php
- smarty/smarty: For integrating smarty
- twig/twig: For integrating twig
README
摘要保罗·M·琼斯撰写的 动作域响应器 的响应器。
前言
安装
该软件包可以通过 composer 以 foa/responder-bundle 的方式安装和自动加载。
composer require foa/responder-bundle
质量
此库试图遵守 PSR-1、PSR-2 和 PSR-4。如果您发现遵守上的疏忽,请通过 pull request 发送补丁。
社区
要提问、提供反馈或与其他 Aura 社区进行沟通,请加入我们的 Google Group,关注 @auraphp 在 Twitter 上,或在 Freenode 的 #auraphp 上与我们聊天。
示例用法
在这个例子中,我们使用了几个 aura 组件,但 foa/responder-bundle
并非专门针对 Aura 框架。如果您喜欢这个概念,可以使用其类将其集成到任何框架中。
假设您有一个博客应用,您可以浏览帖子。让我们看看它在 ADR 中是什么样子。您应该特别注意响应器。动作和服务层组件可能因您使用的内容而异。
动作
<?php // BlogBrowseAction.php namespace Vendor\Blog\Web\Action; use FOA\DomainPayload\PayloadFactory; use Vendor\Blog\Web\Responder\BlogBrowseResponder; class BlogBrowseAction { protected $domain; protected $responder; public function __construct( BlogService $domain, BlogBrowseResponder $responder ) { $this->domain = $domain; $this->responder = $responder; } public function __invoke() { $payload_factory = new PayloadFactory(); $payload = $payload_factory->found( array( array('title' => 'Some awesome title', 'author' => 'Hari KT'), array('title' => 'Some awesome post', 'author' => 'Paul M Jones'), array('title' => 'Some awesome content', 'author' => 'Justin'), ) ); // Rather than the above code, you should actually do something like // $payload = $this->domain->fetchPage($page, $paging); $this->responder->setPayload($payload); return $this->responder->__invoke(); } }
响应器
<?php // BlogBrowseResponder.php namespace Vendor\Blog\Web\Responder; use FOA\Responder_Bundle\AbstractResponder; class BlogBrowseResponder extends AbstractResponder { protected $available = array( 'text/html' => '', 'application/json' => '.json', ); protected $payload_method = array( 'FOA\DomainPayload\Found' => 'display' ); public function display() { if ($this->negotiateMediaType()) { $content_type = $this->response->content->getType(); if ($content_type) { $view .= $this->available[$content_type]; } $this->renderView('browse', 'layout'); } } }
首先实例化您选择的模板引擎。例如,使用 Aura.View。请参阅 以下支持的其它模板引擎。
<?php $factory = new \Aura\Html\HelperLocatorFactory; $helpers = $factory->newInstance(); $engine = new \Aura\View\View( new \Aura\View\TemplateRegistry, new \Aura\View\TemplateRegistry, $helpers ); $renderer = new \FOA\Responder_Bundle\Renderer\AuraView($engine);
创建响应器对象
<?php $web_factory = new \Aura\Web\WebFactory($GLOBALS); $response = $web_factory->newResponse(); $accept_factory = new \Aura\Accept\AcceptFactory($_SERVER); $accept = $accept_factory->newInstance(); $responder = new \Vendor\Blog\Web\Responder\BlogBrowseResponder($accept, $response, $renderer);
渲染和设置内容到响应
<?php use FOA\DomainPayload\PayloadFactory; $payload_factory = new PayloadFactory(); $payload = $payload_factory->found(array('name' => 'Hari KT')); $responder->setPayload($payload); $responder->__invoke();
调用 __invoke
将渲染并设置内容到响应对象。现在,您可以使用 Aura\Web\ResponseSender
发送响应,或从响应对象获取头部并将其设置到您喜欢的库响应中。
<?php echo $response->content->get();
Aura 框架与 Aura.Di 的集成
在您的项目 config/Common.php
中,定义方法添加以下行。
$di->params['FOA\Responder_Bundle\Renderer\AuraView']['engine'] = $di->lazyNew('Aura\View\View'); // responder $di->params['FOA\Responder_Bundle\AbstractResponder']['response'] = $di->lazyGet('aura/web-kernel:response'); $di->params['FOA\Responder_Bundle\AbstractResponder']['renderer'] = $di->lazyNew('FOA\Responder_Bundle\Renderer\AuraView'); $di->params['FOA\Responder_Bundle\AbstractResponder']['accept'] = $di->lazyNew('Aura\Accept\Accept');
别忘了将
renderer
替换为您喜欢的。
集成模板引擎
响应器包集成了以下模板引擎。您可以选择您喜欢的。
集成其他模板引擎
<?php namespace FOA\Responder_Bundle\Renderer; use FOA\Responder_Bundle\Renderer\RendererInterface; use Your\TemplateEngine; class YourTemplateEngine implements RendererInterface { public function __construct(TemplateEngine $engine) { $this->engine = $engine; } public function render($data, $view, $layout = null) { // according to how the rendering engine works. See other implementations // $this->engine->render } }
是的,我们也喜欢测试!。