我创建了一个基于Fast-rout的路由器和基于PHP-DI 的容器。这是我的路由器代码的片段:$container = require __DIR__ . '/../config/Container.php';$logger = $container->get(myLogger::class); $routes = simpleDispatcher(function (RouteCollector $r) { $routes = include('config/Routes.php'); foreach ($routes as $key => $route) { $r->addRoute($route[0], $route[1], $route[2] ); }});$logger->warning('123'); $middlewareQueue[] = new FastRoute($routes);$middlewareQueue[] = new RequestHandler($container);$requestHandler = new Relay($middlewareQueue);$requestHandler->handle(ServerRequestFactory::fromGlobals());您可以看到我从 Container 实例调用 Logger。但是,我不知道如何将容器传递到通过路由器初始化的类中。例如,如果我/3在浏览器中请求“ ”,则 TestMe 类正在运行 ( route ['GET', '/3', TestMe::class])。我能够呈现页面或从中发出响应。但是我不能从中使用 $container 虽然看起来我将它添加到中间件中: $middlewareQueue[] = new RequestHandler($container);
1 回答
![?](http://img1.sycdn.imooc.com/5458655200013d9802200220-100-100.jpg)
料青山看我应如是
TA贡献1772条经验 获得超8个赞
我认为它new RequestHandler($container);
也来自 Relay,它使用容器作为中间件来解析请求,但不会以其他方式传递它,因为它将是一个服务定位器。
1. 关于在类中“使用”容器的快速说明。
与其尝试将容器传递给类,不如使用容器注入每个类及其依赖项,最好使用类型提示。
例如,如果您想在类中使用该记录器,则不应通过$container->get(myLogger::class)
. 相反,是这样的:
use myLogger;
class MyClass
public $logger;
public function __construct(myLogger $logger)
{
$this->logger = $logger;
}
然后您可以$this->logger
在方法中使用。
2.容器与路由器一起工作:
你要实现的应该是调度前的最后一个中间件。
它应该在其构造函数中包含容器。
它应该接收匹配的路由,并根据它的定义初始化匹配的类(或函数)。
在此初始化期间,它可以注入该类及其依赖项。
我建议你考虑两个很好的例子。首先是Harmony 库,您会看到它如何使用上述容器。其次,由于您使用的是 FastRoute 和 PHP-DI 的自定义版本,请查看PHP-DI 演示的索引文件。虽然它不是 psr-15 的用途,但它展示了如何使用 PHP-DI 调用 FastRoute 的匹配路由。
祝你好运。
- 1 回答
- 0 关注
- 163 浏览
添加回答
举报
0/150
提交
取消