初始化遍历服务提供者注册服务

Testing Is Documentation

tests/Kernel/Bootstrap/TraverseProviderTest.php初始化遍历服务提供者注册服务 - 图1

QueryPHP 在内核执行过程中会执行初始化,分为 4 个步骤,载入配置、载入语言包、注册异常运行时和遍历服务提供者注册服务。

内核初始化,包括 \Leevel\Kernel\IKernel::bootstrap\Leevel\Kernel\IKernelConsole::bootstrap 均会执行上述 4 个步骤。

Uses

  1. <?php
  2. use Leevel\Di\Container;
  3. use Leevel\Di\IContainer;
  4. use Leevel\Di\Provider;
  5. use Leevel\Kernel\App as Apps;
  6. use Leevel\Kernel\Bootstrap\TraverseProvider;
  7. use Leevel\Kernel\IApp;

基本使用方法

fixture 定义

Tests\Kernel\Bootstrap\OptionTest

  1. namespace Tests\Kernel\Bootstrap;
  2. class OptionTest
  3. {
  4. public function get(string $name)
  5. {
  6. if (':deferred_providers' === $name) {
  7. return [
  8. [
  9. 'foo' => ProviderDeferTest1::class,
  10. ],
  11. [
  12. ProviderDeferTest1::class => [
  13. 'foo' => [
  14. ProviderDeferTest1::class,
  15. ],
  16. ],
  17. ],
  18. ];
  19. }
  20. if (':composer.providers' === $name) {
  21. return [ProviderTest3::class];
  22. }
  23. }
  24. }

Tests\Kernel\Bootstrap\ProviderDeferTest1

  1. namespace Tests\Kernel\Bootstrap;
  2. class ProviderDeferTest1 extends Provider
  3. {
  4. public function register(): void
  5. {
  6. $_SERVER['providerDeferTest1'] = 1;
  7. $this->container->singleton('foo', function (IContainer $container) {
  8. return 'bar';
  9. });
  10. }
  11. public static function providers(): array
  12. {
  13. return [
  14. 'foo' => [
  15. self::class,
  16. ],
  17. ];
  18. }
  19. public static function isDeferred(): bool
  20. {
  21. return true;
  22. }
  23. }

Tests\Kernel\Bootstrap\ProviderTest3

  1. namespace Tests\Kernel\Bootstrap;
  2. class ProviderTest3 extends Provider
  3. {
  4. public function __construct(IContainer $container)
  5. {
  6. }
  7. public function bootstrap(): void
  8. {
  9. $_SERVER['testRegisterProvidersBootstrap'] = 1;
  10. }
  11. public function register(): void
  12. {
  13. $_SERVER['testRegisterProvidersRegister'] = 1;
  14. }
  15. }
  1. public function testBaseUse(): void
  2. {
  3. $bootstrap = new TraverseProvider();
  4. $container = Container::singletons();
  5. $app = new App2($container, $appPath = __DIR__.'/app');
  6. $this->assertInstanceof(IContainer::class, $container);
  7. $this->assertInstanceof(Container::class, $container);
  8. $this->assertInstanceof(IApp::class, $app);
  9. $this->assertInstanceof(Apps::class, $app);
  10. $option = new OptionTest();
  11. $container->singleton('option', function () use ($option) {
  12. return $option;
  13. });
  14. $this->assertNull($bootstrap->handle($app));
  15. // for deferredAlias
  16. $this->assertArrayNotHasKey('providerDeferTest1', $_SERVER);
  17. $container->alias(ProviderDeferTest1::providers());
  18. $this->assertSame('bar', $container->make('foo'));
  19. $this->assertSame('bar', $container->make(ProviderDeferTest1::class));
  20. $this->assertSame(1, $_SERVER['providerDeferTest1']);
  21. // for providers
  22. $this->assertSame(1, $_SERVER['testRegisterProvidersRegister']);
  23. $this->assertSame(1, $_SERVER['testRegisterProvidersBootstrap']);
  24. $this->assertTrue($container->isBootstrap());
  25. unset(
  26. $_SERVER['providerDeferTest1'],
  27. $_SERVER['testRegisterProvidersRegister'],
  28. $_SERVER['testRegisterProvidersBootstrap']
  29. );
  30. }