如何自动加载Zend Framework模块模型?

时间:2012-04-21 04:43:00

标签: zend-framework

我正在Zend Framework中构建一个新的CMS,我没有太多接触ZF。客户端需要两个名为Admin和FE的部分。所以,我的应用程序结构如下:

- SITE
-- application
---- configs
---- layouts
---- modules
-------- default
------------ controllers
------------ forms
------------ models
------------ views
------------ Bootstrap.php
-------- admin
------------ controllers
------------ forms
------------ models
------------ views
------------ Bootstrap.php
---- Bootstrap.php
-- public
-- library
-- index.php

当我访问http://sitehttp://site/admin等网站时,我的结构工作正常,并且正在加载布局和控制器。

我的问题是 1.)如何在模块中自动加载模型。在模型特定的引导程序文件中,我添加了下面的代码。但它没有用。

class Admin_Bootstrap extends Zend_Application_Module_Bootstrap 
{
    protected function _initAutoload()
    {
        $autoloader = new Zend_Application_Module_Autoloader(array(
            'basePath' => APPLICATION_PATH.'/modules/admin/',
            'namespace' => '',
            'resourceTypes' => array(
                'form' => array(
                    'path' => 'forms/',
                    'namespace' => 'Form_',
                ),
                'model' => array(
                    'path' => 'models/',
                    'namespace' => 'CPModel_'
                )
            ),
        ));
        return $autoloader;
    }
}

2.。)我将如何为不同的模块使用不同的布局?

1 个答案:

答案 0 :(得分:3)

这里有两个问题:

  1. 自动加载模型
  2. 特定于模块的布局
  3. 对于自动加载模型,首先确保模块引导类扩展Zend_Application_Module_Bootstrap。这将注册包含映射的资源自动加载器,以便名为Admin_Model_User的模型类可以存储在文件application/modules/admin/models/User.php中(请注意路径中的复数模型* s *名称)。对于上面描述的用法,您似乎不需要自己定义任何此类映射。

    默认模块有一些棘手的问题。 IIRC,默认模块使用appnamespace,通常默认为Application_。因此,例如,默认模块中的用户模型将命名为Application_Model_User并存储在文件application/modules/default/models/User.php中。 [如果这不起作用,请尝试命名Default_Model_User]

    [但是,如果你真的坚持你的管理模块的空appnamespace和你的模型的CPModel前缀 - 正如你的例子所示 - 那么其中一些变化。]

    结果是,由于大多数这些文件夹不在include_path上,因此系统需要在某个时候告知要将哪些类前缀关联/映射到哪些目录。

    对于特定于模块的布局,通常我会创建一个实现preDispatch()挂钩的front-controller plugin。如果您将布局保留在application/layouts/scripts/的顶层,那么您的插件可能看起来像application/plugins/Layout.php中存储的内容:

    class Application_Plugin_Layout extends Zend_Controller_Plugin_Abstract
    {
    
        public function preDispatch(Zend_Controller_Request_Abstract $request)
        {
            Zend_Layout::getMvcInstance()->setLayout($request->getModuleName());
        }
    }
    

    通过Bootstrap在您的应用级applications/config/application.ini注册您的插件:

    resources.frontController.plugin.layout = "Application_Plugin_Layout"
    

    Bootstrap中的应用级application/Bootstrap.php

    protected function _initPlugins()
    {
        $this->bootstrap('frontController');
        $front = $this->getResource('frontController');
        $front->registerPlugin(new Application_Plugin_Layout());
    }
    

    然后,例如,您的管理员布局可以存储在application/layouts/scripts/admin.phtml