Zend Frameworkについての質問

このQ&Aのポイント
  • Zend Frameworkを勉強中の質問者が、routeStartup、routeShutdown、dispatchLoopStartup、preDispatch、postDispatch、dispatchLoopShutdownというメソッド内でどのような処理を行うべきか悩んでいます。
  • 質問者はDB接続、認証、PCと携帯サイトの切り替え、文字コード変換などの処理が考えられると考えていますが、具体的な実装場所について混乱しています。
  • 質問者はBootstrap.phpで全ての初期設定を行っており、メソッドの増加によりソースコードが長くなってしまっています。プラグインを使って各処理を分離する考えもありますが、正しい方法かどうか不安です。
回答を見る
  • ベストアンサー

zendframeworkについて

zendframeworkを勉強中です。 マニュアルを読んでもプラグインについて理解が深められず質問なのですが 下記のメソッド内でどのような処理を行うべきなのでしょうか? ・routeStartup ・routeShutdown ・dispatchLoopStartup ・preDispatch ・postDispatch ・dispatchLoopShutdown 考えられるのは・・・ DB接続、認証、PCと携帯サイトの切替え、文字コード変換などでしょうか? しかし、文字コードの変換はビューのヘルパーの方が妥当な気もしますが何を どこで処理すべきなのかこんがらかっております・・・ 人によって実装する処理も異なるかと思うのですが一般的な流れなどを教えて いただけますと幸いです。 ちなみに現在は、DBの接続など初期設定を全てBootstrap.phpで行っています。 ※_initDb()など セッションの開始などもBootstrap.phpで行っており、初期設定が増えるに つれて、メソッドも増えるのでソースも長くなってしまいます。 後のメンテを考慮しそれぞれの処理を各プラグイン化しようかと思っている のですがこのような使い方は正しいでしょうか? 最初は、下記のように1つのプラグインを作成しメソッドが実行される タイミングに合わせDBの接続など必要な処理を行い、これで完結すれば いいかと思ったのですが結果、現在のBootstrap.phpと同様です。 class Ext_Plugin_Setup extends Zend_Controller_Plugin_Abstract { public function routeStartup(Zend_Controller_Request_Abstract $request) { echo 'routeStartup<br>'; } public function routeShutdown(Zend_Controller_Request_Abstract $request) { echo 'routeStartup<br>'; } public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request) { echo 'routeStartup<br>'; } public function preDispatch(Zend_Controller_Request_Abstract $request) { echo 'routeStartup<br>'; } public function postDispatch(Zend_Controller_Request_Abstract $request) { echo 'routeStartup<br>'; } public function dispatchLoopShutdown() { echo 'routeStartup<br>'; } } 無理にプラグインを使わなくても・・・という事も考えられますが理解を 深めたく思っておりますので詳しい方がいらっしゃいましたらアドバイス お願いいたします。

  • dcx147
  • お礼率33% (214/636)
  • PHP
  • 回答数4
  • ありがとう数4

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

  • ベストアンサー
回答No.4

私も、最近になってZend_Frameworkを触り始めたので、丁度勉強になったので色々調べてみました。 ちょっと、すでに分かりきっていることも含めて書きますがお付き合い下さい。 Zend_ApplicationでZend Frameworkを使う場合、Bootstrapクラス内で、今つくっているApplication内に必要なクラスやコンフィグなどを全部初期化します。 ■Bootstrapはどう動いているのか Zend_Applicationにて、Bootstrapのインスタンスが呼ばれて実行される際、PHP標準クラスのReflectionClass(または、get_calss_methods関数)にて、Bootstrap内に自分で記述した「_initXXX」という命名のものをすべて配列に書き出してきて、 それらのメソッドを全部一括で叩きます。 <?php class Bootstrap extends .......{ protected function _initBar(){ echo "Hoge!!!"; } protected function _initFoo(){ echo "Foo!!"; } } ?> このように記述してやると自動的に、_initBarと_initFooは実行され、出力の先頭に、「Hoge!!!」「Foo!!」とechoされます。 つまり、自分が必要なクラスの初期化やクラスの設定なんかを適当な命名で、_initXXXと記述して、そのメソッド内に 設定処理を書いてやれば、自動的にそれらが設定されるというものです。 この説明は質問文を見る限り、分かっているということですよね。 ■Zend_Controller_Frontはいつ呼ばれるのか これは、Zend_Application_Bootstrap_Bootstrapのコンストラクタで、予め、Zend_Application_Resource_Frontcontrollerというクラスで予約されています(左記のクラスからFrontControllerのインスタンスが返されるようになってる) これがクラス変数(配列)の中に「frontcontroller」というキーで格納されてます。 その為、前述した「_initXXX」内で、「$this->bootstrap('frontcontroller');」などと叩くと、予めfrontcontrollerが予約されているので、インスタンスが生成され、実行準備完了となり、 「$this->getResource('frontcontroller');」を実行すると、Zend_Controller_Frontのインスタンスが取得出来るようになります。 ■で、どうすればいいのか。 上記のルールから、とにかく、適当なinitメソッドを作ってやり、好きなところで記述してやればよいということになります。 <?php protected function _initRegisterPlugins(){ //frontcontrollerのインスタンスを作成 $this->bootstrap('frontcontroller'); //インスタンスが上記で作成されているので、今度は取得 $front = $this->getResource('frontcontroller'); //これでFrontが呼べているので、プラグインを登録 $front->registerPlugin(new Your_Plugin()); } ?> となります。 ■application.iniはいつ設定されているか Zend_Applicationで、iniの内容がOptionとして取得されていて、Zend_Application_Bootstrap_Boostrapのコンストラクタ内で、全部の値を取得しなおし、setOptionsで一括投入をしているようです。 とりあえず、具体的な処理の内容は、Zend_Application_Bootstrap_BootstrapAbstract内にあったので、ソースも一度追って見るといいかもしれません。

その他の回答 (3)

回答No.3

現象確認しました。良く調べてなくてすみません。 内容把握したので、Zend_Layoutがなにやっているのか、説明します。 Zend_Layoutは、これのインスタンスを作成すると、同時に、Zend_Layout_Controller_Plugin_Layoutをプラグインに登録します。 その登録を行う際、 Zend_Controller_Front::registerPluginの第二引数に、動作順序を登録していました。 <?php $front->registerPlugin($plugin_layout, 99); //みたいな感じで。 ?> で例の通り、実際に99番目、に登録してました。100番目が、Zend_Controller_Plugin_ErrorHandlerです。 Zend_Layout_Plugin_Layoutは、ソレより前に出力した全部の出力を、Layout(/layouts/layout.phtml)の中に全部パックする挙動を取ります。 <?php public function postDispatch($request){ $response = $this->getResponse(); $content = $response->getBody(); $content = $this->layout()->render($content); $response->setBody($content); } //イメージです。Responseの中にある全部の内容を取得して、Layoutの中に収めて、もう一度Responseの中に戻す。 ?> というわけですので、今回文字コードを変更するプラグインを作る場合は、 <?php $front->regsiterPlugin(new Your_Plugin_Name(), 101); ?> というように、一番最後に登録するようにすれば、Layout含めすべてを変換出来ます。 といった感じでした。 ここから、学べることとして、 何か、例えば、Your_Mobileクラスというモバイルに特化した何かのライブラリを作ったとして、 ソレのインスタンスを生成するとともに、Your_Mobile_Plugin_Convertクラスとかプラグインも作り、ソレをregisterPluginとすると 統合的なライブラリとして動かしたりするのが楽になったりするかもしれませんね。(他にもZend_Controller_Action_Helperとかも。) 如何でしょうか。

dcx147
質問者

お礼

お返事ありがとうございます。 わざわざ試していただいたようで本当に感謝です! プラグインの実行する順番を101として試したところ下記の内容でOKでした。 $response = $this->getResponse(); $content = $response->getBody(); //$content = $this->layout()->render($content); $content = mb_convert_encoding($content, 'SJIS-win', 'UTF-8'); $response->setBody($content); 順番があるなんてマニュアルを見ても全くわかりませんでしたしアドバイスを いただいたおかげでコツを掴む事ができ、試しながら他の処理もプラグインで 作成できるようになりました! 1つ気になっている事がありこれで最後にしたいと思うのですが・・・ プラグインの登録など全てapplication.iniで行っているのですが探し方が わるいのかマニュアルでよくみる下記の書式がみあたりません。 $front = Zend_Controller_Front::getInstance(); インスタンスを取得して$front->registerPluginのようなインスタンスありきの 処理が必要な場合にはどうすればいいのでしょうか? インスタンスなしでメソッドを実行してもエラーになってしまいますよね? 当然、見えないところで内部的に処理を行っているのは間違いないと思うのですが 不思議です。

回答No.2

プラグインで、 $this->getResponse(); をした時に取得されるものというのは、 Zend_Controller_Response_Http というクラスになります。 このクラスは、header関数などで吐き出すHTTPヘッダと、HTTPのBODY部分(つまりHTMLやXML)を格納するオブジェクトです。 基本的には、Controller_Action内とか適当な場所でechoを行っても、最終的にこのResponseオブジェクトに出力が格納されてます。 Zend_Viewも、renderした後その場でechoしているのではなく、Responseオブジェクトに出力したテンプレートが格納されているイメージです。 ですので、Ext_View_Smartyは、参考サイトに記述されているまま使用して、プラグイン側で、私が書いたコードをそのまま使うと、解決すると思います。 ■とても大雑把な処理の流れ 1.Zend_Controller_Request_Httpにクライアント(お客さん/Webブラウザ)からの要求が格納される 2.Zend_Coontroller_Actionで、コンテンツの振り分けとかheaderの設定とか、出力処理を行い、それらがすべてZend_Controller_Response_Httpにキャッシュされる 3.postDispatchとか全処理が終了したら、Zend_Contorller_Response_HttpにキャッシュされたHTTPヘッダが出力され、 HTTPのBODYが出力される って感じです。 多分2番の工程にたどり着いたときに、最初にob_start関数が叩かれて、処理が終わったら、ob_get_cleanかなんかで、Response_Httpに格納する、とか処理をしてるのではないかなぁと思います。

dcx147
質問者

お礼

たびたびのお返事ありがとうございます。 最初にそのままのソースで試したのですが結果は、メインコンテンツの部分 (IndexControllerのindexActionであればindex.tpl)だけ文字コードが 変換され出力されましたがlayout.tplで読込みしている他のtplに記載して あるものに関しては文字コードが変換できなかったので試行錯誤しておりました。 試しに、postDispatchでデバッグしてみましたがindex.tplの内容だけが 選択範囲となっているようです^^; Zend_Debug::dump($this->getResponse()->getBody()); 参考までにlayout.tplの中身は以下のようになっているのですが書き方が まずいのでしょうか? <div id="header"> <{include file="header.tpl"}> </div> <div id="content"> <{$this->layout()->content nofilter}> </div>

回答No.1

今日はじめて使ってみたので、あまり当てにならないかもしれないですが、 結局この、Zend_Controller_Pluginは、RequestとResponseの切り分けとか操作を行う物のようです。 ■routeStartup/routeShutdown 受け取ったRequestに何か不正なものがあった場合に、Responseで、エラー画面にリダイレクトをするようにするのに使えそうです。 また、$request->setParam() あたりで、デフォルトのパラメータを指定しておけば、Actionコントローラでソレを拾うことが出来ますので、ソレをコントローラ側の切り分けの材料にすることが出来るかもしれませんね。 また、リクエストパスを書き換えちゃえば、RouterにRequestオブジェクトが渡された際に別のコントローラを動作させることが出来るかもしれません。 ■preDispatch これは、dcx147さんが仰るとおり、全コントローラ共通の認証などで使えます。 Zend_Controller_Actionに中間的な抽象クラスを作ってそこで処理してやる方法(CakePHPのAppController的なもの)でもいいですが、プラグイン化することで、別のアプリケーションを作成するときにも、簡単に移行出来るので便利かもしれません。 また、ここでブラウザの種類やIPなどで判別して、上述した$request->setParamに、('is_mobile', true)とか書きこんでやって、Actionコントローラ側で簡単に判別出来るようにする処理をいれてやるのもいいかもしれません。 ■postDispatch 文字コードの変換は、Viewのヘルパのほうが・・・とおっしゃっていましたが、 プログラムは、ブラウザからのRequestを受けて、処理をすべて行った後にResponseとして、HTTPヘッダとコンテンツ(主にHTML)を返します。ZendFrameworkもなんだかんだ処理を行って、最終的には、Zend_Controller_Response_Httpに全HTTPヘッダとコンテンツを入力して、最後に吐き出す、という処理をしています。 ですので、作成しているプログラムの文字コードとは違う文字コードをブラウザに出力するなら、ここで一括で文字コード変換、とか絵文字ライブラリで一括でキャリアごとの絵文字に書き換える、という事を行ったほうが、事は簡単になるかもしれません。 また、preDispatchと組み合わせて、preDispatchでRequestオブジェクト内にあるPostリクエストやGetリクエストなどを、Viewで指定してある文字コードからアプリケーションの文字コードに変換する処理をフックしてやるということと、 postDispatchで、Viewが最終的に構築したアプリケーションの文字コードのHTMLをまたViewで指定したい文字コードに変換をする、とかやると、修正が凄く簡単になる、のではないかなと妄想しました。 <?php public function postDispatch(Zend_Controller_Request_Abstract $request){ $content = $this->getResponse()->getBody(); $content = mb_convert_encoding($content, 'sjis-win', 'utf-8'); $this->getResponse()->setBody($content); } ?> と、これだけでも結構使えそうな気がしましたが、如何でしょうか。

dcx147
質問者

お礼

お返事ありがとうございます。 このような具体的なご意見をいただけますと非常に為になります。 文字コード変換について1つ質問なのですがsmartyと連携させており 下記のURLのソースを利用しております。 http://www.gediminasm.org/article/smarty-3-extension-for-zend-framework Ext_View_Smartyのrunメソッドで下記のようにし(抜粋) $output = $this->_smarty->fetch($template); //echo $output; Zend_Registry::set('output', $output); //$this->_smarty->display($template); プラグインのpostDispatchメソッドで $output = Zend_Registry::get('output'); $output = mb_convert_encoding($output, 'SJIS-win', 'UTF-8'); echo $output; としているのですがメインとなるコンテンツしか表示されません。 layout.tplで全体の出力の制御をしておりヘッダーやフッターtplの読込みや メインコンテンツの出力を行っている状況です。 Ext_View_Smartyのrunメソッドでechoするとヘッダーやフッターtplの読込みも 問題なく表示されるのですがタイミングの問題とかでしょうか?

関連するQ&A

  • 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
  • ZendFramework-1.0.2の環境設定

    IndexController.php以外の Controllerファイルが起動いたしません。 以下のようなエラーが出力されます。どのように対処したらよいでしょうか。よろしくお願いいたします。 Fatal error: Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller specified (error)' in C:\zend\ZendFramework\library\Zend\Controller\Dispatcher\Standard.php:194 Stack trace: #0 C:\zend\ZendFramework\library\Zend\Controller\Front.php(920): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) #1 C:\zend\ZendFramework\library\Zend\Controller\Front.php(224): Zend_Controller_Front->dispatch() #2 C:\Apache Group\Apache2.2\htdocs\zdb1\index.php(10): Zend_Controller_Front::run('./application/c...') #3 {main} thrown in C:\zend\ZendFramework\library\Zend\Controller\Dispatcher\Standard.php on line 194

    • ベストアンサー
    • PHP
  • ZendFrameworkのindex.phpで

    【環境】 ZendFramework Version 1.11 PHP 5.3.8 ZendFrameworkの学習をしているのですが、見るサイトによってindex.phpが異なりそれらの違いが分かりません。 下記の3種類の実装はどのような違いが有り、どのようなときに使用するべきなのでしょうか? 1.Zend_Applicationのインスタンスを使用するもの $application = new Zend_Application( APPLICATION_ENV, APPLICATION_PATH . '/configs/application.ini' ); $application->bootstrap() ->run(); 2.Zend_Controller_Front::run()を使用するもの Zend_Controller_Front::run('../application/controllers'); 3.$front->dispatch();を使用するもの $front = Zend_Controller_Front::getInstance(); $front->setControllerDirectory('../application/controllers'); $front->dispatch();

    • ベストアンサー
    • PHP
  • zendframeworkを勉強中です。

    zendframeworkを勉強中です。 つい最近から勉強を始めました。 何とか思うような動作をさせる事はできてきたのですが根本的な事で悩んでおります。 アクションコントローラーの部分なのですが基本的に『init()』は大抵のファイルが共通になります。 ※例えばDBの接続やメンバ変数の設定など・・・ 具体的に今の私の見解は以下のようなイメージです。 class IndexController extends Zend_Controller_Action { public function init() { //大抵のファイルが共通なので何とかしたい } public function hogeAction() { //必要な処理 // fooActionと重複するようなソースであればmodelにclassファイルを作成 } public function fooAction() { //必要な処理 // hogeActionと重複するようなソースであればmodelにclassファイルを作成 } } 全く同様の関数を複数のファイルに作っても意味ないですしメンテも大変です。 参考書やマニュアルを見てもひたすら重複ソースを書くような内容しか見当たらなかったのですが 皆さんはどのような構成で構築されているのでしょうか? まだまだ理解が乏しいので、できるだけわかりやすく教えて頂けますと幸いです。 詳しい方がいらっしゃいましたらアドバイスを宜しくお願い致します。

    • ベストアンサー
    • PHP
  • ZendFremeworkインストールについて

    index.phtmlが設置されていない等でのエラーが表示されるケースはgoogleなどで表示されるのですが、 Broker.phpに関するエラー表示が見つかりませんでしたので、質問させて頂きました。 今回新しい案件で、ZendFremeworkに関して作成出来るようになるべく、 ZendFremeworkに関連するサイトを閲覧しながら、インストールしました。 html/index.phpに下記のように、コードを挿入し、バージョン確認を行った所、 正常に動作しました。 require_once 'Zend/Version.php';  //ライブラリの読み込み echo Zend_Version::VERSION;     //現在のZend Frameworkのバージョンを表示 ですが、下記の分に変更した所、エラーが発生しました。 require_once 'Zend/Controller/Front.php'; Zend_Controller_Front::getInstance()->setParam('noViewRenderer', true); Zend_Controller_Front::run('../zend_app/controllers'); [エラー内容] ============================================================== Fatal error: Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller specified (error)' in (略)\Zend\Controller\Dispatcher\Standard.php:248 Stack trace: #0 (略)\Zend\Controller\Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) #1 (略)\Zend\Controller\Front.php(212): Zend_Controller_Front->dispatch() #2 (略2)\Zend\index.php(11): Zend_Controller_Front::run('../zend_app/con...') #3 {main} Next exception 'Zend_Controller_Exception' with message 'Invalid controller specified (error)#0 (略)\Zend\Controller\Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) #1 (略)\Zend\Controller\Front.php(212): Zend_Controller_Front->dispatch() #2(略)\Zend\Controller\Plugin\Broker.php on line 336 ============================================================= バージョンが表示できているので、インストール自体は出来ていると思うのですが、 実際にコントローラーを設定した時には、何を行ってもこの現象が起こってしまいます。 いくら検索しても、見つからなかったので、質問させて頂きました。 どうぞ宜しくお願いします。 [ 開発環境 ] XAMMP (PHP5.3.1) Windows7(64bit) 下記のようなフォルダ構成となっております。 ===================================== /Zend(公開エリア)    .htaccess    index.php /zend_app(アプリケーションエリア)    /controllers       IndexController.php    /models    /views       /scripts          /index             index.phtml /ZendFramework(フレームワーク本体)    /library /Zend /Controller ======================================

    • 締切済み
    • PHP
  • ZendFrameworkでParseError

    レンタルサーバへZendFrameworkのライブラリを設置したところ、以下のエラーが出ます。 Parse error: parse error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /home/****/*****/ZendFramework/library/Zend/Controller/Front.php on line 44 index.phpでFront.phpをrequire_onceしているので、index.phpもZendFrameworkライブラリも設定は間違っていないのではないかと思われます。 ライブラリのデータ破損などがあることも考え、若干バージョンの違うものをアップロードしてみましたが同じでした。 自分の作成したファイルでエラーが出ているのであれば問題点の探しようもあるのですが、フレームワークのライブラリなので、どう対処していいかが分かりません。 分かる方がいらしたらぜひ教えてください。

    • ベストアンサー
    • 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
  • zendのcontrollersについて

    Zendを始めたばかりのものです。 サーバ:XPで自営 Apache2,php5 Zendをダウンロードし、Cドライブのルートに「ZendFramework-1.9.0」 という名前で配置しました。 php.iniのinclude_pathの設定も変更し、 htdocsの直下にindex.phpを作成し <?php require_once 'Zend/Version.php'; //ライブラリの読み込み echo Zend_Version::VERSION; //現在のZend Frameworkのバージョンを表示 とすると、正常にバージョンが表示されます。 zendappsというフォルダーをhtdocsの中に作成し、index.phpに <?php require_once 'Zend/Controller/Front.php'; Zend_Controller_Front::run('../zendapps/controllers'); とするとエラーになります。(エラーは長いので後述) '../zendapps/controllers'の部分かとも思いますが、 お分かりになる方、教えていただけると幸いです。 エラーの内容 Fatal error: Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller specified (error)' in C:\ZendFramework-1.9.0\library\Zend\Controller\Dispatcher\Standard.php:242 Stack trace: #0 C:\ZendFramework-1.9.0\library\Zend\Controller\Front.php(946): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) #1 C:\ZendFramework-1.9.0\library\Zend\Controller\Front.php(212): Zend_Controller_Front->dispatch() #2 C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\zendapps\index.php(3): Zend_Controller_Front::run('../zendapps/con...') #3 {main} thrown in C:\ZendFramework-1.9.0\library\Zend\Controller\Dispatcher\Standard.php on line 242

    • ベストアンサー
    • PHP
  • cakePHPでFormを使用したDBへの登録

    cakePHP初心者です。 ブラウザで入力画面→確認画面→完了画面と遷移して、 DBに入力した値を登録する基本の動きをさせたいのですが、 Controllerの動きが分かりません。 Viewのファイルを 入力画面:entry.ctp 確認画面:confirm.ctp 完了画面:complete.ctp とします。 1.SampleControllerからentryページを表示 public function entry(){ } 2.etntry.ctpでFormを作成 <?php echo $this->Form->create('Sample', array('action' => 'confirm')) . PHP_EOL; ?> 3.SampleControllerでconfirmメソッドが呼ばれる public function confirm(){ if($this->request->is('post')){ データを画面にセット? } } 4.confirm.ctpが表示され、登録ボタンを押すと完了画面にFormを作成 <?php echo $this->Form->create('Sample', array('action' => 'complete')) . PHP_EOL; ?> 5.SampleControllerでcompleteメソッドが呼ばれる public function confirm(){ if($this->request->is('post')){ バリデーションチェック後、DBに登録? } } この流れでよいのでしょうか。 完了画面のcompleteでバリデーションチェックを行うことに違和感を感じています。 仮にconfirmで実施するとしても、書き方が良く分かりません。 <?php echo $this->Form->create('Sample', array('action' => 'confirm')) . PHP_EOL; ?> と書いたら、3の処理とかぶってしまいますよね・・・? 説明分かりにくくてすみません・・・。 ネットで調べつつやっていたのですが、一連の流れをすべて書いたサイトに見当たらず、 途方に暮れています。 どなたかご教示お願いします。

    • 締切済み
    • PHP
  • ToDoリストの「完了済」を非表示にしたい

    現在ToDoリストを作成しており、最終的に実現させたい動作はタイトルのとおりですが、数点分からないことがありますので質問させてください。 したい事 1、htmlで「No」「タイトル」「内容」「期限」「優先度」と「登録」ボタンで入力するフォームを設置。 2、入力フォームからMySQLのデータベースに登録。 3、「登録確認」画面を表示。 4、「全て」というページに全予定を表示させ、各行頭「済」フィールドにチェックボックスと「完了済」ボタンを1つ配置。 5、完了した項目のチェックボックスにチェックを入れてボタンを押すと、「全て」というページ内で非表示にする。 以上のことをしたいと考えております。 現在、4つ目まではできました。 そこでお詳しい方にお聞きしたいことが以下です。 質問 A、チェックボックスにチェックが入って「いる」「いない」はPHPおよびMySQLはどう判断するのでしょう? B、データベースの「済」フィールドではデータ型は何がふさわしいのでしょうか?(※今はverchar(1)としています) C、「完了済みの項目にチェックを入れ、それを非表示にする」という動作はUPDATE文とSELECT文でいいのでしょうか? 疑問点はまだいくつかございますが、この3つが分かれば、あとは入門サイトなどネット上での解説も理解できそうな気がするのです。 以下にコードを貼りますので、おかしな点や修正すべき箇所がございましたらご指摘ください。 また、回答に必要な情報がございましたらすぐに返答させていただきます。 そもそもPHPやMySQLの基礎の理解に欠けているというご指摘もございましょうが、何卒よろしくお願いいたします。 <html> <head> <title>ToDoリスト</title> </head> <body> <?php echo("No"); ?> <br> <?php echo(htmlspecialchars($_REQUEST["No"])); ?> <br><br> <?php echo("タイトル"); ?> <br> <?php echo(htmlspecialchars($_REQUEST["タイトル"])); ?> <br><br> <?php echo("期限"); ?> <br> <?php echo(htmlspecialchars($_REQUEST["期限"])); ?> <br><br> <?php echo("優先度"); ?> <br> <?php echo(htmlspecialchars($_REQUEST["優先度"])); ?> <br><br> <?php echo("内容"); ?> <br> <?php echo(htmlspecialchars($_REQUEST["内容"])); ?> <br><br> <?php if( isset($_REQUEST["済"]) != "" ) { $conn = mysql_connect( "localhost", "root", "○○○" ); if( $conn == false ) { die("MySQL 接続エラー"); } mysql_set_charset( "sjis" ); mysql_select_db( "todo" ); $sql = " UPDATE todo SET 済="※ここにどんな値を入れたらよいか分かりません。" ; $sql = $sql . " VALUES( "; $sql = $sql . "'" . $_REQUEST["済"] ."' , "; $sql = $sql . "'" . $_REQUEST["No"] ."' , "; $sql = $sql . "'" . $_REQUEST["タイトル"] ."' , "; $sql = $sql . "'" . $_REQUEST["期限"] ."' , "; $sql = $sql . "'" . $_REQUEST["優先度"] ."' , "; $sql = $sql . "'" . $_REQUEST["内容"] ."' ) "; $todo_list = mysql_query( $sql ); if( $todo_list == false ) { echo("エラーが発生しました。"); } else { echo("正常に更新されました。"); } mysql_close(); } ?> <br><br> <a href="http://localhost/continuity_is_power01/continuity_is_power.htm"> <input type="submit" value="戻る"> </a> </body> </html>

    • ベストアンサー
    • PHP

専門家に質問してみよう