[英]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:// site或http:// 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.)我如何為不同的模塊使用不同的布局?
這里有兩個問題:
對於自動加載模型,首先要確保模塊引導類擴展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.