我已经通过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方法中创建了setUp实例,并发现这可能是一个问题,尽管我知道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代码库,以了解默认服务提供者如何处理选项,但我似乎遗漏了一些东西。有人能为我指出正确的方向吗?
发布于 2016-11-22 08:11:43
因此,当我回到家时,我花了一些时间试图弄清楚为什么我的服务提供者在注册时不能让我的服务提供者注入传递的参数。
$container-register(new \MyWorkSpace\ServiceProvider\SampleServiceProvider(), ['key' => 'val']);之后,当我访问容器时,我应该能够查询容器中的密钥标识符。
下面是Pimple如何在其容器中定义寄存器方法。
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;
}这对我来说很管用。
https://stackoverflow.com/questions/40722716
复制相似问题