2

我将尝试在这里非常具体。

我正在使用BazingaGeocoderBundleGeocoder-php库集成到 Symfony2 中。在 config.yml 中,您可以使用其参数设置地理位置提供程序

配置.yml

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

我还有一个服务监听器,用来根据域名知道我应该使用哪个 api。如果有人访问,我将访问特定的 api url

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的 idbazinga_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 回答