8

application左側の通常のフォルダー構造(フォルダーが含まれているmodels,views,controllers)から、モジュールベースのフォルダー構造(個々のモジュールが含まapplicationれているフォルダーが含まれている)に移行する方法について、段階的な説明を探しています。modules自分のmodels,views,controllers

zendでは最初からモジュールアーキテクチャを使用してプロジェクトを作成できるとは思わないので、「変換」と言いますが、そうすると、それが膨らみ、これらのフォルダ構造を手動で変更する必要がなくなります。

http://img375.imageshack.us/img375/5582/foldersboth.jpg

これが私のこれまでの経験です

  • モジュールを作成するzf create module productと、modulesフォルダーが生成され、そのproduct中にフォルダーが生成されviews,controllers,models、そのモジュールのforも生成されます。

  • ただし、メインviews,controllers,modelsmodules/default独自のフォルダーに移動する必要もあります。そのフォルダを手動で作成してメインをそこに移動すると、そのモジュールviews,models,controllersに新しいコントローラを追加しようとするとバグが発生します。defaultバグは、デフォルトのコントローラーフォルダーが手動でに移動されたことを認識しないため、メイン(現在は欠落している)を再生成し、その新しいコントローラーを挿入することです。views,controllers,modelsapplicationapplication/controllers/newcontapplication/modules/default/controllers/

  • それに対する私の解決策はzf create module default、メインをそこにコピーするviews,models,controllersことでした。それは同じように見えることになりますが、どういうわけかzf create module方法は違いを生みます。このようにすると、新しいコントローラーが正しく追加され、追加されapplication/modules/default/controllersませんapplication/controllers

問題の半分は解決しました。しかし、アプリケーションを表示しようとすると、ビューから何も表示されませんindex/index。エラーも発生しませんが、何も表示されません。index/indexビューが移動したことをアプリケーションが認識していないためだと思います。

  • これは以前は次の場所にありましたapplication/views/scripts/index/index.phtml
  • しかし、現在はに位置していますapplication/modules/default/views/scripts/index/index.phtml

application.iniまたはbootstrap.phpまたはその他の場所に変更を加える必要があると思います。では、これをスムーズに実行して機能させるための手順は正確には何ですか?最新のZF1.10.8を使用しています。正確な手順に混乱が生じないように、新しいzendプロジェクトの作成から始めてください。

4

2 に答える 2

10

これが私があなたの例に(最初から)従うためにしたことです:

$ zf create project .
$ zf create module product
$ zf create module default

次にcontrollers、からに移動modelsしました。views./application./application/modules

次に、application.iniを開き、次の行を置き換えました(ZFに非モジュラーアプリのコントローラーの場所を指示します)。

resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"

と:

resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"

これは、ZFにモジュールの場所を指示します。

次に、製品モジュールのインデックスコントローラーを手動で作成して、これが機能することをテストできるようにしました。次に、http:// localhost / index / indexを押して、デフォルトのモジュールインデックスアクションがまだ機能するかどうかを確認しましたが、機能しませんでした。代わりに、エラーが発生しました。

致命的なエラー:キャッチされない例外'Zend_Controller_Dispatcher_Exception'とメッセージ'Invalid controller class( "Default_ErrorController")' in ...

これがあなたがたどり着いた場所のように聞こえます。

このエラーを修正する方法は2つあり、ドキュメントは非常に誤解を招く可能性があります(おそらく間違っています)。それは述べています:

デフォルトのモジュールでは、コントローラーは名前空間プレフィックスを必要としないことに注意してください。したがって、上記の例では、デフォルトモジュールのコントローラーは「Default_」のプレフィックスを必要としません。これらは、ベースコントローラー名「IndexController」および「FooController」に従って単にディスパッチされます。ただし、名前空間プレフィックスは他のすべてのモジュールで使用されます。

しかし、明らかに上記のエラーは、ZFがDefault_ErrorControllerと呼ばれるErrorControllerクラスを探していることを示しています。これを修正するには、次の2つのいずれかを実行できます。

  • application / modules / default / controllers / IndexController.phpのクラス名をからに変更し、application / modules / default / controllers/ErrorController.phpをIndexControllerからDefault_IndexControllerErrorController変更します。Default_ErrorController
  • または、次の行を削除します。

    resources.frontController.params.prefixDefaultModule = "1"

application.iniから。この行は、デフォルトのモジュールクラスで「Default_」名前空間を使用するようにZFに指示しているため、これがないと、「IndexController」を検索するだけです。後者のオプションを選択したところ、http:// localhost / index/indexが期待どおりに機能しました。

あなたの場合、/ index / indexに空白のページがあると言いました。これは、次のいずれかを意味します。

  • あなたは別の問題を抱えています
  • 開発モードでエラーが無効になっています
  • エラーがデフォルトで無効になっている本番モードで実行している(ほとんどの場合)

最後のオプションを確認するには、application.iniを開き、本番セクションで一時的phpSettings.display_errorsに0から1に変更します。その後、上記と同じエラーが発生した場合は、すべてが機能するようになることを願っています。

これがお役に立てば幸いです。私が言えるのは、アプリの管理をZend_Toolに依存しすぎないことです。すべてを実行できるわけではなく、多くの場合、すべてを実行するよりも手動で移動する方が簡単です。zfコマンド。特にリストラの場合。

于 2010-10-12T22:20:43.783 に答える
1

さて、私はNetbeansIDEで開発しました。

http://i.stack.imgur.com/n9Zjn.jpg

初心者のIm:P(10ポイントが必要)

各ブートストラップには次のものが必要です。

<?php 
// Public_Bootstrap replace for Blog_Bootstrap or Administrator_Bootstrap
// well its for me
class Public_Bootstrap extends Zend_Application_Module_Bootstrap {

}

メインブートストラップ:

<?php
    class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {

       protected function _initAutoLoad() {

          $modLoader = new Zend_Application_Module_Autoloader(
                    array(
                        'namespace' => '',
                        'basePath' => APPLICATION_PATH . '/modules/public'
                    )
          );        

          return $modLoader;
       }
       public function _initViewHelpers() {

          $this->bootstrap(array('frontcontroller', 'view'));
          $view = $this->getResource('view');
          $view->doctype('XHTML1_STRICT');
          $view->headMeta()->appendHttpEquiv("Content-Type", "text/html;charset=UTF-8")
            ->appendName("description", "Some description");
     }
  }

application.ini:

[production]
resources.modules[] =
phpSettings.display_startup_errors = 0 
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php" 
bootstrap.class = "Bootstrap" 
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"

resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.frontController.defaultmodule = "public" 
resources.frontController.prefixDefaultModule = true  

resources.view[] = 

resources.db.adapter = PDO_MYSQL
resources.db.isDefaultTableAdapter = true 
resources.db.params.host ="localhost"
resources.db.params.username ="yourUser"
resources.db.params.password ="yourPassword"
resources.db.params.dbname ="DBName"

私のブートストラップには、プラグインを含む、より多くのコードがあります。

于 2010-10-12T17:16:22.560 に答える