繁体   English   中英

如何从路线呼叫Container?

[英]How to call for Container from Routes?

我已经创建了一个基于Fast-rout的路由器和基于PHP-DI的 Container。

它是我的路由器代码的一个片段:

$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);

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

祝你好运。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM