public function create(ProviderModel $provider) { $eventDispatcher = $this->getEventDispatcher(); $event = new CreateProviderEvent($provider); $eventDispatcher->dispatch(EVENT_XNAVIGATION_CREATE_PROVIDER, $event); if ($event->getProvider()) { return $event->getProvider(); } $row = $provider->row(); $type = $provider->type; $className = $this->getProviderClassName($type); $class = new \ReflectionClass($className); $subscriber = $class->newInstance(); $rgxp = '~^' . preg_quote($type, '~') . '_(.*)$~'; foreach ($row as $key => $value) { if ($value && preg_match($rgxp, $key, $matches)) { $property = $matches[1]; $property = explode('_', $property); $property = array_map('ucfirst', $property); $property = implode('', $property); $setterName = 'set' . $property; if ($class->hasMethod($setterName)) { $setter = $class->getMethod($setterName); $setter->invoke($subscriber, $value); } } } return $subscriber; }
/** * Create a local event dispatcher and fill with all providers. * * @param MenuModel $menu * @param ProviderFactory $providerFactory * * @return EventDispatcher */ protected function createLocalEventDispatcher(MenuModel $menu, ProviderFactory $providerFactory) { $eventDispatcher = new EventDispatcher(); $providerIds = deserialize($menu->provider, true); $providers = ProviderModel::findMultipleByIds($providerIds); if ($providers) { foreach ($providers as $provider) { $subscriber = $providerFactory->create($provider); $eventDispatcher->addSubscriber($subscriber); } } return $eventDispatcher; }