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