예제 #1
0
 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;
 }
예제 #2
0
 /**
  * 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;
 }