asgrim / mini-mezzio
Mezzio的最小应用工厂
2.1.0
2023-12-13 21:43 UTC
Requires
- php: 8.1.*|8.2.*|8.3.*
- laminas/laminas-diactoros: ^3.1
- laminas/laminas-httphandlerrunner: ^2.7
- laminas/laminas-stratigility: ^3.10
- mezzio/mezzio: ^3.17
- mezzio/mezzio-router: ^3.16
- psr/container: ^2.0
Requires (Dev)
- doctrine/coding-standard: ^12.0
- laminas/laminas-servicemanager: ^4.0@dev
- mezzio/mezzio-fastroute: ^3.11
- phpunit/phpunit: ^10.5
- psalm/plugin-phpunit: ^0.18.4
- vimeo/psalm: ^5.17
README
使用此包使设置Mezzio应用更加快捷。此包假设您愿意使用
laminas/diactoros
来为应用的PSR-7服务器请求实现- 您不需要使用
SapiStreamEmitter
- 您的
ServerRequest
来自$_SERVER
您所需提供的只是
- 一个实现
ContainerInterface
的容器实例,例如 laminas-servicemanager - 一个实现
RouterInterface
的路由器实例,例如 FastRoute
然后,您可以将RouteMiddleware
、DispatchMiddleware
以及任何其他中间件或请求处理器连接到您的应用所需。
基本用法:使用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
RouteMiddleware
和DispatchMiddleware
现在仅用::class
引用,而不是创建实例;由于它们只是字符串,因此它们在容器中查找。- 路由
GET /hello-world
映射到我们上面创建的\MyApp\Handler\HelloWorldHandler
;同样,由于这是一个字符串,因此实例是从容器中获取的。