簡體   English   中英

如何自動加載Zend Framework模塊模型?

[英]How to autoload Zend Framework module models?

我正在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. 自動加載模型
  2. 特定於模塊的布局

對於自動加載模型,首先要確保模塊引導類擴展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()掛鈎的前端控制器插件 如果您將布局保留在application/layouts/scripts/的頂層,那么您的插件可能看起來像存儲在application/plugins/Layout.php的以下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());
    }
}

通過applications/config/application.ini在您的應用級Bootstrap注冊您的插件:

resources.frontController.plugin.layout = "Application_Plugin_Layout"

或者在application/Bootstrap.php中的應用程序級Bootstrap中:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM