1

私は Zend フレームワークと Django の両方を使用しています。どちらにも長所と短所がありますが、どちらも独自の方法で優れたフレームワークです。

次の例のように、高度にモジュール化された Web アプリケーションを作成したいと考えています。

  • モジュール:
    • 管理者
      • cms
        • 記事
        • セクション
      • ...
        • ...
          • ...

また、すべてのモジュールをすべてのconfidおよびテンプレートファイルで自己完結型にしたいと考えています。

私はこれを解決する方法を検討してきましたが、モジュールのセットアップに 1 オマー レベルを追加するのは適切ではありません。私はこれができると確信していますが、私はすべきですか?また、Doctrine を zend アプリケーションに含めたところ、モジュールのセットアップでさらに問題が発生する可能性があります。

Django について話している場合、これは実装が簡単で (実装時間などではなく、概念としては簡単です)、Web アプリを作成する優れた方法です。しかし、Django の欠点の 1 つは Web ホスティング部分です。Django のサポートを提供する Web ホストがいくつかありますが、それほど多くはありません。

では、問題は何が最も価値があるかということだと思います。迅速なモジュラー開発とホスティング オプションの比較!

さて、コメント大歓迎です!

ありがとう

4

2 に答える 2

4

ZF では、比較的少ない労力でサブモジュールを実装できます。次のようなディレクトリ構造があるとします。

application/
  modules/
    admin/
      cms/
        controllers/
        views/
      controllers/
      views/

次のようにモジュールをブートストラップに登録します (サブモジュールは _ を使用してサブモジュールをメイン モジュールから分離します)。

$frontController->setControllerDirectory(array(
    'default'   => APPLICATION_PATH . '/modules/default/controllers',
    'admin'     => APPLICATION_PATH . '/modules/admin/controllers',
    'admin_cms' => APPLICATION_PATH . '/modules/admin/cms/controllers'
));

これに関する問題は、実際にはスラッシュの代わりに URL に下線が使用されることです。たとえば、「admin/cms/controller/action」ではなく「admin_cms/conteroller/action」になります。これは「機能」しますが、きれいではありません。この問題を解決する 1 つの方法は、デフォルト ルートに独自のルートを提供することです。デフォルトの Zend_Controller_Router_Route_Module でほぼ正しく動作するため、単純にそれを拡張して必要な動作を追加できます。

<?php

class App_Router_Route_Module extends Zend_Controller_Router_Route_Module
{
    public function __construct()
    {
        $frontController = Zend_Controller_Front::getInstance();
        $dispatcher = $frontController->getDispatcher();
        $request = $frontController->getRequest();
        parent::__construct(array(), $dispatcher, $request);
    }

    public function match($path)
    {
        // Get front controller instance
        $frontController = Zend_Controller_Front::getInstance();

        // Parse path parts
        $parts = explode('/', $path);

        // Get all registered modules
        $modules = $frontController->getControllerDirectory();

        // Check if we're in default module
        if (count($parts) == 0 || !isset($modules[$parts[0]]))
            array_unshift($parts, $frontController->getDefaultModule());

        // Module name
        $module = $parts[0];

        // While there are more parts to parse
        while (isset($parts[1])) {
            // Construct new module name
            $module .= '_' . $parts[1];

            // If module doesn't exist, stop processing
            if (!isset($modules[$module]))
                break;

            // Replace the parts with the new module name
            array_splice($parts, 0, 2, $module);
        }

        // Put path back together
        $path = implode('/', $parts);

        // Let Zend's module router deal with the rest
        return parent::match($path);
    }
}

そしてあなたのブートストラップで:

$router = Zend_Controller_Front::getInstance()->getRouter();
$router->addRoute('default', new App_Router_Route_Module);

これが行うことは、モジュールが見つかる限りパスをトラバースし、パスを透過的に書き換えて、デフォルトの Zend_Controller_Router_Route_Module が実際の作業を実行できるようにすることです。たとえば、次のパス: "/admin/cms/article/edit" は "/admin_cms/article/edit" に変換されます。これにより、ZF の ":module/:controller/:action" の標準規則が魔法のように機能します。 .

これにより、きれいで論理的な URL を使用しながら、自己完結型のモジュールで優れたモジュール構造を実現できます。注意しておきたいことの 1 つは、Zend_Navigation を使用し、モジュール/コントローラー/アクション パラメーターを使用してナビゲーション項目を指定する場合、モジュール名に「_」ではなく「/」を使用して URL を正しく構築する方法を ZF に指示する必要があることです。 (デフォルトでは、ZF は URL を作成するときに :module/:controller/:action 仕様を使用します)。次のように、独自の Zend_Controller_Action_Helper_Url を実装することでこれを行うことができます。

<?php

class App_Router_Helper_Url extends Zend_Controller_Action_Helper_Url
{
    public function url($urlOptions = array(), $name = null, $reset = false, $encode = false)
    {
        // Replace the _ with / in the module name
        $urlOptions['module'] = str_replace('_', '/', $urlOptions['module']);

        // Let the router do rest of the work
        return $this->getFrontController()->getRouter()->assemble($urlOptions, $name, $reset, $encode);
    }
}

そしてあなたのブートストラップで:

Zend_Controller_Action_HelperBroker::addHelper(new App_Router_Helper_Url);

これで、Zend_Navigation はサブモジュールのサポートとうまく連携します。

于 2009-10-28T09:22:51.643 に答える
3

私は (幸せな ZF ユーザーですが) Django を選びます。ZF では、「完全にモジュール化された」アプリケーションは聖杯のようなものです。「このフォルダーをモジュールディレクトリにコピーする」のようにインストール可能な、自己完結型のモジュールを作成することはほとんど不可能です(または少なくとも極端な努力なしでは):)

于 2009-10-28T11:43:09.633 に答える