Exemplo n.º 1
0
 /**
  * Gets the service object of the specified type.
  * @param  string service name
  * @param  array  options in case service is not singleton
  * @return mixed
  */
 public static function getService($name, array $options = NULL)
 {
     if (!is_string($name) || $name === '') {
         throw new InvalidArgumentException("Service name must be a non-empty string, " . gettype($name) . " given.");
     }
     $session = Environment::getSession('MokujiServiceLocator');
     $lower = strtolower($name);
     if (isset($session->{$lower})) {
         // instantiated singleton
         if ($options) {
             throw new InvalidArgumentException("Service named '{$name}' is singleton and therefore can not have options.");
         }
         return $session->{$lower};
     } elseif (isset($session->factories[$lower])) {
         list($factory, $singleton, $defOptions) = $session->factories[$lower];
         if ($singleton && $options) {
             throw new InvalidArgumentException("Service named '{$name}' is singleton and therefore can not have options.");
         } elseif ($defOptions) {
             $options = $options ? $options + $defOptions : $defOptions;
         }
         if (is_string($factory) && strpos($factory, ':') === FALSE) {
             // class name
             Framework::fixNamespace($factory);
             if (!class_exists($factory)) {
                 throw new AmbiguousServiceException("Cannot instantiate service '{$name}', class '{$factory}' not found.");
             }
             $service = new $factory();
             if ($options && method_exists($service, 'setOptions')) {
                 $service->setOptions($options);
                 // TODO: better!
             }
         } else {
             // factory callback
             $factory = callback($factory);
             if (!$factory->isCallable()) {
                 throw new InvalidStateException("Cannot instantiate service '{$name}', handler '{$factory}' is not callable.");
             }
             $service = $factory->invoke($options);
             if (!is_object($service)) {
                 throw new AmbiguousServiceException("Cannot instantiate service '{$name}', value returned by '{$factory}' is not object.");
             }
         }
         if ($singleton) {
             $session->{$lower} = $service;
             unset($session->factories[$lower]);
         }
         return $service;
     }
     if ($this->parent !== NULL) {
         return $this->parent->getService($name, $options);
     } else {
         throw new InvalidStateException("Service '{$name}' not found.");
     }
 }
Exemplo n.º 2
0
Arquivo: Mail.php Projeto: bazo/Mokuji
 /**
  * Returns mailer.
  * @return IMailer
  */
 public function getMailer()
 {
     if ($this->mailer === NULL) {
         Framework::fixNamespace(self::$defaultMailer);
         $this->mailer = is_object(self::$defaultMailer) ? self::$defaultMailer : new self::$defaultMailer();
     }
     return $this->mailer;
 }
Exemplo n.º 3
0
 /**
  * Stops monitoring.
  * @param  string class/interface type
  * @return void
  */
 public function unmonitor($type)
 {
     Framework::fixNamespace($type);
     unset($this->monitors[$type]);
 }
Exemplo n.º 4
0
 /**
  * Iterates over a components.
  * @param  bool    recursive?
  * @param  string  class types filter
  * @return ArrayIterator
  */
 public final function getComponents($deep = FALSE, $filterType = NULL)
 {
     $iterator = new RecursiveComponentIterator($this->components);
     if ($deep) {
         $deep = $deep > 0 ? RecursiveIteratorIterator::SELF_FIRST : RecursiveIteratorIterator::CHILD_FIRST;
         $iterator = new RecursiveIteratorIterator($iterator, $deep);
     }
     if ($filterType) {
         Framework::fixNamespace($filterType);
         $iterator = new InstanceFilterIterator($iterator, $filterType);
     }
     return $iterator;
 }