ZendFrameworkで大規模なシステムのモジュール階層化についての実装方法

このQ&Aのポイント
  • ZendFrameworkを使って大規模なシステムのモジュール階層化を実装したいが、具体的な方法がわからない。
  • 大規模なシステムでは、モジュールの中にさらにモジュールを実装する必要があるが、具体的な階層化の方法がわからない。
  • 管理画面を一つで一元管理したいため、モジュールの階層化を実現したいが、具体的な実装方法が不明。
回答を見る
  • ベストアンサー

ZendFrameworkでModule階層化

会社のプロジェクトで最近ZendFramework(以下ZF)を使い始めたのですが、 いきなりハマりました・・・ というのもそこそこ大規模なシステムで、メニューがかなり深い階層になりそうです。 ・example.com/module/controller/action のような形式でモジュールというものがあってそれを使うと、まず機能の塊を作れるという所まではわかりました。(間違ってたらごめんなさい・・・) 参考URL:http://framework.zend.com/manual/ja/zend.controller.modular.html 例:blog管理・・・blogモジュール、ニュースページ管理・・・newsモジュール、etc・・・ しかし大規模なシステムですと当然機能というものがたくさんあって、モジュールの中にモジュール(他にうまい言い方わかりませんでした・・・)みたいな事も必要になると思います。 http://www.webresourcesdepot.com/wp-content/uploads/file/admin-template/index.html 上のページのように、上部のタブメニューがmodule、左メニューが子module、さらに孫module・・・なんて言うものが必要になるかもしれません。 その場合、moduleの階層化をしないとかなりグチャグチャなソースになりかねません。 理想としては ■blogの管理者管理 ・example.com/blog/admin/xxx/yyy module:blog 子module:admin コントローラ/アクション:xxx/yyy ■newsの管理者管理 ・example.com/news/admin/xxx/yyy module:news 子module:admin コントローラ/アクション:xxx/yyy のように、階層化してすっきりさせたいのですが、実装方法がわかりませんでした。 blogやnewsごとにドメイン分けろと言われるかもしれませんが、管理画面は一つで一元管理したいので、そこは譲れない所です。 どなたかmoduleの階層化に成功した方いらっしゃいましたら教えてください。 お願いします。

  • PHP
  • 回答数4
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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 で実装するということは、 古いバージョンのフレームワークをお使いでしょうか?(もしくは雛形を使用していない) そうすると使ったことがないので、的外れな回答の可能性もありますので、ご容赦ください。

forest-esp
質問者

補足

> 毎度未検証で申し訳ないですが、設定ファイルなど使うのであれば > 何でもできると思います。webサーバの設定でも可能かもしれません。 すいません、ちょっと私の今の知識では方法までは分かりませんでした・・・ ちなみにVersionは1.11で、雛形は使用していません。 ちょっと最初のモジュールの階層化という趣旨から外れてきたので、この質問は一度クローズして 自分で考えてみてダメなら再度新規で質問いたします。 色々ありがとうございました。

その他の回答 (3)

回答No.3

> 例えば、 > 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などのテンプレートエンジンの使用・未使用や、レイアウトの使用・未使用など)

forest-esp
質問者

補足

なるほど、そういう案もあるのですね。 少し思いついたのですが、ルーティングとかで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だけアクセスを許可する的なイメージです。 説明が分かりにくいかと思いますが、よろしくお願いします。

回答No.2

> $front = Zend_Controller_Front::getInstance(); > > $front->addModuleDirectory(APP_PATH . '/modules1'); > $front->addModuleDirectory(APP_PATH . '/modules2'); > > というように追加してみましたが、このページだけではモジュールの基底ディレクトリの変更を > どうすればいいのか、ということまでは読み取れませんでした。 > 試しにページにアクセスしてみたところ、最後に追加したモジュールディレクトリを使用しているようでした。 > > 使用するモジュールディレクトリの切り替えはどのように行えばよいのでしょうか? > 引き続きお願いいたします。 モジュールの基底ディレクトリというものがわからないですが、 modules1とmodules2配下のディレクトリに同一名のディレクトリ名(モジュール名)を配置して切り替えたいということでしょうか? そうだとすると、これ以上はNo Ideaなのですが、module1、module2などの配下には同名ではなく、ユニークになるようにモジュール名を決めてやる必要があると思います。あくまでモジュールの配置箇所を複数のディレクトリに分散させているだけであり、切り替えて使用するといったたぐいのものではないと思っています。 的を得た回答となっているか正直わかりませんが、回答します。

forest-esp
質問者

補足

> modules1とmodules2配下のディレクトリに同一名のディレクトリ名(モジュール名)を配置して切り替えたいということでしょうか? はい、まさにその通りです。 > そうだとすると、これ以上はNo Ideaなのですが、module1、module2などの配下には同名ではなく、ユニークになるようにモジュール名を決めてやる必要があると思います。あくまでモジュールの配置箇所を複数のディレクトリに分散させているだけであり、切り替えて使用するといったたぐいのものではないと思っています。 そうなのですか、、、そうするとexample.com/XXXのXXXに応じてルーティング設定するとかが一般的なのでしょうか? ルーティングについて詳しくないのですが、XXXの部分に応じてモジュールディレクトリを切り替える、なんてことは出来るのでしょうか? 例えば、 example.com/blogならapplication/modules/blog、 example.com/newsならapplication/modules/news、など のようにモジュールディレクトリを設定なんてできるのでしょうか? もしくは、ちょっと複雑になりそうなシステムの場合の階層分けなんてみなさんどのようにされているのか教えていただければ幸いです。

回答No.1

モジュールの階層化ではないですが、参考URL のようにモジュールディレクトリを 複数登録することで、2階層でも3階層でもディレクトリを分けることができそうです。 モジュール名はユニークである必要があると思われます。 残念ながら、URL とディレクトリ構成は一致しないと思いますが。

参考URL:
http://atamoco.boy.jp/php5/ZendFramework/resource/moduleDirectory.php
forest-esp
質問者

補足

アドバイスありがとうございます。 頂いたページを参考に $front = Zend_Controller_Front::getInstance(); $front->addModuleDirectory(APP_PATH . '/modules1'); $front->addModuleDirectory(APP_PATH . '/modules2'); というように追加してみましたが、このページだけではモジュールの基底ディレクトリの変更を どうすればいいのか、ということまでは読み取れませんでした。 試しにページにアクセスしてみたところ、最後に追加したモジュールディレクトリを使用しているようでした。 使用するモジュールディレクトリの切り替えはどのように行えばよいのでしょうか? 引き続きお願いいたします。

関連するQ&A

  • PHP ZendFrameworkについて

    PHP ZendFrameworkについて質問がございます。 ブログのようなシステムを作成しており、 フロントコントローラでのルータ設定で困っております。 サイトのURL構成を以下のように考えております。 ■ユーザー画面 http://domain/blogId/controller/action/* ■ブログ所有者の管理画面 http://domain/blogId/module/controller/action/* ※blogIDには、任意の半角英数字が入ります。 ※管理画面の module には "admin" が入る予定です。 ■記述したソース ----------------------------------------------------- // フロントコントローラのインスタンス $front = Zend_Controller_Front::getInstance(); // モジュールディレクトリの設定 $front->addModuleDirectory(_SYS_PATH_.'app/modules'); // ルータを取得 $router = $front->getRouter(); // ルートを設定する $newRoute = array('blogId' => 'none', 'module' => 'default', 'controller' => 'index', 'action' => 'index' ); $route = new Zend_Controller_Router_Route(':blogId/:module/:controller/:action/*', $newRoute); $router->addRoute('default', $route); // ディスパッチする $front->dispatch(); ----------------------------------------------------- 上記のソースで、 ブログ所有者の管理画面はいいのですが、 ユーザー画面で、 http://domain/blogId/controller/action/* とアクセスすると controller が module になってしまいます。 http://domain/blogId/controller/action/* と、moduleを省いた場合は default のモジュールを呼び出せるようにしたいのです。 さらに モジュール を追加するとして、そのモジュールにアクセスする場合は、 http://domain/module/controller/action/* と blogId をはずしてアクセスしたいのですが、可能でしょうか? 初歩的なことかと思いますが、ご教授のほど宜しくお願い致します。

    • 締切済み
    • PHP
  • zendframeworkの階層

    zendframeworkの階層について質問です。階層を深くした場合の構造が理解できません。 例えばexsample.com/test/というURLの場合 /application/controllers/TestController.php class TestControllerAction extends Zend_Controller_Action { public function indexAction() { //略 } } とすればこれで問題なく動作しますが exsample.com/hoge/test/というURLの場合はどのようにしたらいいですか? ルーター?の設定等は特に変更はしておらずデフォルトの状態で利用しています。

    • ベストアンサー
    • PHP
  • ZendFrameworkでコントローラを作る単位

    Zend Frameworkで、コントローラを作る単位は、どのように決めていますか? たとえば、ユーザ管理をするとして、UserController.phpというものを作り、追加・更新・削除のアクションを作るとすると、一つのアクションに、入力・確認・実行の3画面が必要というような要求だと、コントローラのなかみがごちゃごちゃになってしまいます。 ですので、UserAddController.phpというようなコントローラを作り、inputAction,confirmAction,executeActionというようなアクションを作ろうかと考えています。 もちろん自由だとは思いますが、皆さんはどのようにしているのか教えてもらえればと思います。

    • ベストアンサー
    • PHP
  • ゾーンファイルの書き方について

    正引きゾーンファイルの書き方について質問です。 自ドメイン:example.com レンタルセカンダリDNSサーバー:ns.hogehoge.com のレコードを書く際、NSレコードは IN NS ns.example.com. IN NS ns.hogehoge.com. で問題ないですが、Aレコードにns.hogehoge.comを書くべきなのかどうかがわかりません。 ns IN A xxx.xxx.xxx.xxx ns.hogehoge.com. IN A yyy.yyy.yyy.yyy example.comのゾーンレコードにns.hogehoge.comのAレコードを書いても意味がないと思うのですが、 ・書くのが正しいのか、書かないのが正しいのか ・その理由 についてお教えいただけませんでしょうか。 自分なりに調べたのですが、ns.hogehoge.comのAを書くことになっている例を見つけたりして、よくわかりませんでした。

  • バーチャルホストで、同じページをSSLとNon-SSLでアクセスできるようにしたい

    VPSでレンタルサーバをかりています。 (仮想のroot権限を持っています) で、バーチャルホストを以下のようにしています。 ====================================== NameVirtualHost xxx.xxx.xx.xx <VirtualHost xxx.xxx.xx.xx> <Directory /var/www/example.com/htdocs> Options FollowSymLinks AllowOverride All Order allow,deny Allow from all </Directory> ServerAdmin webmaster@example.com DocumentRoot /var/www/example.com/htdocs ServerName example.com ErrorLog /var/log/example.com-error_log CustomLog /var/log/example.com-access_log common </VirtualHost> <VirtualHost xxx.xxx.xx.xx> <Directory /var/www/www.example.com/htdocs> Options FollowSymLinks AllowOverride All Order allow,deny Allow from all </Directory> ServerAdmin webmaster@example.com DocumentRoot /var/www/www.example.com/htdocs ServerName www.example.com ErrorLog /var/log/www.example.com-error_log CustomLog /var/log/www.example.com-access_log common </VirtualHost> <VirtualHost xxx.xxx.xx.xx> <Directory /var/www/admin.example.com/htdocs> Options FollowSymLinks AllowOverride All Order allow,deny Allow from all </Directory> ServerAdmin webmaster@example.com DocumentRoot /var/www/admin.example.com/htdocs ServerName admin.example.com ErrorLog /var/log/admin.example.com-error_log CustomLog /var/log/admin.example.com-access_log common </VirtualHost> ====================================== で、 http://example.com/fdsfdshhfdsh http://www.example.com/fdsfdshhfdsh http://admin,example.com/fdsfdshhfdsh にアクセスできるわけですが、 https://example.com/fdkjsjf のようにSSLでアクセスできるようにしたいと思っています。 で、 「DocumentRoot /var/www/example.com/htdocs」はSSLなしの場合と同様にしたいと思います。 (SSL,NON-SSLは、ファイルを共有) こうするには、どうすればいいのでしょうか? どなたか教えていただければ幸いです。

  • メールサーバのみの移行について

     これまでメールサーバは、1台のサーバ機に、ウェブ、DNSサーバと共存させた形で構築してきたのですが、今後のためにと、別にサーバ機を構築して運用させた方が良いと思って、CentOS5にて、Postfix+Dovecot+LDAPの組み合わせによる構築をし、SMTPサーバでの動作確認まで終わりました。 ※ちなみに、現行サーバは、FedoraCore5にて、Postfix+Qpopperで運用しています。  現行のサーバ機からいきなりメールサーバを変更するのは不安だったので、現行サーバのプライマリDNSのゾーンの記述を以下のように変更しました。最終的には現行のメールサーバのみを止めて、新メールサーバの方で運用予定です。 ----------------------------------------------- (変更前) IN MX 10 curmail.example.com. curmail IN A xxx.xxx.xxx.xxx ----------------------------------------------- (変更後) IN MX 10 curmail.example.com. IN MX 20 newmail.example.com. curmail IN A xxx.xxx.xxx.xxx newmail IN A yyy.yyy.yyy.yyy -----------------------------------------------  ネット上への浸透は完了し、セカンダリDNS登録サイトでのDNS Configuration Checkerで確認をしたところ、 ※該当箇所あたりを抜粋しています。 ------------------------------------------------------------- You have 2 mail exchangers. Checking also if mail exchangers accept mail for your domain newmail.example.com priority 20 Server does not accept mail for example.com curtmail.example.com priority 10 OK. Accepts mail -------------------------------------------------------------  上記のような警告メッセージを出しているのですが、メールを受け入れられないという意味だと思いますが、考えられる原因は分かりますでしょうか?  新メールサーバ側の設定としては、ネットワーク設定の基本設定はしてあります。DNSサーバとしての機能は入れないので、bindのインストールや設定作業もやっていません。設定の不備があるとすれば、どのあたりになりますでしょうか?必要があれば設定ファイルの中身も載せようと思います。  初歩的なミスだとは思いますが、アドバイスの方を宜しくお願いします。

  • 独自ドメインでのアクセス制限

    現在、一つのロリポップサーバーでの独自ドメインでサイトとブログを運営しています。 ・サイト:ttp://www.Example.com(主) ・ブログ:ttp://blog.Example.com(サブドメイン) .htaccessで特定のIPからのアクセス制限をしたいと思っているんですが、下記のように記載しても制限されません。(試しに自分のIPも入れて試みました。) order allow,deny allow from all deny from xxx/0 deny from yyy/0 deny from zzz/0 ErrorDocument 403 403.html 主にサブドメインのブログのアクセス制限をしたいのですがサブドメインディレクトリに置いて.htaccessに名前を変更しても制限されません。 また、403.htmlも.htaccessと同じサブドメインディレクトリに置いてあります。 何か間違っている事があるでしょうか??

  • Zend Frameworkでoracle接続

    Zend Frameworkを勉強しようと思い始めたばかりのものです。 oracleに繋がらずどこをチェックすればよいのかさっぱりわかりません。 どなたかご教授願えないでしょうか? zfツールを使い雛形を作って、module で分けてみたり、ヘッダー、フッターをlayoutを使って分けたりと少し前進しました。 次はDB接続だと思い始めたのですが繋がりません。 ■環境 CentOS release 5.6 (Final) ■やったこと 1)oracle接続モジュール oci8 をインストール # export ORACLE_HOME=/opt/oracle/product/10.2.0/db # pecl install oci8 php.ini に追記 # vi /etc/php.ini extension=oci8.so 2)ローカルで接続テスト これは問題なく接続できてるみたいなのです。 # more test.php <?php putenv("ORACLE_HOME=/opt/oracle/product/10.2.0/db"); putenv("LD_LIBRARY_PATH=:/opt/oracle/product/10.2.0/db/lib"); // Zend_Dbライブラリの読み込み require_once 'Zend/Loader.php'; require_once 'Zend/Db.php'; $dbInit = array( 'host' => 'localhost', 'username' => 'usrxx', 'password' => 'usrxx', 'dbname' => 'xxdb' ); $db = Zend_Db::factory('oracle', $dbInit); $db->getConnection(); echo 'OK'; $db->closeConnection(); # php test.php OK 3)Zend Frameworkで接続テスト IndexController.php の indexAction でやってみたのですがダメなのです。 public function indexAction() { $dbInit = array( 'host' => 'localhost', 'username' => 'usrxx', 'password' => 'usrxx', 'dbname' => 'xxdb' ); $db = Zend_Db::factory('oracle', $dbInit); $db->getConnection(); $db->getConnection(); echo 'OK'; $db->closeConnection(); } ※/etc/sysconfig/httpdに以下を追加しました export ORACLE_HOME=/opt/oracle/product/10.2.0/db export LD_LIBRARY_PATH=/opt/oracle/product/10.2.0/db/lib 実行するとどうしてもエラーとなります。 ■エラーメッセージ An error occurred Application error Exception information: Message: Unknown exception Stack trace: #0 /home/www/zf/venders/ZendFramework-1.11.11/library/Zend/Db/Adapter/Abstract.php(315): Zend_Db_Adapter_Oracle->_connect() #1 /home/www/zf/application/modules/default/controllers/IndexController.php(30): Zend_Db_Adapter_Abstract->getConnection() #2 /home/www/zf/venders/ZendFramework-1.11.11/library/Zend/Controller/Action.php(516): IndexController->indexAction() #3 /home/www/zf/venders/ZendFramework-1.11.11/library/Zend/Controller/Dispatcher/Standard.php(295): Zend_Controller_Action->dispatch('indexAction') #4 /home/www/zf/venders/ZendFramework-1.11.11/library/Zend/Controller/Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) #5 /home/www/zf/venders/ZendFramework-1.11.11/library/Zend/Application/Bootstrap/Bootstrap.php(97): Zend_Controller_Front->dispatch() #6 /home/www/zf/venders/ZendFramework-1.11.11/library/Zend/Application.php(366): Zend_Application_Bootstrap_Bootstrap->run() #7 /home/www/htdocs/shopping/necs/zf/index.php(29): Zend_Application->run() #8 {main} Request Parameters: array ( 'controller' => 'index', 'action' => 'index', 'module' => 'default', ) どこを確認すればよいかのサッパリわからず投稿させていただきました。 何卒よろしくお願いします。

    • 締切済み
    • PHP
  • PHPMailerにて添付ファイルをつけるには?

    PHPMailerにて添付ファイルをつけるにはどのようにしたらよいでしょうか? 【前提】 Zendにて開発。 Pdfファイルをblob型でDB(MySQL)に入れています。 DB上にある指定のPDFファイルをメールにて添付して、送信するサービスを追加したいと考えています。 【備考】 ・ZendのActionにてDB上のPDFファイルをダウンロード、ブラウザ上で閲覧することはできました。 ・ファイルのパス(http://www.xxx.com/article/id/1)を指定してPHP Mailerにて添付を試みても、「Could not access file:http://www.xxx.com/article/id/1」とエラーメッセージが生じます。 お手数おかけしますが、何卒よろしくお願い致します。

    • ベストアンサー
    • PHP
  • G-mailをOEのユーザー切り替えで使用したい

    本日は『G-mail』のことでお伺いします。 G-mailで顧客インフォメーション用に「xxx.contact」というアカウントを作りました。 OEの『ファイル』>『ユーザーの切り替え』G-mailを読みたいのですが、設定が上手くいきません。 現在は「ひとつのアカウント」で、『A(yyy.co.jp)』『B(yyy.co.jp)』『xxx.contact(gmail.com)』が混在しています。 できれば、間違いが無いように、「yyy.co.jp」と「gmail.com」を『ユーザーの切り替え』で対応したいのですが…… http://mail.google.com/support/?ctx=gmail&hl=ja&labs=1 http://gmail.1o4.jp/pop.html http://bizmakoto.jp/bizid/articles/0709/21/news127.html 上記を読み設定したのですが…… ご指導願えますか?

専門家に質問してみよう