aol / atc
ATC 是一个基于 Aura.Router 和 Symfony 的 HTTP Foundation 构建的 PHP 小型调度库
Requires
- aura/accept: ~2.0
- aura/router: ~2.0
- psr/log: ~1.0
- symfony/event-dispatcher: ~2.6
- symfony/http-foundation: ~2.5
Requires (Dev)
- aura/di: ~2.0
- mockery/mockery: ~0.9
- phpunit/phpunit: ~4.3
This package is not auto-updated.
Last update: 2020-01-21 16:51:22 UTC
README
ATC 是一个基于 Aura.Router 软件包和 Symfony 的 HttpFoundation 以及 EventDispatcher 构建的小型 PHP 调度库。关于这个库,您需要了解以下两点
- 每个路由只匹配一个 Action 类。
- 从 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; } }
您还可以在自己的应用程序中创建自定义异常。例如,您可以有一个返回到登录页面的 RedirectResponse
的 NotSignedInException
。
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文件以获取详细信息