[英]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.