簡體   English   中英

ZF2:模塊組

[英]ZF2: Groups of modules

我正在學習ZF2並計划一個應用程序。

我想要一個帶有幾組模塊的應用程序。 每組模塊最多可包含20多個模塊。

我無法保證整個應用程序中任何模塊的唯一名稱,但是我可以保證它們在模塊組中的唯一性。

理想情況下,使用托管路由器將請求路由到模塊組。

例如http://admin.mysite.com/foo/ =>'Admin / Foo / Index / Index',

http://special.mysite.com/foo/ =>'Special / Foo / Index / Index'

想法#1

我希望為每個模塊組使用不同的module_path,並對模塊組周圍的模塊路徑命名,以確定模塊類的唯一性。 但是發送到module_autoloader的模塊似乎只注意傳遞的所有字符串的第一部分。

例如

array('modules' => array(
 'Admin\Admin','Admin\Bob','Admin\Users'
));

這是我不理解的奇怪行為:

  • 這三個都將指向正確的模塊控制器,但它們將加載Admin \\ Admin的視圖(在模塊列表中排在第一位),而不是它們自己的視圖。
  • IE / users,加載Admin \\ Users \\ IndexController,但使用視圖腳本Admin \\ Admin \\ view \\ admin \\ Index \\ index.phtml

我已經通過對templateInjecter進行了一些小的改動來解決了這個問題,但是看起來很混亂。

想法2

只需在其子目錄前添加模塊名稱即可

namespace AdminAdmin\Controller,
class  IndexController {}

思考

  • 名稱空間比類前綴更可取
  • 我們正在嘗試盡可能多地自動執行此操作,而不是對每個模塊使用硬編碼的路由
  • 可能會使用多個應用程序,這些應用程序通過一個共同的cookie主機/內存緩存和db等共享一個模塊進行身份驗證。
  • 使用模塊控制器的treeRouteStack內部的托管類型路由將每個模塊路由到某個子域...

題:

  • 他們是這種情況還是類似情況的最佳實踐,為什么?

我對您的問題的解釋是,您實際上是在問兩個問題:

(1)命名空間模塊

ZF2本身可以做到這一點。 ZF2中的模塊基本上只是PHP命名空間,因此一個名為Foo\\Bar的模塊是完全可以接受的,並且默認情況下,模塊加載器將在module/Foo/Bar然后在vendor/Foo/Bar查找其模塊類。

例如,如果要創建模塊Anvil並在名稱空間Acme下創建目錄module/Acme/Anvil ,然后在其中創建Module.php文件:

<?php
namespace Acme\Anvil;

class Module
{
    /* module class code goes here */
}

在應用程序的config/application.config.php您可以將Acme\\Anvil添加到modules鍵中:

return array(
    'modules' => array(
        'Application',
        'Acme\Anvil',
    ),
    // Remaining bits of config array are unchanged
);

(2)動態加載模塊

您可以采取的一種方法是修改站點的bootstrap index.php以根據主機名即時修改配置。 例如,使用ZendSkeletonApplication,您可以像下面這樣設置application.config.php文件:

<?php
return array(
    'modules' => array(
        'Application',
        // Other modules common to all sites go here
    ),
    'sites' => array(
        'site-one.mydomain.com' => array(
            'modules' => array(
                'ModuleOne',
                'ModuleTwo',
            ),
        ),
        'site-two.mydomain.com' => array(
            'modules' => array(
                'ModuleThree',
            ),
        ),
    ),
    // Remaining bits of config array are unchanged
);

為了完成這項工作,我們對public/index.php進行了一些修改,以攔截從config/application.config.php加載的配置數組,並重新配置modules鍵:

// Pick host out of request
$hostname = $_SERVER['HTTP_HOST'];

// Load application configuration
$applicationConfig = require 'config/application.config.php';

// Merge site-specific modules into loaded modules array
$applicationConfig['modules'] = array_merge(
    $applicationConfig['modules'],
    $applicationConfig['sites'][$hostname]['modules']
);

// Run the application!
Zend\Mvc\Application::init($applicationConfig)->run();

這種方法提供了一種簡便的方法來更改為特定主機名加載的模塊,但可以輕松擴展以允許特定於站點的配置文件自動加載以及特定於站點的模塊目錄。

暫無
暫無

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

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