1

我正在 Zend Framework 中构建一个新的 CMS,我对 ZF 的了解不多。客户端需要两个部分,称为 Admin 和 FE。因此,我将我的应用程序结构构建如下。

- 地点
-  应用
---- 配置
---- 布局
---- 模块
-  -  -  -  默认
------------ 控制器
-  -  -  -  -  -  形式
-  -  -  -  -  -  楷模
------------ 意见
------------ Bootstrap.php
-  -  -  -  行政
------------ 控制器
-  -  -  -  -  -  形式
-  -  -  -  -  -  楷模
------------ 意见
------------ Bootstrap.php
---- 引导程序.php
-  上市
-  图书馆
-- 索引.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.) 我将如何为不同的模块使用不同的布局?

4

1 回答 1

3

这里有两个问题:

  1. 自动加载模型
  2. 特定于模块的布局

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

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

[但是,如果您真的坚持为您的管理模块使用一个空的 appnamespace 并为您的模型添加一个 CPModel 前缀 - 正如您的示例所暗示的那样 - 那么其中一些会发生变化。]

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

对于特定于模块的布局,通常我会创建一个实现挂钩的前端控制器插件。preDispatch()如果您将布局保持在 中的顶层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.

于 2012-04-21T08:00:47.333 回答