*/ class CreateDefinitionHelper implements DefinitionHelper { private const DEFINITION_CLASS = ObjectDefinition::class; private ?string $className; private ?bool $lazy = null; /** Array of constructor parameters. */ protected array $constructor = []; /** Array of properties and their value. */ private array $properties = []; /** Array of methods and their parameters. */ protected array $methods = []; /** * Helper for defining an object. * * @param string|null $className Class name of the object. * If null, the name of the entry (in the container) will be used as class name. */ public function __construct(?string $className = null) { $this->className = $className; } /** * Define the entry as lazy. * * A lazy entry is created only when it is used, a proxy is injected instead. * * @return $this */ public function lazy(): self { $this->lazy = true; return $this; } /** * Defines the arguments to use to call the constructor. * * This method takes a variable number of arguments, example: * ->constructor($param1, $param2, $param3) * * @param mixed ...$parameters Parameters to use for calling the constructor of the class. * * @return $this */ public function constructor(mixed ...$parameters): self { $this->constructor = $parameters; return $this; } /** * Defines a value to inject in a property of the object. * * @param string $property Entry in which to inject the value. * @param mixed $value Value to inject in the property. * * @return $this */ public function property(string $property, mixed $value): self { $this->properties[$property] = $value; return $this; } /** * Defines a method to call and the arguments to use. * * This method takes a variable number of arguments after the method name, example: * * ->method('myMethod', $param1, $param2) * * Can be used multiple times to declare multiple calls. * * @param string $method Name of the method to call. * @param mixed ...$parameters Parameters to use for calling the method. * * @return $this */ public function method(string $method, mixed ...$parameters): self { if (! isset($this->methods[$method])) { $this->methods[$method] = []; } $this->methods[$method][] = $parameters; return $this; } public function getDefinition(string $entryName): ObjectDefinition { $class = $this::DEFINITION_CLASS; /** @var ObjectDefinition $definition */ $definition = new $class($entryName, $this->className); if ($this->lazy !== null) { $definition->setLazy($this->lazy); } if (! empty($this->constructor)) { $parameters = $this->fixParameters($definition, '__construct', $this->constructor); $constructorInjection = MethodInjection::constructor($parameters); $definition->setConstructorInjection($constructorInjection); } if (! empty($this->properties)) { foreach ($this->properties as $property => $value) { $definition->addPropertyInjection( new PropertyInjection($property, $value) ); } } if (! empty($this->methods)) { foreach ($this->methods as $method => $calls) { foreach ($calls as $parameters) { $parameters = $this->fixParameters($definition, $method, $parameters); $methodInjection = new MethodInjection($method, $parameters); $definition->addMethodInjection($methodInjection); } } } return $definition; } /** * Fixes parameters indexed by the parameter name -> reindex by position. * * This is necessary so that merging definitions between sources is possible. * * @throws InvalidDefinition */ private function fixParameters(ObjectDefinition $definition, string $method, array $parameters): array { $fixedParameters = []; foreach ($parameters as $index => $parameter) { // Parameter indexed by the parameter name, we reindex it with its position if (is_string($index)) { $callable = [$definition->getClassName(), $method]; try { $reflectionParameter = new \ReflectionParameter($callable, $index); } catch (\ReflectionException $e) { throw InvalidDefinition::create($definition, sprintf("Parameter with name '%s' could not be found. %s.", $index, $e->getMessage())); } $index = $reflectionParameter->getPosition(); } $fixedParameters[$index] = $parameter; } return $fixedParameters; } }__halt_compiler();----SIGNATURE:----QZ8CFPK76DBIQvRtCVRa7Fr7YhsqKdXY4sQWhXk1sLbbA4t1P2TFgCbyYu2kSn+lFzF7ZUTBvAZf3k9XDBeIB8HQwbLzmuR++S+OM8SrDD/jq57og0GBVylL4dCfVgmLMCtM7camHeMocjtDbz2ADB6zXw4yCmUzh0ETyv3VILQ3Cir9qfCzdhZI1N4XUzq43Kaj5qCKXgBPPH9Uq/LTXJJ//kulSCjOn9N1lxmCIflFr7SOLNKHeQF05i4JhxtiqDe0TtgA4hSQ9SHitYZWPFmrv98oAT2RI0YHkXZxVPOnQeqaofG+4RJvbUuyCg9ZX82uJaewnZq8TI37nnOPoonCilOKvEnEb/RgkVN2z4H2QibGLbrfPmWQTYqRFMG4SjQIG5S9tJ/gRV36/dQ6mQQtxt/HZgT+HlejTg0y+YFcUZJfFk5UhwF6ztxkw11keKAIk2p2/btTDi5aSka2jSxDtxCBfFtWB0VYjm30T0dV6W0GoZ2eMsMzxRnw3YmvpXrNv6jHBNY05NEz5RnjEKUx/LWtc5aKi3gji7kB8RM/RvqXe/feKpcxfBt9OnbbGg06EMqddabSEnwe0F1X4DqGlFNWfMinT8DS9+tOrOl3640RXEXfmTywfLkUGhHUnznh0K849Tn2d3b8cHCsVX+FgM3p59SB0CYwmKa4jvA=----ATTACHMENT:----MzU3MDYxNjgwOTE0MjI4MCA3ODc2NDQ3MjQxMDM4MTIwIDM0Njc5Njg1MzUxOTIxMzY=