foa/responder-bundle

响应器用于动作域响应器(ADR)模式

0.4.1 2014-11-20 08:36 UTC

This package is auto-updated.

Last update: 2024-09-07 20:02:42 UTC


README

摘要保罗·M·琼斯撰写的 动作域响应器 的响应器。

前言

安装

该软件包可以通过 composer 以 foa/responder-bundle 的方式安装和自动加载。

composer require foa/responder-bundle

质量

Scrutinizer Code Quality Code Coverage Build Status

此库试图遵守 PSR-1PSR-2PSR-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 替换为您喜欢的。

集成模板引擎

响应器包集成了以下模板引擎。您可以选择您喜欢的。

  1. aura/view
  2. league/plates
  3. mustache/mustache
  4. twig/twig
  5. smarty/smarty

集成其他模板引擎

<?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
    }
}

是的,我们也喜欢测试!。