如何自动加载Zend框架模块的型号?(How to autoload Zend Framework

2019-06-23 19:24发布

我建立在Zend Framework的一个新的CMS和我没有太多的接触ZF。 客户需要两节称为管理员和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://网站或HTTP://网站/管理员 。

我的问题是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)我将如何使用不同的模块,不同的布局?

Answer 1:

两个问题在这里:

  1. 自动加载模型
  2. 具体的模块布局

对于自动加载模式,首先确保你的模块自举类扩展Zend_Application_Module_Bootstrap 。 这将注册包括映射,使名为模型类的资源自动加载Admin_Model_User可以存储在文件application/modules/admin/models/User.php (注意路径名的多个型号* S *)。 对于你上面描述的使用,它不会出现,你需要自己定义任何这样的映射。

有关联的默认模块trickiness的位。 IIRC,默认模块使用appnamespace,通常默认为Application_ 。 因此,例如,在缺省模块中,用户模型将被命名为Application_Model_User并存储在文件application/modules/default/models/User.php 。 [如果不工作,然后尝试命名Default_Model_User ]

[但是,如果你真的坚持了您的管理模块和CPModel为您的机型前缀的空appnamespace - 为您的例子说明 - 然后一些这方面的变化。]

其结果是,因为大多数这些文件夹不在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"

或者在应用级Bootstrapapplication/Bootstrap.php

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

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



文章来源: How to autoload Zend Framework module models?