php - Symfony2 和 PHPUnit - 访问 getContainer()

标签 php symfony authentication parameters phpunit

我在 Symfony2 上进行 PHPUnit 测试时遇到问题。为了连接到我的应用程序,我使用了 Web 服务,因此我创建了一个 UserProvider。在我的函数 loadUserByUsername 中,我使用保存在 app/config/parameters.yml 中的 Symfony2 参数。由于我不在 Controller 中,我需要使用全局变量 $kernel 并获取如下参数:

global $kernel;

$url = $kernel->getContainer()-getParameter('myparam');

当我使用我的应用程序时,它可以工作,但是当我像这样编写测试时:

$crawler = $client->request('GET', '/login');
$form = $crawler->selectButton('submit')->form();
$form['_username'] = $username;
$form['_password'] = $pass;

并执行 PHPUnit 我收到此错误:

Fatal error : Call to a member function getContainer()

执行 PHPUnit 时如何访问 Symfony2 参数或使用 getContainer

最佳答案

在 Symfony 文档中 How to Create a custom UserProvider ,在“为用户提供商创建服务”下指出:

The real implementation of the user provider will probably have some dependencies or configuration options or other services. Add these as arguments in the service definition.

因此,您应该通过将相关参数定义为服务定义中的参数,将相关参数传递到用户提供程序服务中,而不是使用全局 $kernel 变量。例如:

services:
    webservice_user_provider:
        class: Acme\WebserviceUserBundle\Security\User\WebserviceUserProvider
        arguments: [%parameter_one%, %parameter_two%, ...]

与任何服务一样,您的用户提供程序服务类必须有一个构造函数,该构造函数接受与服务定义中的参数相对应的参数,并将它们存储在私有(private)变量中,以便在服务的方法中使用:

class WebserviceUserProvider implements UserProviderInterface
{
    private parameterOne;
    ...

    public function __construct($parameterOne, ...)
    {
        $this->parameterOne = $parameterOne;
        ...
    }
    ...
}

我编写 Symfony 应用程序已经四年了,我从来不需要使用全局 $kernel 变量。我敢说可能存在有效的情况,但总的来说我会说这是应该避免的。

关于php - Symfony2 和 PHPUnit - 访问 getContainer(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30919928/

相关文章:

php - SOAP 服务器未获取所有参数

php - 表单生成器中的symfony实体文本输入?

php - Symfony2 无法在错误页面中生成 url

c# - 防止显示 Windows 安全窗口

php - mysql 多表外键? - 初学者

Symfony2 : How to get form validation errors after binding the request to the form

php - Symfony 3 - 无法加载类型表单类型

authentication - Laravel - 注销特定用户

mongodb - 无法使用 Mongo Shell 连接到 MongoDB Atlas 集群

php - 使用复选框不起作用删除多个 mysql 行