为了账号安全,请及时绑定邮箱和手机立即绑定

如何从路由调用容器?

如何从路由调用容器?

PHP
哔哔one 2021-06-01 17:59:22
我创建了一个基于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 回答

?
料青山看我应如是

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 的匹配路由。

祝你好运。


查看完整回答
反对 回复 2021-06-04
  • 1 回答
  • 0 关注
  • 163 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信