asgrim/mini-mezzio

Mezzio的最小应用工厂

2.1.0 2023-12-13 21:43 UTC

README

使用此包使设置Mezzio应用更加快捷。此包假设您愿意使用

  • laminas/diactoros来为应用的PSR-7服务器请求实现
  • 您不需要使用SapiStreamEmitter
  • 您的ServerRequest来自$_SERVER

您所需提供的只是

然后,您可以将RouteMiddlewareDispatchMiddleware以及任何其他中间件或请求处理器连接到您的应用所需。

基本用法:使用Mini Mezzio的示例应用

首先,您必须通过Composer安装Mini Mezzio、容器和路由器。在本例中,我们将使用Laminas ServiceManager和FastRoute。

$ composer require asgrim/mini-mezzio laminas/laminas-servicemanager mezzio/mezzio-fastroute

然后在public/index.php中创建我们的应用

<?php

declare(strict_types=1);

use Laminas\Diactoros\Response\TextResponse;
use Laminas\ServiceManager\ServiceManager;
use Asgrim\MiniMezzio\AppFactory;
use Mezzio\Router\FastRouteRouter;
use Mezzio\Router\Middleware\DispatchMiddleware;
use Mezzio\Router\Middleware\RouteMiddleware;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;

require __DIR__ . '/../vendor/autoload.php';

$container = new ServiceManager();
$router = new FastRouteRouter();
$app = AppFactory::create($container, $router);
$app->pipe(new RouteMiddleware($router));
$app->pipe(new DispatchMiddleware());
$app->get('/hello-world', new class implements RequestHandlerInterface {
    public function handle(ServerRequestInterface $request): ResponseInterface
    {
        return new TextResponse('Hello world!');
    }
});
$app->run();

您可以使用PHP内置的web服务器来检查是否正常工作。启动它:

$ php -S 0.0.0.0:8080 -t public public/index.php

现在,如果您在浏览器中访问http://localhost:8080/hello-world,您应该会看到显示的文本Hello world!。现在您就可以在几分钟内制作中间件了!

使用容器进行管道和端点

不久后,您可能希望利用容器来为您的中间件处理器使用依赖注入,而不是将它们全部放在public/index.php中。由于Mezzio已经可以从它提供的容器中提取中间件,因此您可以将处理器放在适当的类中。

<?php

declare(strict_types=1);

namespace MyApp\Handler;

use Laminas\Diactoros\Response\JsonResponse;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;

final class HelloWorldHandler implements RequestHandlerInterface
{
     public function handle(ServerRequestInterface $request): ResponseInterface
     {
         return new JsonResponse(['message' => 'Hello world!'], 200);
     }
 }

您可以将public/index.php更新为从容器中提取东西

<?php

declare(strict_types=1);

use Laminas\ServiceManager\AbstractFactory\ReflectionBasedAbstractFactory;
use Laminas\ServiceManager\ServiceManager;
use Asgrim\MiniMezzio\AppFactory;
use Mezzio\Router\FastRouteRouter;
use Mezzio\Router\Middleware\DispatchMiddleware;
use Mezzio\Router\Middleware\RouteMiddleware;
use Mezzio\Router\RouterInterface;

require __DIR__ . '/../vendor/autoload.php';

$container = new ServiceManager();
$container->addAbstractFactory(ReflectionBasedAbstractFactory::class);
$container->setFactory(RouterInterface::class, static function () {
    return new FastRouteRouter();
});
$app = AppFactory::create($container, $container->get(RouterInterface::class));
$app->pipe(RouteMiddleware::class);
$app->pipe(DispatchMiddleware::class);
$app->get('/hello-world', \MyApp\Handler\HelloWorldHandler::class);
$app->run();

我们在这里更新了几个东西,利用了Laminas Service Manager的力量

  • 添加了ReflectionBasedAbstractFactory - 这允许基于反射的DI自动注入。这可以自动注入大多数东西
  • 添加了一个\Mezzio\Router\RouterInterface的工厂,它返回Mezzio\Router\FastRouteRouter的实例。然后可以使用ReflectionBasedAbstractFactory自动注入RouteMiddleware
  • RouteMiddlewareDispatchMiddleware现在仅用::class引用,而不是创建实例;由于它们只是字符串,因此它们在容器中查找。
  • 路由GET /hello-world映射到我们上面创建的\MyApp\Handler\HelloWorldHandler;同样,由于这是一个字符串,因此实例是从容器中获取的。