diff --git a/src/DI/ConsoleExtension.php b/src/DI/ConsoleExtension.php index 8c568d5..d4093e8 100644 --- a/src/DI/ConsoleExtension.php +++ b/src/DI/ConsoleExtension.php @@ -4,13 +4,13 @@ use Contributte\Console\Application; use Contributte\Console\CommandLoader\ContainerCommandLoader; +use Contributte\Console\Http\ConsoleRequestFactory; use Nette\DI\CompilerExtension; use Nette\DI\Definitions\ServiceDefinition; use Nette\DI\Definitions\Statement; use Nette\DI\MissingServiceException; use Nette\DI\ServiceCreationException; -use Nette\Http\Request; -use Nette\Http\UrlScript; +use Nette\Http\RequestFactory; use Nette\Schema\Expect; use Nette\Schema\Schema; use stdClass; @@ -125,10 +125,17 @@ public function beforeCompile(): void $applicationDef = $builder->getDefinition($this->prefix('application')); // Setup URL for CLI - if ($config->url !== null && $builder->hasDefinition('http.request')) { - /** @var ServiceDefinition $httpDef */ - $httpDef = $builder->getDefinition('http.request'); - $httpDef->setFactory(Request::class, [new Statement(UrlScript::class, [$config->url])]); + if ($config->url !== null && $builder->hasDefinition('http.requestFactory')) { + $httpDef = $builder->getDefinition('http.requestFactory'); + assert($httpDef instanceof ServiceDefinition); + $factoryEntity = $httpDef->getFactory()->getEntity(); + if ($factoryEntity === RequestFactory::class) { + $httpDef->setFactory(ConsoleRequestFactory::class, [$config->url]); + } else { + throw new ServiceCreationException( + 'Custom http.requestFactory is used, argument console.url should be removed.' + ); + } } // Add all commands to map for command loader diff --git a/src/Http/ConsoleRequestFactory.php b/src/Http/ConsoleRequestFactory.php new file mode 100644 index 0000000..31c70ed --- /dev/null +++ b/src/Http/ConsoleRequestFactory.php @@ -0,0 +1,29 @@ +url = $url; + } + + public function fromGlobals(): Request + { + return new Request(new UrlScript($this->url)); + } + + public function createHttpRequest(): Request + { + return $this->fromGlobals(); + } + +} diff --git a/tests/cases/DI/ConsoleExtension.phpt b/tests/cases/DI/ConsoleExtension.phpt index 0f594b0..aa19ccd 100644 --- a/tests/cases/DI/ConsoleExtension.phpt +++ b/tests/cases/DI/ConsoleExtension.phpt @@ -15,6 +15,7 @@ use Symfony\Component\Console\Command\Command; use Tester\Assert; use Tester\FileMock; use Tests\Fixtures\FooCommand; +use Tests\Fixtures\FooRequestFactory; require_once __DIR__ . '/../../bootstrap.php'; @@ -52,7 +53,7 @@ Toolkit::test(function (): void { Assert::type(FooCommand::class, $container->getByType(Command::class)); }); -// Provide URL +// Provide URL using default request factory Toolkit::test(function (): void { $loader = new ContainerLoader(Environment::getTestDir(), true); $class = $loader->load(function (Compiler $compiler): void { @@ -209,3 +210,39 @@ Toolkit::test(function (): void { $application = $container->getByType(Application::class); Assert::equal('Hello world', $application->getName()); }); + +// Use custom request Factory +Toolkit::test(function (): void { + $loader = new ContainerLoader(Environment::getTestDir(), true); + $class = $loader->load(function (Compiler $compiler): void { + $compiler->addExtension('console', new ConsoleExtension(true)); + $compiler->addExtension('http', new HttpExtension(true)); + $compiler->loadConfig(FileMock::create(' + services: + http.requestFactory: Tests\Fixtures\FooRequestFactory + ', 'neon')); + }, [getmypid(), 11]); + + /** @var Container $container */ + $container = new $class(); + + Assert::equal(FooRequestFactory::CUSTOM_URL, (string) $container->getService('http.request')->getUrl()); +}); + +// Throw error on custom factory and console.url set +Toolkit::test(function (): void { + Assert::exception(function (): void { + $loader = new ContainerLoader(Environment::getTestDir(), true); + $class = $loader->load(function (Compiler $compiler): void { + $compiler->addExtension('console', new ConsoleExtension(true)); + $compiler->addExtension('http', new HttpExtension(true)); + $compiler->loadConfig(FileMock::create(' + services: + http.requestFactory: Tests\Fixtures\FooRequestFactory + console: + url: https://contributte.org/ + ', 'neon')); + }, [getmypid(), 12]); + new $class(); + }, ServiceCreationException::class, 'Custom http.requestFactory is used, argument console.url should be removed.'); +}); diff --git a/tests/fixtures/FooRequestFactory.php b/tests/fixtures/FooRequestFactory.php new file mode 100644 index 0000000..c56e8b7 --- /dev/null +++ b/tests/fixtures/FooRequestFactory.php @@ -0,0 +1,24 @@ +fromGlobals(); + } + +}