rawebone / micro
一个简约、高效的Web框架,强调可测试性
Requires
- php: >=5.3.0
- psr/log: 1.0.*
- shrikeh/teapot: 1.0.*
- symfony/http-foundation: 2.5.*
Requires (Dev)
- mockery/mockery: 0.8.*
- phpspec/prophecy: 1.1.*
- phpunit/phpunit: 3.7.*
This package is not auto-updated.
Last update: 2024-09-24 01:18:04 UTC
README
Micro是一个专为需要快速构建小型、可靠应用程序的专业人士设计的Web框架。其目标包括
- 足够小巧,不会阻碍你的工作或强迫你做出重大的架构决策(即框架的大小不超过图片本身)
- 提供轻松全面测试和配置应用层的功能
- 提供调试请求过程的能力,以便确切地了解错误发生的原因
请注意,我正在降低对项目的支持,以支持Wilson,该项目部分基于本项目,但性能更好,设计更优。如果有人有兴趣共同拥有该项目,请随时联系,或者提交PR,我会合并。
使用方法
应用程序的基本使用方法如下
<?php require_once "vendor/autoload.php"; $app = new \Micro\Application(); $app->attach(\My\Controllers\Controller()); $app->run(); // Runs the application $app->send(); // Sends the result back to the browser
附加的控制器必须实现Micro\ControllerInterface
接口;构建控制器的推荐方法是扩展Micro\DefaultController
类
<?php namespace My\Controllers; use Micro\Request; use Micro\Responder; use Micro\DefaultController; class Controller extends DefaultController { protected function configure() { $this->setUri("/hello/{name}") ->addMethod("GET") ->addCondition("name", "\w+"); } public function accepts(Request $req) { // You can optionally override this method if you want to check any // details about the request; this can help filter out an invalid // request outside of handling it directly, like: return !$req->isAjax(); } public function handle(Request $req, Responder $resp) { return $resp->standard("Hello, {$req->get("name")}"); } }
处理错误和不良请求
有两个特殊的控制器接口可以影响应用程序的处理,分别是Micro\ErrorControllerInterface
和Micro\NotFoundControllerInterface
。您可以在一个对象上实现这些接口,并将其附加到应用程序实例,如下所示。
在遇到异常的情况下,将调用错误控制器并返回一个响应对象。同样,如果未找到请求的控制器,将调用未找到控制器为客户端提供响应。
Micro不会尝试处理此配置之外的错误或404。
测试
Micro包含一个与PHPUnit一起使用的基类测试用例,允许你在测试中运行请求;你可以通过以下方式做到这一点
<?php namespace My\Tests\Functional; // You may want to create a custom case for your project. // If using PHP>=5.4 you can use the trait Micro\Testing\ComposableTestCase. use Micro\Testing\AbstractTestCase; class MyControllerTest extends AbstractTestCase { protected static $app; protected function getApplication() { if (!self::$app) { self::$app = require_once "/path/to/app_bootstrap.php"; } return self::$app; } public function testRequest() { $resp = $this->getBrowser()->get("/hello/barry"); $this->assertEquals(200, $resp->getStatusCode()); $this->assertEquals("Hello, barry", $resp->getContent()); } }
Micro包含一个名为Browsers的概念。这些类模拟对应用程序的请求,并返回结果,允许你以简单、自动化的方式测试产品。有三个浏览器
标准浏览器
标准浏览器是浏览器堆栈的根,可以用于向应用程序发送基本请求。
跟踪浏览器
Micro能够跟踪请求在应用程序中的进展;这有助于你快速找到问题的根源。在每次通过此浏览器发出的请求之后,通过调用$browser->lastTrace()
将可用一个Micro\Testing\TraceResult
。可以直接打印到输出或查询。
性能分析浏览器
这提供了一种对请求进行性能分析和内存使用分析的能力,这主要用于帮助衡量和改进框架的性能,但也可以对最终用户有用。需要注意的是,捕获的数据不仅包括控制器的执行时间/内存使用。
跟踪控制器行为
如跟踪浏览器部分所述,可以通过系统跟踪请求,并且此功能可选地提供给控制器。
通过实现Micro\TraceableInterface
,你可以接收一个PSR-3日志记录器来捕获任何调试信息
namespace My\Controllers; use Micro\Request; use Micro\Responder; use Micro\DefaultController; use Micro\TraceableInterface; use Psr\Log\LoggerInterface; class Controller extends DefaultController implements TraceableInterface { protected $tracer; // ... public function tracer(LoggerInterface $log) { $this->tracer = $log; } public function handle(Request $req, Responder $resp) { $this->tracer->critical("Help!"); } }
一般方法
Micro,正如我希望您已经从上面看到的那样,被设计得尽可能简单和可测试。然而,如果您稍后需要更换框架,建议控制器尽可能少做工作。例如
namespace My\Controllers; // ... class Controller extends DefaultController { public function handle(Request $req, Responder $resp) { if ($this->myApplication()->doWork($settingA, $settingB)) { // Handle success } else { // Handle error } } }
更倾向于
namespace My\Controllers; // ... class Controller extends DefaultController { public function handle(Request $req, Responder $resp) { if ($this->doWork($settingA, $settingB)) { // Handle success } else { // Handle error } } protected function doWork($a, $b) { // Complicated API process } }
出于两个原因
- 这可以让您将业务逻辑与Web逻辑分离;然后这两者可以独立更改
- 这样您就只测试Web的输入/输出是否正确,而不测试应用程序的整体功能
这还有一个额外的好处,那就是您可以在以后更改系统而不需要大规模重写。
许可证
MIT许可证,尽情使用。