簡體   English   中英

如何使用 Slim-Skeleton 中演示的 PHP-DI 設置訪問 slim4 的 routeParser?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM