【问题标题】:Behat+symfony2 access container parameters set in custom extensionBehat+symfony2 访问自定义扩展中设置的容器参数
【发布时间】:2013-02-15 20:48:14
【问题描述】:

(我将解释情况,以防有人知道更好的方法来帮助我想做的事情)。

使用 Symfony2 + Behat + Symfony2Extension + Mink +

我们有一个应用程序,其中包含多个将在场景中访问的 URL。

我知道您使用从 FeatureContext __construct 方法发送的参数,但我要做的是在 behat.yml 文件中设置 url,以便我们可以在自定义上下文中使用它们来访问网址。

看看扩展是如何工作的,我设置了依赖注入如下:

class Extension implements ExtensionInterface
{

    /**
     * Loads a specific configuration.
     *
     * @param array            $config    Extension configuration hash (from behat.yml)
     * @param ContainerBuilder $container ContainerBuilder instance
     */
    public function load(array $config, ContainerBuilder $container)
    {
        $container->setParameter('url_one', $config['url_one']);
        $container->setParameter('url_two', $config['url_two']);

    }

    /**
     * Setups configuration for current extension.
     *
     * @param ArrayNodeDefinition $builder
     */
    public function getConfig(ArrayNodeDefinition $builder)
    {
        $builder->
            children()->
                scalarNode('one_url')->
                isRequired()->
                end()->
                scalarNode('two_url')->
                isRequired()->
                end()->
            end();
    }  
 code continues....

我的 behat.yml 看起来像这样:

default:
    extensions:
        Behat\MinkExtension\Extension:
            goutte: ~
            selenium2: ~
        Behat\Symfony2Extension\Extension: ~
        Acme\AcmeExtension\Extension:
            url_one: 'http://example1.com'
            url_two: 'http:/example2.com'

现在在我的 FeatureContext.php 类中,我想做以下事情:

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

但这不起作用,它从我的 Symfony2 应用程序返回参数,这是预期的,因为我启用了 symfony2extension。但是我无法从扩展类访问参数或服务。

(请注意,如果我在加载方法中的Extension类中,并且我调用了我刚刚设置的参数,它会返回它,所以我知道它已设置,但它必须设置为不同的容器?)

首先这可能吗?如果是这样,我应该怎么做才能让它发挥作用。

非常感谢您的帮助。

【问题讨论】:

    标签: symfony dependency-injection symfony-2.1 behat mink


    【解决方案1】:

    显然,$kernel->getContainer() 会返回 Symfony2 应用内核的容器。这些内核和容器不与 Behat 共享。 Behat 有自己的容器实例,用于管理自己的服务。这意味着扩展正在 Behat 容器内设置参数,但您正在尝试访问您的 app 内核容器。这就是为什么你有不同的结果。

    现在,问题是,如何将扩展中的一些值传递给上下文类。答案是上下文初始化器。签出:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-08
      • 1970-01-01
      • 2012-11-08
      • 2019-08-24
      • 1970-01-01
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      相关资源
      最近更新 更多