zendFramework分析2:引导程序

zendFramework引导过程通过Application组件完成,由于是对老版本的兼容扩展,其实现起来感觉没有yii那样优雅,它把类库当做资源,而原来那些类库又没有统一的接口,因此又需要新写资源类来间接配置和获取相应的资源。


Zend_Application

zendFramework配置的加载通过入口文件实例Zend_Application来完成,构造方法通过初始化配置后,通过setOptions方法来加载应用的配置。在配置中主要有phpsettings、includepaths、autoloadernamespaces、autoloaderzfpath、bootstrap、appnamespace、resources等。

public function setOptions(array $options)
{
    if (!empty($options['config'])) {
        if (is_array($options['config'])) {
            $_options = array();
            foreach ($options['config'] as $tmp) {
                $_options = $this->mergeOptions($_options, $this->_loadConfig($tmp));
            }
            $options = $this->mergeOptions($_options, $options);
        } else {
            $options = $this->mergeOptions($this->_loadConfig($options['config']), $options);
        }
    }

    $this->_options = $options;

    $options = array_change_key_case($options, CASE_LOWER);
    $this->_optionKeys = array_keys($options);
    if (!empty($options['phpsettings'])) {
        $this->setPhpSettings($options['phpsettings']);
    }

    if (!empty($options['includepaths'])) {
        $this->setIncludePaths($options['includepaths']);
    }

    if (!empty($options['autoloadernamespaces'])) {
        $this->setAutoloaderNamespaces($options['autoloadernamespaces']);
    }

    if (!empty($options['autoloaderzfpath'])) {
        $autoloader = $this->getAutoloader();
        if (method_exists($autoloader, 'setZfPath')) {
            $zfPath    = $options['autoloaderzfpath'];
            $zfVersion = !empty($options['autoloaderzfversion'])
                        ? $options['autoloaderzfversion']
                        : 'latest';
            $autoloader->setZfPath($zfPath, $zfVersion);
        }
    }

    if (!empty($options['bootstrap'])) {
        $bootstrap = $options['bootstrap'];

        if (is_string($bootstrap)) {
            $this->setBootstrap($bootstrap);
        } elseif (is_array($bootstrap)) {
            if (empty($bootstrap['path'])) {
                throw new Zend_Application_Exception('No bootstrap path provided');
            }

            $path  = $bootstrap['path'];
            $class = null;

            if (!empty($bootstrap['class'])) {
                $class = $bootstrap['class'];
            }
            $this->setBootstrap($path, $class);
        } else {
            throw new Zend_Application_Exception('Invalid bootstrap information provided');
        }
    }

    return $this;
}
Bootstrap

在zf应用中,把框架中类库的看做资源,配置中以resources开头的都是资源相关配置,如resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"配置控制器所在的目录。Zend_Application通过配置实例化Bootstrap来配置资源。

public function setOptions(array $options)
{
    $this->_options = $this->mergeOptions($this->_options, $options);

    $options = array_change_key_case($options, CASE_LOWER);
    $this->_optionKeys = array_merge($this->_optionKeys, array_keys($options));

    $methods = get_class_methods($this);

    foreach ($methods as $key => $method) {
        $methods[$key] = strtolower($method);
    }

    if (array_key_exists('pluginpaths', $options)) {
        $pluginLoader = $this->getPluginLoader();

        foreach ($options['pluginpaths'] as $prefix => $path) {
            $pluginLoader->addPrefixPath($prefix, $path);
        }
        unset($options['pluginpaths']);
    }

    foreach ($options as $key => $value) {

        $method = 'set' . strtolower($key);

        if (in_array($method, $methods)) {
            $this->$method($value);
        } elseif ('resources' == $key) {
            foreach ($value as $resource => $resourceOptions) {
                $this->registerPluginResource($resource, $resourceOptions);
            }
        }
    }
    return $this;
}
配置加载好后,需要启动支持程序运行的,在_bootstrap()首先通过中getClassResourceNames()将获捕获导类中以_init开头的方法,这些方法是通过在引导类内部配置相关资源,然后获取配置中的资源并执行引导,在执行引导的时候会把资源注册在一个全局容器中,通过getResource($resource)方法可以获取容器中的资源。
/**
  * 获取内部和外部配置资源并执行
  */
protected function _bootstrap($resource = null)
{

    if (null === $resource) {
		//引导类内部方法
        foreach ($this->getClassResourceNames() as $resource) {
            $this->_executeResource($resource);
        }
		//配置中的资源
        foreach ($this->getPluginResourceNames() as $resource) {
            $this->_executeResource($resource);
        }

    } elseif (is_string($resource)) {
        $this->_executeResource($resource);
    } elseif (is_array($resource)) {
        foreach ($resource as $r) {
            $this->_executeResource($r);
        }
    } else {
        throw new Zend_Application_Bootstrap_Exception('Invalid argument passed to ' . __METHOD__);
    }
}
/**
  * Execute a resource 执行资源并注册全局资源实例
  */
protected function _executeResource($resource)
{
    $resourceName = strtolower($resource);
    if (in_array($resourceName, $this->_run)) {
        return;
    }

    if (isset($this->_started[$resourceName]) && $this->_started[$resourceName]) {
        throw new Zend_Application_Bootstrap_Exception('Circular resource dependency detected');
    }

    $classResources = $this->getClassResources();

    if (array_key_exists($resourceName, $classResources)) {
        $this->_started[$resourceName] = true;
        $method = $classResources[$resourceName];
        $return = $this->$method();
        unset($this->_started[$resourceName]);
        $this->_markRun($resourceName);

        if (null !== $return) {
            $this->getContainer()->{$resourceName} = $return;
        }

        return;
    }

    if ($this->hasPluginResource($resource)) {
        $this->_started[$resourceName] = true;
        $plugin = $this->getPluginResource($resource); 

        $return = $plugin->init();
        unset($this->_started[$resourceName]);
        $this->_markRun($resourceName);

        if (null !== $return) {
            $this->getContainer()->{$resourceName} = $return;
        }

        return;
    }

    throw new Zend_Application_Bootstrap_Exception('Resource matching "' . $resource . '" not found');
}

引导程序加载完成后,通过run()方法,获取前端控制器,然后前端控制器执行对请求的应答过程。


"sgmediation.zip" 是一个包含 UCLA(加利福尼亚大学洛杉矶分校)开发的 sgmediation 插件的压缩包。该插件专为统计分析软件 Stata 设计,用于进行中介效应分析。在社会科学、心理学、市场营销等领域,中介效应分析是一种关键的统计方法,它帮助研究人员探究变量之间的因果关系,尤其是中间变量如何影响因变量与自变量之间的关系。Stata 是一款广泛使用的统计分析软件,具备众多命令和用户编写的程序来拓展其功能,sgmediation 插件便是其中之一。它能让用户在 Stata 中轻松开展中介效应分析,无需编写复杂代码。 下载并解压 "sgmediation.zip" 后,需将解压得到的 "sgmediation" 文件移至 Stata 的 ado 目录结构中。ado(ado 目录并非“adolescent data organization”缩写,而是 Stata 的自定义命令存放目录)目录是 Stata 存放自定义命令的地方,应将文件放置于 "ado\base\s" 子目录下。这样,Stata 启动时会自动加载该目录下的所有 ado 文件,使 "sgmediation" 命令在 Stata 命令行中可用。 使用 sgmediation 插件的步骤如下:1. 安装插件:将解压后的 "sgmediation" 文件放入 Stata 的 ado 目录。如果 Stata 安装路径是 C:\Program Files\Stata\ado\base,则需将文件复制到 C:\Program Files\Stata\ado\base\s。2. 启动 Stata:打开 Stata,确保软件已更新至最新版本,以便识别新添加的 ado 文件。3. 加载插件:启动 Stata 后,在命令行输入 ado update sgmediation,以确保插件已加载并更新至最新版本。4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值