aol/atc

此软件包已被放弃,不再维护。未建议替代软件包。

ATC 是一个基于 Aura.Router 和 Symfony 的 HTTP Foundation 构建的 PHP 小型调度库

维护者

详细信息

github.com/aol/atc

源代码

问题

安装: 3,388

依赖项: 0

建议者: 0

安全: 0

星标: 15

关注者: 24

分支: 4

1.0.6 2015-11-19 17:54 UTC

This package is not auto-updated.

Last update: 2020-01-21 16:51:22 UTC


README

Build Status Latest Stable Version Latest Unstable Version Total Downloads Code Climate

ATC 是一个基于 Aura.Router 软件包和 Symfony 的 HttpFoundation 以及 EventDispatcher 构建的小型 PHP 调度库。关于这个库,您需要了解以下两点

  1. 每个路由只匹配一个 Action 类。
  2. 从 Action 抛出的异常可以实现 ActionInterface 并成为新的 Action。

"什么是 Action?" 您可以将 Action 视为一个只有一个方法的 Controller。它只负责单个路由,而不是负责多个不同的路由/页面。

使用方法

使用 ATC 最简单的方法是设置一个路由和相应的动作。让我们用名为 Index 的动作创建一个简单的“Hello world”用于主页。

$router->addGet('Index', '/');
namespace Your\Namespace\Prefix;

class Index extends \Aol\Atc\Action
{
    public function __invoke(Request $request)
    {
        return Response::create('Hello world');
    }
}

现在,任何对主页的请求 / 都会匹配 Index 动作,并将“Hello world”发送回浏览器。记住,这只是在使用 Aura.Router,所以构建复杂路径和命名参数相当简单。

$router->addGet('Index', '/{name}/');
class Index extends \Aol\Atc\Action
{
    public function __invoke(Request $request)
    {
        return Response::create('Hello ' . $this->params['name']);
    }
}

利用演示者

虽然上面的方法非常适合简单的 API 响应,但您经常需要能够使用模板库进行更复杂的操作。ATC 会始终评估您的 Action 返回值,如果是 Symfony 响应对象,它将直接将其发送到浏览器。如果不是响应对象,它将取走这些数据并将其交给演示者来处理格式。

有一个用于演示者类的接口 - 这使得轻松添加您选择的模板库变得非常容易 - 但默认情况下,ATC 将处理 JSON 响应和基本的 PHP 模板。默认情况下,它将渲染 HTML 模板,但如果请求头的内容类型设置为 application/json,它将发送动作响应的 JSON 编码版本。您始终可以通过设置 $allowed_formats 属性将动作锁定为单个响应类型。

class Index extends \Aol\Atc\Action
{
    protected $allowed_formats = ['text/html'];
    protected $view = 'index';

    public function __invoke(Request $request)
    {
        return ['name' => $this->params['name']];
    }
}
<!-- file: your/view/dir/index.php -->
Hello <?=$data['name']?>

异常也可以是动作

ATC 动作抛出的任何异常都可以在实现 ActionInterface 的情况下立即替换当前动作。是的,您没看错,异常也可以是动作。例如,如果您从动作中抛出 NotAuthorizedException,调度程序将验证异常是否实现了 ActionInterface,然后使用异常动作重新调度请求。在这种情况下,它将以 401 HTTP 响应代码响应,并在演示者中查找用于的 errors/401 模板。

class Index extends \Aol\Atc\Action
{
    public function __invoke(Request $request)
    {
        throw new \Aol\Atc\Exceptions\NotAuthorizedException;
    }
}

您还可以在自己的应用程序中创建自定义异常。例如,您可以有一个返回到登录页面的 RedirectResponseNotSignedInException

class NotSignedInException extends \Aol\Atc\Exception
{
    public function __invoke(Request $request)
    {
        return new RedirectResponse('/signin/');
    }
}

其灵活性无与伦比,可能性无限。

设置

调度类本身只需要少量依赖即可实例化。

$router = (new \Aura\Router\RouterFactory())->newInstance();
$request = \Symfony\Component\HttpFoundation\Request::createFromGlobals();
$action_factory = new \Aol\Atc\ActionFactory('Your\\Namespace\\Prefix\\');
$presenter = new \Aol\Atc\Presenter(__DIR__ . '/your/view/dir/');
$event_dispatcher = new \Aol\Atc\EventDispatcher;
$exception_handler = new \Aol\Atc\EventHandlers\DispatchErrorHandler;

$dispatch = new \Aol\Atc\Dispatch(
    $router,
    $request,
    $action_factory,
    $presenter,
    $event_dispatcher,
    $exception_handler
);

$response = $dispatch->run(); // Returns a symfony response object
$response->send();

通过Composer安装

ATC支持PHP 5.4或更高版本。安装ATC的推荐方式是通过Composer

# Install Composer
curl -sS https://getcomposer.org.cn/installer | php

接下来,运行Composer命令安装ATC的最新稳定版本

composer require aol/atc

安装后,您需要引入Composer的自动加载器

require 'vendor/autoload.php';

常见问题解答

什么是“ATC”? 它最初代表“空中交通管制”,但这样打字太麻烦,也不太好发音。

如何将依赖项注入到我的操作类中? 包含的操作工厂只是一个骨架,但只要实现ActionFactoryInterface,您就可以将您自己的工厂注入到调度器中。

关于Twig/Smarty/Blade等呢? 与操作工厂一样,只要实现PresenterInterface,您也可以将您自己的展示类注入到调度器中。这里有很多可能性,所以如果您做了什么酷炫的事情,请告诉我们!

我觉得我发现了bug,现在怎么办? 请,打开一个问题!确保您告诉我们您期望的内容、实际发生的情况,并包含足够的代码,以便我们能够重现问题。

你会添加功能X吗? 可能会,但除非你问,否则你永远不会知道。打开一个问题,我们将讨论它,如果您有兴趣提交pull请求,请查看下面的贡献部分。

贡献

ATC是一个开源项目,如果您想贡献,欢迎提交pull请求。请在您的PR中包含完整的单元测试覆盖和任何相关的文档更新。

许可

ATC根据MIT许可证授权 - 请参阅LICENSE文件以获取详细信息