data = $data; } /** * Bind an interface to an implementation. * * @param string $key An interface or interface with a parameter name (`Interface $name`). * @param string $implementationClassName An implementation class name. */ public function bindImplementation(string $key, string $implementationClassName): self { $this->validateBindingKey($key); $this->data->addGlobal( $key, Binding::createFromImplementationClassName($implementationClassName) ); return $this; } /** * Bind an interface to a specific service. * * @param string $key An interface or interface with a parameter name (`Interface $name`). * @param string $serviceName A service name. */ public function bindService(string $key, string $serviceName): self { $this->validateBindingKey($key); $this->data->addGlobal( $key, Binding::createFromServiceName($serviceName) ); return $this; } /** * Bind an interface to a callback. * * @param string $key An interface or interface with a parameter name (`Interface $name`). * @param callable $callback A callback that will resolve a dependency. */ public function bindCallback(string $key, callable $callback): self { $this->validateBindingKey($key); $this->data->addGlobal( $key, Binding::createFromCallback($callback) ); return $this; } /** * Bind an interface to a specific instance. * * @param string $key An interface or interface with a parameter name (`Interface $name`). * @param object $instance An instance. */ public function bindInstance(string $key, object $instance): self { $this->validateBindingKey($key); $this->data->addGlobal( $key, Binding::createFromValue($instance) ); return $this; } /** * Bind an interface to a factory. * * @param string $key An interface or interface with a parameter name (`Interface $name`). * @param string $factoryClassName A factory class name. */ public function bindFactory(string $key, string $factoryClassName): self { $this->validateBindingKey($key); $this->data->addGlobal( $key, Binding::createFromFactoryClassName($factoryClassName) ); return $this; } /** * Creates a contextual binder and pass it as an argument of a callback. * * @param string $className A context. * @param Closure(ContextualBinder): void $callback A callback with a `ContextualBinder` argument. */ public function inContext(string $className, Closure $callback): self { $contextualBinder = new ContextualBinder($this->data, $className); $callback($contextualBinder); return $this; } /** * Creates a contextual binder. * * @param string $className A context. */ public function for(string $className): ContextualBinder { return new ContextualBinder($this->data, $className); } private function validateBindingKey(string $key): void { if (!$key) { throw new LogicException("Bad binding."); } if ($key[0] === '$') { throw new LogicException("Can't binding a parameter name w/o an interface globally."); } } }