![](/img/trans.png)
[英]Laravel How to register a ServiceProvider within other ServiceProvider
[英]Pimple's ServiceProvider not getting options on register
我已經通過Pimple與Silex及其依賴項處理機制進行了大量合作。 我試圖擴展整個依賴注入,以便能夠通過Pimple的容器(Dependency Inversion)解析類和/或實例。
我意識到那里有圖書館可以使我實現這一目標,但是如果不重新發明輪子或沿這些路線的東西,有什么更好的學習方法呢?
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代碼庫,以了解默認服務提供商如何處理選項,但似乎我遺漏了一些東西。 有人可以指出我可能會錯過的正確方向嗎?
因此,當我回到家時,我花了一些時間試圖弄清楚為什么我的服務提供商無法在注冊它們時注入傳遞的參數。
$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;
}
這為我工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.