Zend应用程序/引导程序如何工作?

时间:2010-01-26 09:44:01

标签: php zend-framework

关于Zend Framework 1.9基础知识的一些问题。

  1. 我遵循了快速入门指南,基本上,自举涉及,

    一个。来自index.php:

    $ZEND_FRAMEWORK_LIB_PATH = '/appl/ZendFramework-1.9.7/library';
    defined('APPLICATION_PATH') || define('APPLICATION_PATH', (realpath(dirname(__FILE__) . '/../application')));
    defined('APPLICATION_ENV') || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));
    set_include_path(implode(PATH_SEPARATOR, array((dirname(dirname(__FILE__)) . '/library'), $ZEND_FRAMEWORK_LIB_PATH, get_include_path(),)));
    require_once 'Zend/Application.php';
    $application = new Zend_Application(APPLICATION_ENV, (APPLICATION_PATH . '/configs/application.ini'));
    $application->bootstrap()->run();
    

    湾然后在Bootstrap.php中,我有

    protected function _initAutoload()
    {
        $autoloader = new Zend_Application_Module_Autoloader(array("namespace" => "Default_", "basePath" => dirname(__FILE__),));
        return $autoloader;
    }
    
    protected function _initDoctype()
    {
        $this->bootstrap("view");
        $view = $this->getResource("view");
        $view->doctype("XHTML1_STRICT");
    }
    
  2. 首先,我不明白的一些事情:

    一个。如果用户不通过默认的index.php访问该站点,这是否意味着引导(实际上,index.php中的所有代码,包括环境设置等,都将被绕过?)

    湾没有明确调用Bootstrap的_initAutoload()_initDoctype()方法的地方。那么这些方法何时被隐式调用?

    ℃。因为在index.php中,我已经将配置文件'/configs/application.ini'“传入”了Zend_Application构造函数,有没有办法在其他地方检索配置条目?

  3. 在我的应用程序中,我必须使用不同的数据库(所以我不能只使用resources.db.*)。所以在同一个application.ini文件中,我有,例如<​​/ p>

    custdb.adapter = "PDO_MYSQL"
    custdb.params.host = "localhost"
    custdb.params.username = "username"
    custdb.params.password = "password"
    custdb.params.dbname = "custdb"
    

    管理数据库适配器的最佳做法是什么?

    一个。是否可以(并且应该)在index.php或Bootstrap.php中创建数据库适配器,并在需要时(以及如何)在其他地方检索它?

    湾或者可以(并且我应该)只在其他地方检索配置条目(如何?)并在需要时实例化数据库适配器?

  4. 谢谢!

3 个答案:

答案 0 :(得分:7)

以下是一些答案。

2a上。所有请求都被重定向到index.php。这是通过mod_rewrite完成的,并在.htaccess文件中指定。

2B。引导程序调用前缀为_init的任何方法。见Zend Framework - Theory of Operation

2c中。是。 Zend::Config。您可以在Zend::Registry中存储实例以便于访问。例如:

$config = new Zend_Config((APPLICATION_PATH . '/configs/application.ini')); 
$application = new Zend_Application(APPLICATION_ENV, $config);
Zend_Registry::set('config', $config);

检查API参考以查看这两个类的构造函数。

我不认为快速启动会有所帮助。我建议买一本书。我很喜欢Keith Pope的“Zend Framework 1.8 Web应用程序开发”。

答案 1 :(得分:2)

要回答问题3,ZF使用应用程序资源插件Zend_Application_Resource_Db来提取配置并创建数据库适配器实例。

如果您需要多个数据库是环境因素,您可以轻松地将您的数据库参数命名为application.ini文件。

[production]
resources.db.adapter = PDO_MYSQL
resources.db.params.host = localhost
resources.db.params.username = user
resources.db.params.password = pass
resources.db.params.dbname = production_db

[staging : production]
resources.db.params.dbname = staging_db

[development : production]
resources.db.params.dbname = development_db

在此示例中,我们在[production]部分中设置公共信息,并为我们的登台和开发环境覆盖它。应用的配置由应用.htaccess

中的环境变量控制

如果您需要在单个应用程序中访问多个数据库,那么我建议您使用自己的应用程序资源插件,并创建某种结构来保存多个连接。

它并不像看起来那么困难。阅读here并创建Zend_Application_Resource_ResourceAbstract的子类。使用此类,您可以使用以下命令轻松获取配置文件中的resources.*

$this->getBootstrap()-getResource('mydb')`

然后您可以通过引导对象访问您的插件:

$bootstrap->getPluginResource('mydb')

希望有所帮助。

编辑:我忘了提一下,如果你有一个资源插件作为你的application.ini的一部分,Zend_Application引导程序将自动知道将它包含在bootstrap进程的一部分,所以你不需要定义任何{引导程序文件中的{1}}方法。这有点神奇。

另外,就存储适配器实例而言,我可能只是用户Zend_Registry。

答案 2 :(得分:0)

感谢您的所有回复!这真的有助于我理解ZF的概念。

我也浏览了参考资料和源代码以获得更深入的理解,这就是我采用的:

在我的application.ini中,我有:

custom.db.customers.adapter = "PDO_MYSQL"
custom.db.customers.params.host = "localhost"
custom.db.customers.params.username = "username"
custom.db.customers.params.password = "password"
custom.db.customers.params.dbname = "custdb"

然后,在我的Bootstrap.php中,我有:

protected function _initCustomDbCustomers()
{
    $config = $this->getOptions();
    $cfgCustom = $config['custom'];
    if (null != $cfgCustom)
    {
        $cfgCustomDb = $cfgCustom['db'];
        if (null != $cfgCustomDb)
        {
            $cfgCustomDbCustomers = $cfgCustom['customers'];
            if (null != $cfgCustomDbCustomers)
            {
                $resrcCustomDbCustomers = new Zend_Application_Resource_Db($cfgCustomDbCustomers);
                return $resrcCustomDbCustomers
            }
        }
    }
}

当然,在我的index.php中,我打电话:

$application->bootstrap();
$application->run();

然后,在需要获取数据库适配器的控制器中,我执行:

$bootstrap = $this->getInvokeArg('bootstrap');
$resrcCustomDbCustomers = $bootstrap->getResource('customDbCustomers');
$adpCustomDbCustomers = $resrcCustomDbCustomers->getDbAdapter();
// Do Stuffs With DB Adapter

这是一种好/坏的做事方式吗?我应该注意哪些陷阱?

谢谢!