4

私のサービスで定義されたFunctiongetCurrentOrDefaultLocale()は、コントローラーまたはコマンド ライン スクリプトから呼び出すことができます。

CLI からサービスにアクセスrequestすると例外がスローされ、それを使用して CLI 呼び出しを検出しています。ただし、この目的のためだけに例外をキャッチするのは、私にはとても悪いようです。

現在のコンテキスト (実行、ブラウザーと CLI) でリクエストにアクセスできるかどうかを確認する信頼できる方法はありますか?

/**
 * @return string
 */
protected function getCurrentOrDefaultLocale()
{
    try {
        $request = $this->container->get('request');
    }
    catch(InactiveScopeException $exception) {
        return $this->container->getParameter('kernel.default_locale');
    }

    // With Symfony < 2.1.0 current locale is stored in the session
    if(version_compare($this->sfVersion, '2.1.0', '<')) {
        return $this->container->get('session')->getLocale();
    }

    // Symfony >= 2.1.0 current locale from the request
    return $request->getLocale();
}
4

1 に答える 1

8

/を使用して、現在のコンテナー インスタンスにrequestサービス/スコープがあるかどうかを簡単に確認できます。ContainerInterface::has()ContainerInterface::hasScope()

編集:

私の間違い。サービスが完全に機能ContainerInterface::isScopeActive()しているかどうかを判断するには、を使用する必要があります。request

public function __construct(ContainerInterface $container, RouterInterface $router) {
    if ($container->isScopeActive('request')) {
        $this->request = $container->get('request');
        $this->router = $router;
    }
}

切り取られたこのコードは、非常によく似た問題を経験した自分のプロジェクトからのものです。

于 2012-12-22T01:03:22.053 に答える