如何从路由调用容器?

我创建了一个基于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);


哔哔one
浏览 164回答 1
1回答

料青山看我应如是

我认为它new RequestHandler($container);也来自 Relay,它使用容器作为中间件来解析请求,但不会以其他方式传递它,因为它将是一个服务定位器。1. 关于在类中“使用”容器的快速说明。与其尝试将容器传递给类,不如使用容器注入每个类及其依赖项,最好使用类型提示。例如,如果您想在类中使用该记录器,则不应通过$container->get(myLogger::class). 相反,是这样的:use myLogger;class MyClasspublic $logger;public function __construct(myLogger $logger){    $this->logger = $logger;}然后您可以$this->logger在方法中使用。2.容器与路由器一起工作:你要实现的应该是调度前的最后一个中间件。它应该在其构造函数中包含容器。它应该接收匹配的路由,并根据它的定义初始化匹配的类(或函数)。在此初始化期间,它可以注入该类及其依赖项。我建议你考虑两个很好的例子。首先是Harmony 库,您会看到它如何使用上述容器。其次,由于您使用的是 FastRoute 和 PHP-DI 的自定义版本,请查看PHP-DI 演示的索引文件。虽然它不是 psr-15 的用途,但它展示了如何使用 PHP-DI 调用 FastRoute 的匹配路由。祝你好运。
打开App,查看更多内容
随时随地看视频慕课网APP