【问题标题】:Symfony 4: How to pass the $_SERVER array as constructor argumentSymfony 4:如何将 $_SERVER 数组作为构造函数参数传递
【发布时间】:2018-05-24 08:38:47
【问题描述】:

我正在使用 Symfony 4 的 The DependencyInjection Component,我正在尝试定义配置设置(在 config/services.yml 中)以创建一个简单的 ServerRequest 对象。 ServerRequest 接收 $_SERVER 变量(数组)作为构造函数参数 $serverParams 的参数。

它应该打印数组,但是,它打印字符串“$_SERVER”:

来自 ServerRequest 的您好!

...path-to-project-root/mytests/ServerRequest.php:14:string '$_SERVER' (长度=8)

也许你有一个想法?非常感谢!


config/services.yml:

parameters:

services:
    _defaults:
        autowire: false
        autoconfigure: true
        public: true

    MyTests\ServerRequest:
        arguments:
            $serverParams: $_SERVER

mytests/ServerRequest.php

<?php

namespace MyTests;

class ServerRequest {

    private $serverParams;

    public function __construct($serverParams) {
        $this->serverParams = $serverParams;

        echo 'Hello from ServerRequest!<br/>';

        var_dump($this->serverParams);
    }

}

bootstrap.php

<?php

use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;

/*
 * Include the Composer autoloader.
 */
require __DIR__ . '/vendor/autoload.php';

/*
 * Create dependency injection container.
 */
$container = new ContainerBuilder();
$fileLocator = new FileLocator(__DIR__ . '/config');
$loader = new YamlFileLoader($container, $fileLocator);
$loader->load('services.yml');
$container->compile();

/*
 * Create ServerRequest instance.
 */
$serverRequest = $container->get(\MyTests\ServerRequest::class);

composer.json

{
    "require": {
        "php": ">=5.5.0",
        "symfony/dependency-injection": "^4.0",
        "symfony/config": "^4.0",
        "symfony/yaml": "^4.0"
    },
    "require-dev": {
        "symfony/console": "^4.0",
        "symfony/event-dispatcher": "^4.0",
        "symfony/process": "^4.0",
        "symfony/lock": "^4.0",
        "symfony/debug": "^4.0",
        "symfony/var-dumper": "^4.0"
    },
    "autoload": {
        "psr-4": {
            "MyTests\\": "mytests/"
        }
    }
}

【问题讨论】:

  • 您可以检查您的构造函数,如果 serverParams 为空,则将其设置为 $_SERVER。尽管让您的 ServerRequest 类本身不受全局变量的影响,但创建一个服务器请求工厂可能会更好。看看那里的许多 psr-7 库中的一些示例,甚至是 Symfony 请求/响应对象。
  • 感谢您的建议,@Cerad!这是一个很好的。不过,我已经按照您的建议实施了它。我只是试图在我的问题中简化我的例子。我的工厂收到一个可选的$serverParams 数组(至少),如果它是空的,则分配$_SERVER。然后将其作为参数传递给工厂方法。但我发现这个任务很有趣,所以我不得不尝试一下。虽然没有运气。因此,我发布了一个问题...再次感谢 ;-)

标签: php symfony dependency-injection constructor yaml


【解决方案1】:

您不能在 symfony 中使用 php 超级全局变量,因为它会使您的代码不可测试。

您应该将环境变量传递给 parameters.yml 并在需要的地方使用它。

https://symfony.com/doc/current/configuration/external_parameters.html

https://symfony.com/doc/current/configuration.html

如果您需要用户请求中的一些数据,您应该获取请求堆栈服务或使用 symfony 表达式,如以下答案:

How do I get the user IP address in Symfony2 controller?

【讨论】:

  • 非常感谢,阿尔伯特!
猜你喜欢
  • 1970-01-01
  • 2015-08-02
  • 2016-07-19
  • 1970-01-01
  • 2011-06-28
  • 2011-09-04
  • 1970-01-01
  • 2016-03-22
相关资源
最近更新 更多