[英]How to access slim4's routeParser with the PHP-DI setup demonstrated in Slim-Skeleton?
我已經建立了一個基於 SlimPHP 團隊的Slim Skeleton應用程序的新應用程序。 在我的路由定義中,我希望能夠訪問Slim4 文檔中描述的路由解析器。 因此,例如,我希望能夠像這樣編輯骨架的app/routes.php文件:
$app->get('/', function (Request $request, Response $response) {
$routeParser = $app->getRouteCollector()->getRouteParser(); // this doesn't work
$response->getBody()->write('Hello world! ' . $routeParser->urlFor('something'));
return $response;
});
$app->getRouteCollector()->getRouteParser()
不起作用是有道理的,因為$app
沒有在這里定義。 但我認為我們應該調用$this->getRouteCollector()->getRouteParser();
,但這會產生錯誤: "Call to undefined method DI\\\\Container::getRouteCollector()"
。
我的困惑似乎是關於依賴注入,這對我來說是新的,對我來說並不自然。 老實說,我很想在其他地方(在 index.php 內?)定義 $routeParser 變量,這樣我就可以在任何路由定義中訪問它,而不必每次都調用 $app->getRouteCollector()->getRouteParser()。 但目前我會接受任何有效的方法。
Slim skeleton 實際上演示了您需要實現的示例。 在 index.php 中創建 App 實例后,有一個這樣的賦值:
// Instantiate the app
AppFactory::setContainer($container);
$app = AppFactory::create();
$callableResolver = $app->getCallableResolver();
你也可以做到的:
$routeParser = $app->getRouteCollector()->getRouteParser();
如果你真的需要這個 RouteParser 實例在每個路由回調中可用,你可以把它放在依賴容器中,比如:
$container->set(Slim\Interfaces\RouteParserInterface::class, $routeParser);
然后您可以使用 PHP-DI 自動連接功能將此 RouteParser 注入控制器構造函數:
use Slim\Interfaces\RouteParserInterface;
class SampleController {
public function __construct(RouteParserInterface $routeParser) {
$this->routeParser = $routeParser;
//...
}
}
或者如果您需要在任何路由回調中調用$container->get()
:
$app->get('/', function (Request $request, Response $response) {
$routeParser = $this->get(Slim\Interfaces\RouteParserInterface::class);
$response->getBody()->write('Hello world! ' . $routeParser->urlFor('something'));
return $response;
});
您不需要 App 實例。 您可以使用RouteContext
來獲取 RouteParser:
$routeParser = \Slim\Routing\RouteContext::fromRequest($request)->getRouteParser();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.