我在 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/