Zend Framework + Doctrine1.2より多くのモジュールを持つプロジェクト構造

アプリケーションはZendFramework + Doctrine 1.2を実現しましたが、今ではより多くのモジュールを使用した経験があります。デフォルトのモジュールは、特定のレイアウトを持つすべての人と、異なるレイアウトを持つ管理モジュールに見えるように要求しました。

これまでの私のアプリケーションでは、私は常に以下の構造を使用していました。

/app
    /application
        /acls
        /configs
        /controllers
        /forms
        /layouts
        /models --> models by doctrine
            /generated --> base models by doctrine
        /plugins
        /views
        /Bootstrap.php
    /data
    /doctrine
        /data
        /migrations
        /schema
            /schema.yml
        /doctrine.php
    /library
    /public
    /tests

だから私の質問は:どのように私のアプリケーションの構造が必要なことをする必要がありますか?

私はzendツールを使ってみて、どのような構造のコマンドを作成したのかを見てみましょう:

zf create module admin

打ち上げ後のコース

zf create project app

私はcreate commandモジュールが application modules フォルダを作成したことに気付きました。 models admin を作成し、その中にコントローラ models view を作成しました。

したがって、コントローラとビューを正しく分離することに加えて、モデルを分離することに加えて、モデルもあります。 しかし、私の教義は、すべてのモデルを一方で作成します! :D

doctrineによって作成されたテンプレートを各モジュールに使用するにはどうすればよいですか?

次に、管理モジュールに新しいレイアウトを割り当てるにはどうすればよいですか?

パーティーゲストの方は、現在使用している施設を離れて、すべて default の形式で移動することをお勧めしますか?

申し訳ありませんが、私はたくさんの質問をしましたが、あまりにも多すぎるかもしれませんが、私は本当にそれについて非常に混乱しています!

ありがとう

2

1 答え

徹底的な文書化の後、私は正しいプロジェクト構造を見つけました

/app
/application
    /acls
    /configs
        application.ini
    /layouts
        /scripts
            admin.phtml
            default.phtml
    /models --> models by doctrine
        /generated --> base models by doctrine
    /modules
        /admin
            /controllers
            /forms
            /view
        /default
            /controllers
            /forms
            /view
    /plugins
    /Bootstrap.php
/data
/doctrine
    /data
    /migrations
    /schema
        /schema.yml
    /doctrine.php
/library
/public
/tests

あなたがモジュールである場所に応じて別のレイアウトを表示するには、以下のプラグインを使用しました:

class Plugin_Layout extends Zend_Controller_Plugin_Abstract
{
    /**
     * Called before an action is dispatched by Zend_Controller_Dispatcher.
     *
     * @param  Zend_Controller_Request_Abstract $request
     * @return void
     */
    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {
        $layout = Zend_Layout::getMvcInstance();
        $module = $request->getModuleName();
        switch ($module) {
            case 'default':
                $layout->setLayout('default');
                break;
            case 'admin':
                $layout->setLayout('admin');
                break;
            default:
                $layout->setLayout('default');
                break;
        }
    }
}

Bootstrap.phpファイルへ

 /**
 * @return Zend_Application_Module_Autoloader
 */
protected function _initAutoload()
{
    $autoloader = new Zend_Application_Module_Autoloader(array('namespace' => '', 'basePath' => APPLICATION_PATH));
    $autoloader->addResourceType('plugin', 'plugins', 'Plugin');
    return $autoloader;
}

application.iniファイルへ

resources.frontController.plugins.auth = Plugin_Layout
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"

使用しているモジュールに従って上記のプラグインが "layouts/scripts"内のmodule.phtmlの名前でレイアウトを設定します。


モジュール内でフォームをオートロードする方法

以下の2行をapplication.iniファイルに追加してください

resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.modules[] = ""

モジュールごとにブーストラップファイルを作成します。 Bootstrap.phpという名前のファイルは、モジュールディレクトリのルートに置かれ、クラス名は{モジュール名} _Boostrapでなければなりません。このブートストラップファイルによって、zend frameworkは自動的に新しいフォームディレクトリをオートローダーに追加します。

class Admin_Bootstrap extends Zend_Application_Module_Bootstrap {}

/ formsディレクトリにフォームクラスの追加。ログインフォームのファイル名はLogin.php、クラス名は{module name} _Form_Login

class Admin_Form_Login extends Zend_Form

同じモジュール内のコントローラファイルからフォームを呼び出す

$form = new Admin_Form_Login();

シンプルで効果的! ;)

3
追加された
あなたの答えをもっと明確にするために、解決策もあなたの答えを受け入れてください!
追加された 著者 Kees Schepers,
いいえ、あなたは正しいことをしましたが、私は受け入れられたとしてあなた自身の答えをマークします:)
追加された 著者 Kees Schepers,
私は確信していませんが、私はより多くの人々がそれをアドバイスし、それが許可されているか、または推奨されていると考えていることを見てきました。これをチェック: blog.stackoverflow.com/2009/01/accept-your-own-answers
追加された 著者 Kees Schepers,
@KeesSchepersは私がしたこととまったく同じです。私は数日後に何の反応もなかったので、答えはどこかで見つけました。それから、私は後で他の人に役立つように書くことを考えました。私は間違っていた?
追加された 著者 JellyBelly,
@KeesSchepers:私はそれをすることはできますか?ルール違反ですか?
追加された 著者 JellyBelly,
@KeesSchepers:ありがとう! ;)
追加された 著者 JellyBelly,
@KeesSchepers:私の答えを投票してください?
追加された 著者 JellyBelly,