* @see ServiceProvider::provides() */ protected $provides = []; /** * Get the container. * * This method's actual return type and documented return type differ * because PHP 7.2 doesn't support return type narrowing. * * @return \Cake\Core\ContainerInterface */ public function getContainer(): DefinitionContainerInterface { $container = parent::getContainer(); if (!($container instanceof ContainerInterface)) { $message = sprintf( 'Unexpected container type. Expected `%s` got `%s` instead.', ContainerInterface::class, getTypeName($container) ); throw new RuntimeException($message); } return $container; } /** * Delegate to the bootstrap() method * * This method wraps the league/container function so users * only need to use the CakePHP bootstrap() interface. * * @return void */ public function boot(): void { $this->bootstrap($this->getContainer()); } /** * Bootstrap hook for ServiceProviders * * This hook should be implemented if your service provider * needs to register additional service providers, load configuration * files or do any other work when the service provider is added to the * container. * * @param \Cake\Core\ContainerInterface $container The container to add services to. * @return void */ public function bootstrap(ContainerInterface $container): void { } /** * Call the abstract services() method. * * This method primarily exists as a shim between the interface * that league/container has and the one we want to offer in CakePHP. * * @return void */ public function register(): void { $this->services($this->getContainer()); } /** * The provides method is a way to let the container know that a service * is provided by this service provider. * * Every service that is registered via this service provider must have an * alias added to this array or it will be ignored. * * @param string $id Identifier. * @return bool */ public function provides(string $id): bool { return in_array($id, $this->provides, true); } /** * Register the services in a provider. * * All services registered in this method should also be included in the $provides * property so that services can be located. * * @param \Cake\Core\ContainerInterface $container The container to add services to. * @return void */ abstract public function services(ContainerInterface $container): void; }