| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- <?php
- declare(strict_types=1);
- /**
- * This file is part of Hyperf.
- *
- * @link https://www.hyperf.io
- * @document https://hyperf.wiki
- * @contact group@hyperf.io
- * @license https://github.com/hyperf/hyperf/blob/master/LICENSE
- */
- namespace Hyperf\Di\Aop;
- use Closure;
- use Hyperf\Di\Annotation\AnnotationCollector;
- use Hyperf\Di\Exception\Exception;
- use Hyperf\Di\ReflectionManager;
- use ReflectionFunction;
- use ReflectionMethod;
- class ProceedingJoinPoint
- {
- public mixed $result;
- public ?Closure $pipe = null;
- public function __construct(
- public Closure $originalMethod,
- public string $className,
- public string $methodName,
- public array $arguments
- ) {
- }
- /**
- * Delegate to the next aspect.
- */
- public function process()
- {
- $closure = $this->pipe;
- if (! $closure instanceof Closure) {
- throw new Exception('The pipe is not instanceof \Closure');
- }
- return $closure($this);
- }
- /**
- * Process the original method, this method should trigger by pipeline.
- */
- public function processOriginalMethod()
- {
- $this->pipe = null;
- $closure = $this->originalMethod;
- $arguments = $this->getArguments();
- return $closure(...$arguments);
- }
- public function getAnnotationMetadata(): AnnotationMetadata
- {
- $metadata = AnnotationCollector::get($this->className);
- return new AnnotationMetadata($metadata['_c'] ?? [], $metadata['_m'][$this->methodName] ?? []);
- }
- public function getArguments(): array
- {
- $result = [];
- foreach ($this->arguments['order'] ?? [] as $order) {
- $result[] = $this->arguments['keys'][$order];
- }
- // Variable arguments are always placed at the end.
- if (isset($this->arguments['variadic'], $order) && $order === $this->arguments['variadic']) {
- $variadic = array_pop($result);
- $result = array_merge($result, $variadic);
- }
- return $result;
- }
- public function getReflectMethod(): ReflectionMethod
- {
- return ReflectionManager::reflectMethod(
- $this->className,
- $this->methodName
- );
- }
- public function getInstance(): ?object
- {
- $ref = new ReflectionFunction($this->originalMethod);
- return $ref->getClosureThis();
- }
- }
|