首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

Zend Framework Model 實戰範例:從專案結構到多命名空間協作

     編輯:PHP 相關知識

Zend Framework Model 實戰範例:從專案結構到多命名空間協作

承接上一篇理論基礎,本文提供一個完整可執行的專案範例,展示如何在單一專案中整合預設模型、自訂庫命名空間、資源載入器模型與第三方庫,並示範在 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/

關鍵配置檔案

application/configs/application.ini

[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

application/Bootstrap.php

<?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initAutoload()
    {
        $app = $this->getApplication();
        // 註冊額外命名空間供 library/ 底下類別使用
        $app->setAutoloaderNamespaces(array('AppTest'));
        return $app;
    }
}

模型類別定義

application/models/Test.php (預設模型)

<?php
class Application_Model_Test
{
    static public function getUserInfo()
    {
        return array('user_name' => '張三', 'user_gender' => '男');
    }
}

application/models/ModelTest.php (資源載入器模型)

<?php
class Model_ModelTest
{
    static function echoModelModelTest()
    {
        echo 'Model_ModelTest<br/>';
    }
}

library/App/Test.php

<?php
class App_Test
{
    static public function echoAppTest()
    {
        echo 'App_Test<br/>';
    }
}

library/MyApp/Test.php

<?php
class MyApp_Test
{
    static public function echoAMyAppTest()
    {
        echo 'MyApp_Test<br/>';
    }
}

library/Zend/Test.php (預設命名空間)

<?php
class Zend_Test
{
    static public function echoZendTest()
    {
        echo 'ZendTest<br/>';
    }
}

library/AppTest/Test.php (Bootstrap 註冊)

<?php
class AppTest_Test
{
    static public function echoAppTestTest()
    {
        echo 'AppTestTest<br/>';
    }
}

library/AppTest2/Test.php (動態註冊)

<?php
class AppTest2_Test
{
    static public function echoAppTest2Test()
    {
        echo 'AppTest2Test<br/>';
    }
}

控制器整合呼叫示範

application/controllers/IndexController.php

<?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

架構設計重點總結

  1. 分層清晰:application/models/ 存放業務模型,library/ 存放跨專案共用庫與第三方庫。
  2. 命名空間隔離:App_、MyApp_、AppTest_、AppTest2_ 互不干擾,避免類別名稱衝突。
  3. 資源載入器彈性:同一目錄 (application/models/) 可對應不同命名空間 (Application_Model_ 與 Model_),滿足不同模組需求。
  4. 遵循 PSR-0 慣例:目錄結構與命名空間一一對應,利於未來遷移至 Composer / PSR-4。

更多 Zend Framework 實戰技巧請參考:《Zend Framework 佈局助手詳解》、《Zend Framework 分頁類應用》、《Zend Framework 資料庫操作實例》等專題。實際專案中建議搭配 Zend_Application_Module_Autoloader 實現模組級自動載入,進一步提升結構清晰度。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved