Beispiel #1
0
 /**
  * Register a 'can([Execute])' function into the template
  *
  * @param CommandInterface $context
  * @return void
  */
 protected function _beforeRender(CommandInterface $context)
 {
     $controller = $context->getSubject();
     if ($controller->getView() instanceof ViewTemplatable) {
         $controller->getView()->getTemplate()->registerFunction('can', array($this => 'canExecute'));
     }
 }
Beispiel #2
0
 /**
  * Command handler
  *
  * @param CommandInterface         $command    The command
  * @param CommandChainInterface    $chain      The chain executing the command
  * @return mixed|null If a handler breaks, returns the break condition. NULL otherwise.
  */
 public function execute(CommandInterface $command, CommandChainInterface $chain)
 {
     $type = '';
     $package = '';
     $subject = '';
     if ($command->getSubject()) {
         $identifier = $command->getSubject()->getIdentifier()->toArray();
         $package = $identifier['package'];
         if ($identifier['path']) {
             $type = array_shift($identifier['path']);
             $subject = $identifier['name'];
         } else {
             $type = $identifier['name'];
         }
     }
     $parts = explode('.', $command->getName());
     $when = array_shift($parts);
     // Before or After
     $name = StringInflector::implode($parts);
     // Action
     // Create Specific and Generic event names
     $event_specific = 'on' . ucfirst($when) . ucfirst($package) . ucfirst($subject) . ucfirst($type) . $name;
     $event_generic = 'on' . ucfirst($when) . ucfirst($type) . $name;
     // Clone the context
     if ($this->isEventImmutable()) {
         $event = clone $command;
     } else {
         $event = $command;
     }
     // Create event object to check for propagation
     $event = $this->getEventPublisher()->publishEvent($event_specific, $event->getAttributes(), $event->getSubject());
     // Ensure event can be propagated and event name is different
     if ($event->canPropagate() && $event_specific != $event_generic) {
         $event->setName($event_generic);
         $this->getEventPublisher()->publishEvent($event);
     }
 }