Application.php #1

  • //
  • guest/
  • perforce_software/
  • chronicle/
  • main/
  • library/
  • P4Cms/
  • Application.php
  • View
  • Commits
  • Open Download .zip Download (6 KB)
<?php
require_once 'Zend/Application.php';
require_once 'Zend/Application/Bootstrap/Bootstrapper.php';
require_once 'Zend/Application/Bootstrap/ResourceBootstrapper.php';
require_once 'Zend/Application/Bootstrap/BootstrapAbstract.php';
require_once 'Zend/Application/Bootstrap/Bootstrap.php';

/**
 * Extends Zend_Application to work without a config file.
 *
 * P4Cms_Application will look for a Bootstrap.php when options
 * don't explicitly specify one and attempt to load default options
 * from the Bootstrap class via getDefaultOptions().
 *
 * @copyright   2011 Perforce Software. All rights reserved.
 * @license     Please see LICENSE.txt in top-level folder of this distribution.
 * @version     <release>/<patch>
 */
class P4Cms_Application extends Zend_Application
{
    protected   $_configFile    = null;

    /**
     * Reimplement Zend_Application constructor to look for a Bootstrap.php
     * if one hasn't been specified and attempt to load default options from it.
     *
     * @param  string                   $environment  application environment.
     * @param  string|array|Zend_Config $options String path to configuration file,
     *                                           or array/Zend_Config of configuration options
     * @throws Zend_Application_Exception When invalid options are provided
     * @return void
     */
    public function __construct($environment, $options = null)
    {
        $this->_environment = (string) $environment;

        // if not already present, add P4Cms_Loader to the autoloader stack
        require_once "P4Cms/Loader.php";
        spl_autoload_register(array('P4Cms_Loader', 'autoload'));

        if ($options === null) {
            $options = array();
        } elseif (is_string($options)) {
            $this->_configFile = $options;
            try {
                $options = $this->_loadConfig($options);
            } catch (Zend_Config_Exception $e) {
                $options = array();
            }
        } elseif ($options instanceof Zend_Config) {
            $options = $options->toArray();
        } elseif (!is_array($options)) {
            throw new Zend_Application_Exception(
                "Invalid options provided; must be location of config file, " .
                "a config object, or an array"
            );
        }

        // look for a 'Bootstrap' class if nothing else has been specified.
        if (!isset($options['bootstrap']) && class_exists('Bootstrap')) {

            $options['bootstrap'] = "Bootstrap.php";

            // look for provision of default options in Bootstrap class
            if (method_exists('Bootstrap', 'getDefaultOptions')) {
                $defaults = Bootstrap::getDefaultOptions($environment);
                $options  = $this->mergeOptions($defaults, $options, true);
            }
        }

        $this->setOptions($options);
    }

    /**
     * Get the configuration file this application instance was first constructed
     * with. If no configuration file was used (e.g. an array or config object was
     * injected), throws an exception.
     *
     * @return  string                      the configuration file used to construct the application
     * @throws  Zend_Application_Exception  if no config file was used to construct the application
     */
    public function getConfigFile()
    {
        if (!$this->_configFile) {
            throw new Zend_Application_Exception(
                "Cannot get the configuration file. No file was passed to application constructor."
            );
        }

        return $this->_configFile;
    }

    /**
     * Merge options recursively
     * Extended to support caching of merged result in APC.
     *
     * @param   array   $array1     array to merge into
     * @param   mixed   $array2     array to merge from
     * @param   bool    $cache      enable caching of merged result (defaults to false)
     * @return  array   the merged result
     */
    public function mergeOptions(array $array1, $array2 = null, $cache = false)
    {
        // if we have apc and caller asked for caching, we'll attempt
        // to cache the merged options, if not, we'll just call parent.
        // no point caching if array2 is empty or not an array.
        if (!$cache || !is_array($array2) || empty($array2) || !extension_loaded('apc')) {
            return parent::mergeOptions($array1, $array2);
        }

        $cacheKey  = md5(serialize($array1) . serialize($array2));
        $cacheData = apc_fetch($cacheKey);
        if (is_array($cacheData)) {
            return $cacheData;
        }

        $merged = parent::mergeOptions($array1, $array2);
        apc_store($cacheKey, $merged);

        return $merged;
    }

    /**
     * Load configuration file of options.
     * Extends Zend's _loadConfig to add caching of config data when APC is enabled.
     *
     * @param   string  $file               the name of the configuration file to load
     * @throws  Zend_Application_Exception  When invalid configuration file is provided
     * @return  array                       the loaded configuration array
     */
    protected function _loadConfig($file)
    {
        // if we have apc and a readable file, we'll attempt to cache the config
        // if not, we'll just call parent and let it deal with everything.
        if (!extension_loaded('apc') || !is_readable($file)) {
            return parent::_loadConfig($file);
        }

        // check if we have a cached version of this config file.
        $cacheKey  = $file . "-" . $this->getEnvironment() . "-" . filemtime($file);
        $cacheData = apc_fetch($cacheKey);
        if (is_array($cacheData)) {
            return $cacheData;
        }

        // no cached copy, lets make one.
        // we catch exceptions here, otherwise we would fail to cache
        // invalid config files and would repeatedly try to parse them.
        try {
            $config = parent::_loadConfig($file);
        } catch (Zend_Config_Exception $e) {
            $config = array();
        }
        apc_store($cacheKey, $config);

        return $config;
    }
}
# Change User Description Committed
#1 16170 perforce_software Move Chronicle files to follow new path scheme for branching.
//guest/perforce_software/chronicle/library/P4Cms/Application.php
#1 8972 Matt Attaway Initial add of the Chronicle source code