簡體   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