2014-06-06 78 views
2

我的應用程序的服務需要訪問$_SERVER變量(是Apache提供)呼籲:$_SERVER['GEOIP_COUNTRY_CODE'];

有什麼好的方法來實現這一目標?

我目前的猜測是注入RequestStack,但另一方面我不想將完整的RequestStack耦合到此服務。

有沒有其他方法可以實現這一目標?

P.S. 請不要使用像https://github.com/aferrandini/Maxmind-GeoIp等捆綁軟件的鏈接回覆我。

+0

哪種是你的服務文件? yml或xml? –

+0

我使用yaml作爲文件格式。 – gries

回答

5

你必須告訴你的服務注入請求堆棧以獲取當前請求。

您可以撥打請求服務但它可能會導致ScopeWideningInjectionException異常,因爲請求可以改變。

你的服務文件:

<?php 

namespace Some\GreatBundle\ServicePath; 
use Symfony\Component\HttpFoundation\RequestStack; 

class GreatService 
{ 
    private $request; 

    public function __construct(RequestStack $requestStack) 
    { 
     $this->request = $requestStack->getCurrentRequest(); 
    } 

    public function getGeoIpCountryCode() 
    { 
     return $this->request->server->get("GEOIP_COUNTRY_CODE"); 
    } 
} 

陽明:

services: 
    your_great_service: 
     class:  Some\GreatBundle\ServicePath\GreatService 
     arguments: ["@request_stack"] 
+0

也許從請求堆棧中分離服務與額外的地理IP服務類:) –

-2

如果我理解了您,您希望在服務中使用$_SERVER變量。我發現這個symfony的文檔中:

use Symfony\Component\HttpFoundation\Request; 

$request = Request::createFromGlobals(); 

// retrieve SERVER variables 
$request->server->get('HTTP_HOST'); 

正如我所看到的,是沒有問題的,實現你的變量:

$request->server->get('GEOIP_COUNTRY_CODE'); 

Requests and Responses in Symfony

+0

是的,但我問是否有替代方案,所以我不必將完整的RequestStack注入到服務中。 – gries

+0

當然,你也可以使用舊的$ _SERVER superglobal。 – vobence