rawebone/micro

一个简约、高效的Web框架,强调可测试性

1.0.1 2014-12-26 16:40 UTC

This package is not auto-updated.

Last update: 2024-09-24 01:18:04 UTC


README

Build Status

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\ErrorControllerInterfaceMicro\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
    }
}

出于两个原因

  1. 这可以让您将业务逻辑与Web逻辑分离;然后这两者可以独立更改
  2. 这样您就只测试Web的输入/输出是否正确,而不测试应用程序的整体功能

这还有一个额外的好处,那就是您可以在以后更改系统而不需要大规模重写。

许可证

MIT许可证,尽情使用。