diff --git a/src/PHPUnit/DepsProviderTrait.php b/src/PHPUnit/DepsProviderTrait.php new file mode 100644 index 0000000..db3d2f3 --- /dev/null +++ b/src/PHPUnit/DepsProviderTrait.php @@ -0,0 +1,61 @@ + + * + * @before + */ + public function resolveAnnotationDepsProvider(): void { + ['class' => $classAnnotations, 'method' => $methodAnnotations] = $this->getAnnotations(); + + if ($this->depsProviderClass) { + $this->depsProviderClass = false; + + if ($classProviders = $classAnnotations['depsProvider'] ?? null) { + foreach ($classProviders as $classProvider) { + $this->callDepsProvider($classProvider); + } + } + } + + if ($methodProviders = $methodAnnotations['depsProvider'] ?? null) { + foreach ($methodProviders as $methodProvider) { + $this->callDepsProvider($methodProvider); + } + } + } + + /** + * Resolves and calls given deps provider + * + * @param string $provider method to call + * + * @return void + */ + private function callDepsProvider(string $provider): void { + $method = \get_class($this) . '::' . $provider; + + try { + $this->$provider(...$this->getServiceContainer()->resolve([$this, $provider])); + } catch (\TypeError $error) { + if (!method_exists($this, $provider)) { + throw new \InvalidArgumentException('Method ' . $method . ' does not exists'); + } + + $reflection = new \ReflectionMethod($this, $provider); + if (!$reflection->isPublic()) { + throw new \InvalidArgumentException('Method ' . $method . ' must be public'); + } + + throw $error; + } + } +} diff --git a/src/PHPUnit/ServiceContainerDataProviderTrait.php b/src/PHPUnit/ServiceContainerDataProviderTrait.php new file mode 100644 index 0000000..b555035 --- /dev/null +++ b/src/PHPUnit/ServiceContainerDataProviderTrait.php @@ -0,0 +1,17 @@ +getServiceContainer()->resolve([$this, $method])]; + } +} diff --git a/src/PHPUnit/ServiceContainerProviderTrait.php b/src/PHPUnit/ServiceContainerProviderTrait.php new file mode 100644 index 0000000..def19a2 --- /dev/null +++ b/src/PHPUnit/ServiceContainerProviderTrait.php @@ -0,0 +1,16 @@ +getServiceContainer()->resolve([$this, $method])]; - } - - /** - * Resolve class's annotation @depsProvider - * - * @before - */ - public function resolveAnnotationDepsProvider(): void { - ['class' => $classAnnotations, 'method' => $methodAnnotations] = $this->getAnnotations(); - - if ($this->depsProviderClass) { - $this->depsProviderClass = false; - - if ($classProviders = $classAnnotations['depsProvider'] ?? null) { - foreach ($classProviders as $classProvider) { - $this->callDepsProvider($classProvider); - } - } - } - - if ($methodProviders = $methodAnnotations['depsProvider'] ?? null) { - foreach ($methodProviders as $methodProvider) { - $this->callDepsProvider($methodProvider); - } - } - } - - /** - * Resolves and calls given deps provider - * - * @param string $provider method to call - * - * @return void - */ - private function callDepsProvider(string $provider): void { - $method = \get_class($this) . '::' . $provider; - - try { - $this->$provider(...$this->getServiceContainer()->resolve([$this, $provider])); - } catch (\TypeError $error) { - if (!method_exists($this, $provider)) { - throw new \InvalidArgumentException('Method ' . $method . ' does not exists'); - } - - $reflection = new \ReflectionMethod($this, $provider); - if (!$reflection->isPublic()) { - throw new \InvalidArgumentException('Method ' . $method . ' must be public'); - } - - throw $error; - } -} - - /** - * Returns instance of your service container - * - * @return ServiceContainer - */ - abstract protected static function getServiceContainer(): ServiceContainer; + use DepsProviderTrait; + use ServiceContainerDataProviderTrait; }