Pimple的ServiceProvider无法获得注册

时间:2016-11-21 14:39:06

标签: php pimple

我通过Pimple与Silex及其依赖处理机制进行了大量合作。我试图扩展整个依赖注入事物,以便能够通过Pimple的容器(依赖性反转)来解析类和/或实例。

我意识到那里有图书馆可以让我实现这个目标,但如果不重新发明轮子或其他东西,那么学习更好的方法是什么?

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.");
        }
    }
}

在我的测试文件中,我有两个方法,首先测试当正在检查的值不可用时是否抛出异常。

  

这与尝试时抛出的异常相同   解析尚未注册的标识符。

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方法中创建了Container实例,并且发现这可能是一个问题,即使我知道PHPUnit重新初始化每个测试方法的所有内容。

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

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.

我的第二个测试函数的行(参见下面的代码)只返回我的配置中定义的数组没什么特别的,因此可以手动编写数组,因为我这样做但无法通过此

(function(){
    return include APP_DIR .'/config/bindings.php';
})()

我查看了Siliex代码库,看看默认服务提供商如何处理选项,但似乎我遗漏了一些东西。有人能指出我可能会错过的正确方向吗?

1 个答案:

答案 0 :(得分:0)

所以当我回到家时,我花了一些时间试图找出为什么我的服务提供商在注册时无法注入传递的参数。

 $container-register(new \MyWorkSpace\ServiceProvider\SampleServiceProvider(), ['key' => 'val']);

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

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

public function register(ServiceProviderInterface $provider, array $values = array())
{
    $provider->register($this);

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

    return $this;
}

我测试断言的方法是将上面的代码列表更改为:

public function register(ServiceProviderInterface $provider, array $values = array())
{


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

    $provider->register($this);

    return $this;
}

这对我有用。