2

ここでは非常に具体的にしようと思います。

GazingaGeocoderBundleを使用していますGeocoder-phpライブラリのSymfony2への統合。config.ymlで、パラメーターを使用してジオロケーションプロバイダーを設定できます

config.yml

bazinga_geocoder:
    providers:
        google_maps:
            locale: en
            region: US

また、ドメイン名に基づいてどのAPIを使用する必要があるかを知るために使用されるサービスリスナーがあります。誰かがアクセスした場合、私は特定のAPIURLにアクセスします

www.domain.us -> api.en.anotherdomain.com
www.domain.it -> api.it.anotherimaginarydomain.com

サービスリスナーはconfig.ymlに設定されています

services:
    kernel.listener.domain_listener:
        class: MyOwn\Bundle\WebBundle\Listener\DomainListener
        arguments:
        - %tld_allowed%
        tags:
        - { name: kernel.event_listener, event: kernel.request, method: onDomainGet }

すべてのリクエストで、対応するAPIドメインとのセッション値を設定します。

bazinga_geocoderパラメータを指定できるようにしたいので、アクセスしたドメインに基づいてgoogle_mapsプロバイダーパラメータ(ロケール、リージョン)を設定できます。

どうやってやるの?間違った道を進んでいますか?

4

1 に答える 1

3

このバンドルがどのように機能するかはわかりませんが、コードを見てみましょう。

  • (構成を通じて)新しいプロバイダーが見つかると、拡張機能DefinitionはIDを持つ新しいプロバイダーを作成しますbazinga_geocoder.provider.$name
  • 定義にはタグbazinga_geocoder.providerプライベートな可視性があります
  • コンパイラパスは、としてタグ付けされたサービスを探し、サービスをbazinga_geocoder.provider呼び出します。つまり、です。registerProviderbazinga_geocoder.geocoderGeocoder

たぶんこれはうまくいくかもしれません:あなたのリクエストリスナーにサービスを注入しbazinga_geocoder.provider.google_mapsてから、を呼び出してください$provider->setLocale($locale)AbstractProviderクラスにはセッターがいないので(どちらにも)、リージョンを設定するのが辛いのかわかりませんGoogleMapsProvider

「残忍な」解決策はGoogleMapsProvider、リクエストリスナーに新しいインスタンスを作成し、それをジオコーダーに追加することです。リスナーは次のサービスを受け入れる必要があります。

  • bazinga_geocoder.geocoder.adapter
  • bazinga_geocoder.geocoder

あれは:

use Geocoder\Geocoder;
use Geocoder\Provider\GoogleMapsProvider;
use Geocoder\HttpAdapter\HttpAdapterInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;

class RequestListener
{
    private $adapter;
    private $geo;

    public function __construct(HttpAdapterInterface $adapter, Geocoder $geo)
    {
        $this->adapter = $adapter;
        $this->geo = $geo;
    }

    public function onKernelRequest(GetResponseEvent $event)
    {
        // Get locale and region in some way

        // Create and register the provider, dynamically
        $provider = new GoogleMapsProvider($this->adapter, $locale, $region);
        $this->geo->registerProvider($provider);
    }
}
于 2013-02-07T21:27:55.643 に答える