亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何從路由調用容器?

如何從路由調用容器?

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 關注
  • 194 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號