| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 | <?php/** * * Cube Framework $Id$ ywBq0GD/Wfo6NkXOTpHP+JXJC2leduaTfdJqu899Nds= * * @link        http://codecu.be/framework * @copyright   Copyright (c) 2014 CodeCube SRL * @license     http://codecu.be/framework/license Commercial License * * @version     1.0 *//** * bootstrap class */namespace Cube\Application;use Cube\Application,    Cube\Controller\Front as FrontController;class Bootstrap{    /**     * default name of resources namespace     */    const RESOURCES_NAMESPACE = 'Resource';    /**     *     * application object     *     * @var \Cube\Application     */    protected $_application;    /**     *     * resources array     *     * @var array     */    protected $_resources = array();    /**     *     * bootstrap front controller resource     * final class so it cannot be overridden by module bootstraps     */    final public function __construct()    {        $this->setResource('FrontController', FrontController::getInstance()            ->setOptions(                $this->getApplication()->getOptions()));    }    /**     *     * get the application object     *     * @return \Cube\Application     */    public function getApplication()    {        if (!($this->_application instanceof Application)) {            $this->_application = Application::getInstance();        }        return $this->_application;    }    /**     *     * add a resource to the resources array     *     * @param string $name     * @param mixed  $resource     *     * @return \Cube\Application\Bootstrap     */    public function setResource($name, $resource)    {        if ($this->hasResource($name) === false) {            $this->_resources[$name] = $resource;        }//        else {//            throw new \InvalidArgumentException(sprintf("A resource with the name '%s' already exists", $name));//        }        return $this;    }    /**     *     * get a resource     *     * @param string $name     *     * @return mixed|bool     */    public function getResource($name)    {        if ($this->hasResource($name) === true) {            return $this->_resources[$name];        }        return false;    }    /**     *     * remove a resource     *     * @param string $name     *     * @return $this     */    public function removeResource($name)    {        if ($this->hasResource($name) === true) {            unset($this->_resources[$name]);        }        return $this;    }    /**     *     * check if a resource exists     *     * @param string $name     *     * @return bool     */    public function hasResource($name)    {        if (array_key_exists($name, $this->_resources)) {            return true;        }        return false;    }    /**     *     * bootstrap a single resource     * we will search for the resource either in the default resources folder or in the bootstrap of the requested module     * a resource will only be bootstrapped once     *     * @param string $resource     *     * @throws \DomainException     */    protected function _bootstrap($resource)    {        if (!$this->hasResource($resource)) {            $methodName = '_init' . ucfirst($resource);            $resourceName = '\\' . __NAMESPACE__ . '\\' . self::RESOURCES_NAMESPACE . '\\' . ucfirst($resource);            if (class_exists($resourceName)) {                $class = new $resourceName();                if ($class instanceof Resource\ResourceInterface) {                    $options = $this->getApplication()->getOptions();                    $object = $class->setOptions($options)                        ->init();                    $this->setResource($resource, $object);                }                else {                    throw new \DomainException(sprintf("'%s' must be implement the ResourceInterface interface.",                        $resourceName));                }            }            else if (method_exists($this, $methodName)) {                $result = $this->$methodName();                $this->setResource($resource, $result);            }        }    }    /**     *     * bootstrap one, multiple (array) or all resources if no parameters are set     * final method     *     * @param null|string|array $resource     *     * @return \Cube\Application\Bootstrap     */    final public function bootstrap($resource = null)    {        if (is_string($resource)) {            $this->_bootstrap($resource);        }        else if (is_array($resource)) {            foreach ($resource as $res) {                $this->_bootstrap($res);            }        }        else {            $options = $this->getApplication()->getOptions();            // bootstrap default application resources that are initialized in the application configuration            foreach ((array)$options as $name => $config) {                $this->_bootstrap($name);            }            // bootstrap resources defined in the active module bootstrap file            foreach ((array)get_class_methods($this) as $method) {                if (strpos($method, '_init') === 0) {                    $this->_bootstrap(lcfirst(                        str_replace('_init', '', $method)));                }            }        }        return $this;    }    /**     *     *     * run the application     */    public function run()    {        $front = $this->getResource('FrontController');        return $front->dispatch();    }}
 |