首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pimple的ServiceProvider没有在寄存器上获得选项

Pimple的ServiceProvider没有在寄存器上获得选项
EN

Stack Overflow用户
提问于 2016-11-21 14:39:06
回答 1查看 200关注 0票数 0

我已经通过Pimple使用了相当多的Silex及其依赖处理机制。我试图扩展整个依赖项注入,以便能够通过Pimple的容器(依赖反转)解析类和/或实例。

我意识到有一些库可以让我做到这一点,但是如果不是重新发明轮子或类似的东西,还有什么更好的方法来学习呢?

代码语言:javascript
复制
namespace Agnostic\DependencyInversion\Provider;

use Pimple\ServiceProviderInterface;
use Pimple\Container;

class ContainerBindingsServiceProvider implements ServiceProviderInterface
{
    public function register(Container $container)
    {
        if( !isset($container['context.bindings']) ){
            throw new \Exception("Missing bindings for the Application Context.");
        }
    }
}

在我的测试文件中,到目前为止,我有两个方法,第一个测试是在正在检查的值不可用时是否抛出异常。

这与试图解析尚未注册的标识符时引发的异常相同。

代码语言:javascript
复制
namespace Agnostic\Test\ServiceProviderTestSuite;

use Agnostic\DependencyInversion\Provider\ContainerBindingsServiceProvider;
use Pimple\Container;

class ContainerBindingsServiceProviderTest extends \PHPUnit_Framework_TestCase
{
    public function testItThrowsExceptionIfNoBindingsSet()
    {
        try{

            $container = new Container();

            $container->register(new ContainerBindingsServiceProvider());

        }catch(\Exception $exc){

            $this->assertEquals($exc->getMessage(), "Missing bindings for the Application Context.");

            return;

        }

        $this->fail("Expected Exception has not been raised.");
    }

    public function testItContainesBindings()
    {
        $container = new Container();


        $container->register(new ContainerBindingsServiceProvider(), array('context.bindings' => (function(){
                    return include APP_DIR .'/config/bindings.php';
                })())
            );
    }
}

最初,我在我的测试类的setUp方法中创建了setUp实例,并发现这可能是一个问题,尽管我知道PHPUnit会重新初始化每个测试方法的所有内容。

根据下面的测试结果,我想知道我做错了什么。

代码语言:javascript
复制
PHPUnit 5.6.4 by Sebastian Bergmann and contributors.

Runtime:       PHP 7.0.0
Configuration: C:\Users\luyandasiko\Documents\spikes\dependency-inversion\phpunit.xml

.E                                                                 2 / 2 (100%)

Time: 42 ms, Memory: 4.00MB

There was 1 error:

1)   Agnostic\Test\ServiceProviderTestSuite\ContainerBindingsServiceProviderTest::testItContainesBindings
Exception: Missing bindings for the Application Context.

C:\Users\luyandasiko\Documents\spikes\dependency-inversion\src\Provider\ContainerBindingsServiceProvider.php:13
C:\Users\luyandasiko\Documents\spikes\dependency-inversion\vendor\pimple\pimple\src\Pimple\Container.php:274
C:\Users\luyandasiko\Documents\spikes\dependency-inversion\dev\Test\ServiceProviderTestSuite\ContainerBindingsServiceProviderTest.php:35

ERRORS!
Tests: 2, Assertions: 1, Errors: 1.

我的第二个测试函数上的行(参见下面的代码)只是返回在我的配置中定义的数组,没有什么特殊的,因此这个数组可以手动组成--与我这样做无关,但无法通过它。

代码语言:javascript
复制
(function(){
    return include APP_DIR .'/config/bindings.php';
})()

我已经查看了Siliex代码库,以了解默认服务提供者如何处理选项,但我似乎遗漏了一些东西。有人能为我指出正确的方向吗?

EN

回答 1

Stack Overflow用户

发布于 2016-11-22 08:11:43

因此,当我回到家时,我花了一些时间试图弄清楚为什么我的服务提供者在注册时不能让我的服务提供者注入传递的参数。

代码语言:javascript
复制
 $container-register(new \MyWorkSpace\ServiceProvider\SampleServiceProvider(), ['key' => 'val']);

之后,当我访问容器时,我应该能够查询容器中的密钥标识符。

下面是Pimple如何在其容器中定义寄存器方法。

代码语言:javascript
复制
public function register(ServiceProviderInterface $provider, array $values = array())
{
    $provider->register($this);

    foreach ($values as $key => $value) {
        $this[$key] = $value;
    }

    return $this;
}

我在测试断言时所做的是将上面的代码清单更改为:

代码语言:javascript
复制
public function register(ServiceProviderInterface $provider, array $values = array())
{


    foreach ($values as $key => $value) {
        $this[$key] = $value;
    }

    $provider->register($this);

    return $this;
}

这对我来说很管用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40722716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档