- ベストアンサー
ZendFrameworkで大規模なシステムのモジュール階層化についての実装方法
- ZendFrameworkを使って大規模なシステムのモジュール階層化を実装したいが、具体的な方法がわからない。
- 大規模なシステムでは、モジュールの中にさらにモジュールを実装する必要があるが、具体的な階層化の方法がわからない。
- 管理画面を一つで一元管理したいため、モジュールの階層化を実現したいが、具体的な実装方法が不明。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> しかしデフォルトの設定ですとルーティングを追加しておいても > ・example/blog_admin/list/index > ・example/blog/admin/list/index > この二つは同じコントローラーを見に行っていると思うので、example/blog_admin/list/indexでのアクセスを禁止したいのですが、可能でしょうか? 毎度未検証で申し訳ないですが、設定ファイルなど使うのであれば 何でもできると思います。webサーバの設定でも可能かもしれません。 $_SERVER['REQUEST_URI'] とかで URL を取得してもいいし、 フレームワークを使うのであれば、以下のように取得して、 アクセスされたくないリクエストをフィルタリングすればよいのではないかと思います。 $front = Zend_Controller_Front::getInstance(); $requestUri = $front->getRequest()->getRequestUri(); getRequestUri では、http(s):/ などのスキーム以降の文字列が返されます。 前回の回答では 「bootstrap あたりで」みたいに記述しましたが、 フロントコントローラにリクエストオブジェクトが格納される前かも知れないので プラグインあたりで実装されるのが良いかもしれません。申し訳ないです。 なお、どこで実装してもいいと思いますが、 index.php で実装するということは、 古いバージョンのフレームワークをお使いでしょうか?(もしくは雛形を使用していない) そうすると使ったことがないので、的外れな回答の可能性もありますので、ご容赦ください。
その他の回答 (3)
- nobukazudash
- ベストアンサー率100% (1/1)
> 例えば、 > example.com/blogならapplication/modules/blog、 > example.com/newsならapplication/modules/news、など > のようにモジュールディレクトリを設定なんてできるのでしょうか? ルーティングでもできそうですが、今はこちらで検証できないので、 確実にできそうな例ですと、(返って複雑なような気もするので、おすすめはできませんが・・) 1.ドキュメントルート配下にindex.php や .htaccess を配置していると思いますが blog や news フォルダをドキュメントルート配下に作成し、それぞれのディレクトリに index.php と .htaccess をそれぞれ配置する。APPLICATION_PATH は変更する必要あり。 2.$front = Zend_Controller_Front::getInstance(); $baseUrl = $front->getBaseUrl(); のようにベースURLを取得して、URL に応じて addModuleDirectory でモジュールを設定する (デフォルトモジュールのBootstrap あたりかな?) といった手順で可能だとは思われます。 ※もう少し、すっきりした記述方法・配置方法もあるかもしれません。特に1.の部分 > もしくは、ちょっと複雑になりそうなシステムの場合の階層分けなんて > みなさんどのようにされているのか教えていただければ幸いです。 個人的な意見ですので一般的ではないかもしれませんが、 せっかく一から設計できるようなので、3階層(モジュール・コントローラ・アクション)で 収まるよう検討したほうが良いと思われます。 もちろん、モジュールなのでお互い依存せずに個々に着脱可能であればなお良いと思います。 また、特にビューと合わせて検討することをお勧めします。 (smartyなどのテンプレートエンジンの使用・未使用や、レイアウトの使用・未使用など)
補足
なるほど、そういう案もあるのですね。 少し思いついたのですが、ルーティングとかでURLからモジュール、コントローラ、アクションへの振り分けを完全手動にする方法と言うのはあるのでしょうか? 例えば、 $front->addModuleDirectory(APP_PATH . '/modules'); でモジュールのディレクトリを定義して ・example/blog/admin/list/indexなら module:blog_admin controller:list action:index ・example/news/admin/list/indexなら module:news_admin controller:list action:index 等にして置けばなんとなくURLの上ではサブモジュール的な事が出来そうな感じがします。 ※:モジュール名にアンダースコアが使えるかは不明ですが、あくまで例の話ですので、もし使えない場合は御容赦ください。 しかしデフォルトの設定ですとルーティングを追加しておいても ・example/blog_admin/list/index ・example/blog/admin/list/index この二つは同じコントローラーを見に行っていると思うので、example/blog_admin/list/indexでのアクセスを禁止したいのですが、可能でしょうか? イメージとしては設定ファイルなんか使って、index.phpで $front->getRouter()->addRoute( 'blog_admin', new Zend_Controller_Router_Route('blog/admin/list/index', array( 'module' => 'blog_admin', 'controller' => 'list', 'action' => 'index')) ); などで追加したURIだけアクセスを許可する的なイメージです。 説明が分かりにくいかと思いますが、よろしくお願いします。
- nobukazudash
- ベストアンサー率100% (1/1)
> $front = Zend_Controller_Front::getInstance(); > > $front->addModuleDirectory(APP_PATH . '/modules1'); > $front->addModuleDirectory(APP_PATH . '/modules2'); > > というように追加してみましたが、このページだけではモジュールの基底ディレクトリの変更を > どうすればいいのか、ということまでは読み取れませんでした。 > 試しにページにアクセスしてみたところ、最後に追加したモジュールディレクトリを使用しているようでした。 > > 使用するモジュールディレクトリの切り替えはどのように行えばよいのでしょうか? > 引き続きお願いいたします。 モジュールの基底ディレクトリというものがわからないですが、 modules1とmodules2配下のディレクトリに同一名のディレクトリ名(モジュール名)を配置して切り替えたいということでしょうか? そうだとすると、これ以上はNo Ideaなのですが、module1、module2などの配下には同名ではなく、ユニークになるようにモジュール名を決めてやる必要があると思います。あくまでモジュールの配置箇所を複数のディレクトリに分散させているだけであり、切り替えて使用するといったたぐいのものではないと思っています。 的を得た回答となっているか正直わかりませんが、回答します。
補足
> modules1とmodules2配下のディレクトリに同一名のディレクトリ名(モジュール名)を配置して切り替えたいということでしょうか? はい、まさにその通りです。 > そうだとすると、これ以上はNo Ideaなのですが、module1、module2などの配下には同名ではなく、ユニークになるようにモジュール名を決めてやる必要があると思います。あくまでモジュールの配置箇所を複数のディレクトリに分散させているだけであり、切り替えて使用するといったたぐいのものではないと思っています。 そうなのですか、、、そうするとexample.com/XXXのXXXに応じてルーティング設定するとかが一般的なのでしょうか? ルーティングについて詳しくないのですが、XXXの部分に応じてモジュールディレクトリを切り替える、なんてことは出来るのでしょうか? 例えば、 example.com/blogならapplication/modules/blog、 example.com/newsならapplication/modules/news、など のようにモジュールディレクトリを設定なんてできるのでしょうか? もしくは、ちょっと複雑になりそうなシステムの場合の階層分けなんてみなさんどのようにされているのか教えていただければ幸いです。
- nobukazudash
- ベストアンサー率100% (1/1)
モジュールの階層化ではないですが、参考URL のようにモジュールディレクトリを 複数登録することで、2階層でも3階層でもディレクトリを分けることができそうです。 モジュール名はユニークである必要があると思われます。 残念ながら、URL とディレクトリ構成は一致しないと思いますが。
補足
アドバイスありがとうございます。 頂いたページを参考に $front = Zend_Controller_Front::getInstance(); $front->addModuleDirectory(APP_PATH . '/modules1'); $front->addModuleDirectory(APP_PATH . '/modules2'); というように追加してみましたが、このページだけではモジュールの基底ディレクトリの変更を どうすればいいのか、ということまでは読み取れませんでした。 試しにページにアクセスしてみたところ、最後に追加したモジュールディレクトリを使用しているようでした。 使用するモジュールディレクトリの切り替えはどのように行えばよいのでしょうか? 引き続きお願いいたします。
補足
> 毎度未検証で申し訳ないですが、設定ファイルなど使うのであれば > 何でもできると思います。webサーバの設定でも可能かもしれません。 すいません、ちょっと私の今の知識では方法までは分かりませんでした・・・ ちなみにVersionは1.11で、雛形は使用していません。 ちょっと最初のモジュールの階層化という趣旨から外れてきたので、この質問は一度クローズして 自分で考えてみてダメなら再度新規で質問いたします。 色々ありがとうございました。