承接上一篇理論基礎,本文提供一個完整可執行的專案範例,展示如何在單一專案中整合預設模型、自訂庫命名空間、資源載入器模型與第三方庫,並示範在 Controller 中統一呼叫。
model_demo1/ ├── .zfproject.xml ├── application/ │ ├── Bootstrap.php │ ├── configs/application.ini │ ├── controllers/IndexController.php │ ├── models/ │ │ ├── Test.php // Application_Model_Test │ │ └── ModelTest.php // Model_ModelTest (資源載入器) │ └── views/ ├── library/ │ ├── App/Test.php // App_Test │ ├── MyApp/Test.php // MyApp_Test │ ├── Zend/Test.php // Zend_Test │ ├── AppTest/Test.php // AppTest_Test │ └── AppTest2/Test.php // AppTest2_Test ├── public/index.php └── tests/
[production] phpSettings.display_startup_errors = 1 phpSettings.display_errors = 1 includePaths.library = APPLICATION_PATH "/../library" bootstrap.path = APPLICATION_PATH "/Bootstrap.php" bootstrap.class = "Bootstrap" appnamespace = "Application" autoloadernamespaces.app = "App_" autoloadernamespaces.my = "MyApp_" resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers" resources.frontController.params.displayExceptions = 1 [development : production] phpSettings.display_startup_errors = 1 phpSettings.display_errors = 1 resources.frontController.params.displayExceptions = 1
<?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
protected function _initAutoload()
{
$app = $this->getApplication();
// 註冊額外命名空間供 library/ 底下類別使用
$app->setAutoloaderNamespaces(array('AppTest'));
return $app;
}
}
<?php
class Application_Model_Test
{
static public function getUserInfo()
{
return array('user_name' => '張三', 'user_gender' => '男');
}
}
<?php
class Model_ModelTest
{
static function echoModelModelTest()
{
echo 'Model_ModelTest<br/>';
}
}
<?php
class App_Test
{
static public function echoAppTest()
{
echo 'App_Test<br/>';
}
}
<?php
class MyApp_Test
{
static public function echoAMyAppTest()
{
echo 'MyApp_Test<br/>';
}
}
<?php
class Zend_Test
{
static public function echoZendTest()
{
echo 'ZendTest<br/>';
}
}
<?php
class AppTest_Test
{
static public function echoAppTestTest()
{
echo 'AppTestTest<br/>';
}
}
<?php
class AppTest2_Test
{
static public function echoAppTest2Test()
{
echo 'AppTest2Test<br/>';
}
}
<?php
class IndexController extends Zend_Controller_Action
{
public function indexAction()
{
// 1. 預設模型 (application/models/)
var_dump(Application_Model_Test::getUserInfo());
// 2. library/ 靜態註冊命名空間
App_Test::echoAppTest();
MyApp_Test::echoAMyAppTest();
Zend_Test::echoZendTest();
// 3. Bootstrap 註冊命名空間
AppTest_Test::echoAppTestTest();
// 4. 動態推入資源載入器 (針對 application/models/ 另設 Model_ 前綴)
$autoLoader = Zend_Loader_Autoloader::getInstance();
$resourceLoader = new Zend_Loader_Autoloader_Resource(array(
'basePath' => APPLICATION_PATH,
'namespace' => '',
'resourceTypes' => array(
'model' => array(
'path' => 'models/',
'namespace' => 'Model'
)
)
));
$autoLoader->pushAutoloader($resourceLoader);
// 5. 動態註冊額外命名空間
$autoLoader->registerNamespace(array('AppTest2_'));
// 6. 呼叫動態載入的類別
AppTest2_Test::echoAppTest2Test();
Model_ModelTest::echoModelModelTest();
exit(); // 示範用,正式專案請交由 View 輸出
}
}
array(2) {
["user_name"]=>
string(6) "張三"
["user_gender"]=>
string(3) "男"
}
App_Test
MyApp_Test
ZendTest
AppTestTest
AppTest2Test
Model_ModelTest
application/models/ 存放業務模型,library/ 存放跨專案共用庫與第三方庫。App_、MyApp_、AppTest_、AppTest2_ 互不干擾,避免類別名稱衝突。application/models/) 可對應不同命名空間 (Application_Model_ 與 Model_),滿足不同模組需求。更多 Zend Framework 實戰技巧請參考:《Zend Framework 佈局助手詳解》、《Zend Framework 分頁類應用》、《Zend Framework 資料庫操作實例》等專題。實際專案中建議搭配 Zend_Application_Module_Autoloader 實現模組級自動載入,進一步提升結構清晰度。