如何将 $_SERVER 变量注入服务

Posted

技术标签:

【中文标题】如何将 $_SERVER 变量注入服务【英文标题】:How to inject $_SERVER variable into a Service 【发布时间】:2014-06-06 07:33:23 【问题描述】:

我的应用程序的一个服务需要访问一个名为 $_SERVER 的变量(由 apache 提供):$_SERVER['GEOIP_COUNTRY_CODE'];

有什么好的方法可以做到这一点?

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

还有其他方法可以实现吗?

附: 请不要用 https://github.com/aferrandini/Maxmind-GeoIp 等捆绑包的链接回答我。

【问题讨论】:

你的服务文件是什么类型的? yml 还是 xml? 我使用 yaml 作为文件格式。 【参考方案1】:

您必须告诉您的服务注入请求堆栈以获取当前请求。

您可以调用请求服务,但这可能会导致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");
    

YML:

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

【讨论】:

也许可以将服务与请求堆栈中的额外地理 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

【讨论】:

是的,但我想问是否有替代方案,所以我不必将完整的 RequestStack 注入到服务中。 当然,你也可以使用旧的 $_SERVER superglobal。

以上是关于如何将 $_SERVER 变量注入服务的主要内容,如果未能解决你的问题,请参考以下文章

如何通过多个依赖注入连接不同类的变量?

php 服务器变量$_SERVER 服务器环境变量 $_ENV

自定义添加$_SERVER中的变量

ZF2:在服务构造函数中注入变量

PHP 服务器变量 $_SERVER

php 全局变量 预定义变量