• 締切済み

PHPでMVC requireや$_GET記載場所

PHPで小規模~中規模なシステム構築を行っております者です。 例えば、下記のようなものです。 (1)小規模:簡易な新着ニュースの更新のみ行うCMSなど (2)中規模:ショッピングカートなど 今回、自身の作ってきたシステムをリニューアルするにあたり、 勉強も兼ねてMVCというものを意識して構築してみようかと思ったのですが、 調べれば調べるほど役割やファイルの分け方で迷ってしまうばかりです。(特にCとM) なお、cakePHPなどは使っておりません。 smartyは使用しています。 (1)を使って示しますと、例えば下記のようなファイルわけをしていたとします。 (レイアウト崩れが怖いため、中途半端なツリー記載ですがご勘弁ください。) index.php ・・・ IDパスが未入力の場合はログイン画面を、入力済の場合は管理画面トップ ┃ ┣ controllers ━ control用php ┃ ┣ models ━ 登録処理class.php DB接続class.php ログイン関連class.php(ログイン・ログアウト処理、ログイン保持など) ┃ ┣ views ━ 各種tpl ┃ ┗ その他ファイル(smarty,pear,DB接続情報等記載ファイル,共通使用変数など記載ファイル) 色々なところで見かけるのは、C.M.V、いずれもclassなどが記載してあるのみですが、 そのクラスをどこで宣言し、どこで使っているのかが良く分かりません。 例えば、 パラメーターが ・・・・・?action=config&news_id=15 とあり、 DB内のid15の記事を抽出し、 今行うべき処理が?action=configより記事の更新だと判断し、 画面を表示するという処理の流れがあるとします。 その場合、 ●パラメーターの$_GETはどこに書くのか? ●?action=configより処理が記事の更新だとの判断は ●その他ファイル(smarty,pear,DB接続情報等記載ファイル,共通使用変数など記載ファイル)の読み込みはどこで行うのか? ●modelsのclassをnewで宣言するのはどのファイルなのか? など、 現在私が行っている方法は、 index.phpに上から ・セッションスタート ・各種定数および変数の記載 ・smarty設定 ・DBクラスなど必ず使うものを宣言 ・パラメーターから判断して必要なクラスを読み込んで宣言+処理記載(switchで切り替えてます) ・smartyのdisplayでtplの内容を表示 というものをすべて記載しております。一応形としてはCにあたるのでしょうか。 上のツリーではcontrollers ディレクトリがありますが、 この内どれかをそこに移し、index.phpから読み込むべきでしょうか? (今のところ役割がみあたりません) また、modelsというのは要するにclassなどが記載してあるだけでしょうか? models内ではnewせず$_GETせず、models内のclassの処理を実際に 実行する記載は「C」に書くということでしょうか。 よくわからない文章になってしまい申し訳ございません。 正解はないかもしれませんので、あくまで皆様の行っているやり方や一般的に使われている方法で結構です。 ファイルわけや処理の記載についてお教えいただけると幸いです。 よろしくお願いいたします。

みんなの回答

  • bakaok
  • ベストアンサー率22% (33/148)
回答No.2

とりあえずフレームワークでも勉強したら?

mtmaster
質問者

お礼

基本的にデザイン→コーディング→プログラムと一人作業なので、 細かに分けると逆に面倒ぐらい思って作業しておりましたが、 いざしっかり分けてみると管理しやすいものですね。 フレームワークについてもまだまだ完璧に理解は及んでおりませんが、 少しづつでもモノに出来ればと思います。 ご回答ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • tany180sx
  • ベストアンサー率63% (239/379)
回答No.1

私はこんな感じです。 Front  ・初期化処理  ・リクエストの処理(補完  ・ルーティング(何をどうするリクエストか判断  ・ディスパッチ(Controllerをコール Controller  ・リクエストを詳細に分析  ・Modelにパラメータを与えデータを取得  ・リクエストに適したViewをコール Model  ・リクエストに依存せず要求されたデータを生成する View  ・データを整形し出力を決定 ●パラメーターの$_GETはどこに書くのか? 直接のアクセスはフロントだけで十分。 ●?action=configより処理が記事の更新だとの判断は ルーティングに相当しますがconfigは設定の意味で使います。 ●その他ファイルの読み込みはどこで行うのか? ライブラリは使うときだけControllerやModelで指定します。 ●modelsのclassをnewで宣言するのはどのファイルなのか? インスタンスはControllerで生成します

mtmaster
質問者

お礼

ご回答ありがとうございます。 front controller辺りも迷いがあったので参考にさせていただきます。 小規模・中規模システムとはいえ、 読み込み等に無駄が多かったので、 必要なものだけ厳選してもう少しスマートな記述を心がけたく思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • こんにちは、PHP初心者です。

    こんにちは、PHP初心者です。 Smartyを利用してWebサイトを構築中です。 Smarty.classの派生クラスを作成し、コンストラクタ内でDB接続オブジェクトを privateプロパティ($_db)に設定しているのですが$_dbの値が アクセサメソッドを通じてgetすると空白になってしまいます。 色々やってみましたが理由が分からず、 ためしにコンストラクタ内でクエリを実行したところテーブルから値を取得できました。 なぜコンストラクタ外に出るとprivateプロパティの値が取得できなくなるのか分かりません。 どなたかご教示ください。 どうぞよろしくお願いします。 下記ソースです。 *(Smarty.classの派生クラス)********************************************** <?php require_once("DB.php"); require_once("Smarty.class.php"); class MySmarty extends Smarty{ private $_db; public function __construct(){ parent::__construct(); $this->template_dir="C:/xampp/modules/access_control/templates"; $this->compile_dir="C:/xampp/modules/access_control/templates_c"; $this->config_dir="C:/xampp/config"; $this->config_load("access_control.conf",basename($_SERVER['SCRIPT_NAME'],".php")); $tihs->_db=DB::connect($this->get_config_vars('db_string')); if (PEAR::isError($db)) { die($db->getMessage()); } } public function __destruct(){ $this->_db->disconnect(); } public function get_db(){return $tihs->_db;} } ?> *********************************************** *(メインのPHP)********************************************** <?php require_once("../../modules/access_control/class/MySmarty.class.php"); require_once("../../modules/access_control/class/name_search.class.php"); $o_smarty=new MySmarty(); $db=$o_smarty->get_db(); ←ここで値が取得できない $o_smarty->assign("toolname",name_search::getToolName($db)); $o_smarty->display(basename($_SERVER['SCRIPT_NAME'],".php").".tpl"); ?> ***********************************************

    • ベストアンサー
    • PHP
  • xserver Smarty PHP+MySQL

    xserver Smarty PHP+MySQL xserver(レンタルサーバー)でSmartyのtplが読み込まれません。 Xserver(レンタルサーバー)環境 MySQL5 バージョン:5.0.77 MySQL5 ホスト名:xxx.xserver.jp PHP Version 5.3.3 include_path .:/usr/share/php53/pear :/usr/share/php Xserver PHP関連の仕様一覧 PEARインストール済み <インストール済みライブラリ> ・Archive_Tar ・Auth ・Console_Getopt ・DB ・HTML_Common ・HTML_QuickForm ・HTTP ・HTTP_Header ・HTTP_Download ・Mail ・Net_SMTP ・Net_Socket ・Pager ・PEAR ・XML_Parser ・XML_RPC ・Structures_Grap データベースは同じくXserverに設置されているphpmyadmin(MySQL5)で作成しました。 /xxx.xsrv.jp/内に 【php_libs】   [config]     ・config.inc.php   [module]     ・build_screen.inc.php     ・menu.inc.php     ・MYDB.inc.php     ・sub.inc.php       [smarty]     ・cache     ・configs     ・libs     ・templates     ・templates_c 【public_html(DocumentRoot)】   ・testsmarty.php   ・testsmarty.tpl を置いています。 以下のコードでエラーがでます。 Warning: Smarty error: unable to read resource: "testsmarty.tpl" in /home/xxx/xxx.xsrv.jp/php_libs/smarty/libs/Smarty.class.php on line 1088 どこが間違っているのか教えて下さい。 ●testsmarty.php <?php $documentroot = dirname( __FILE__) . '/'; require_once $documentroot . '../php_libs/config/config.inc.php'; require_once( _SMARTY_LIBS_DIR . "Smarty.class.php"); $smarty = new Smarty; $smarty->template_dir = _SMARTY_TEMPLATES_DIR; $smarty->compile_dir = _SMARTY_TEMPLATES_C_DIR; $smarty->config_dir = _SMARTY_CONFIG_DIR; $smarty->cache_dir = _SMARTY_CACHE_DIR; $smarty->assign("title", "タイトル名"); $file = 'testsmarty.tpl'; $smarty->display($file); ?> ●testsmarty.tpl {$title} ●config.inc.php <?php //---------------------------------------------------- // デバッグ表示 true / デバッグ表示オフfalse //---------------------------------------------------- // define("_DEBUG_MODE", true); define("_DEBUG_MODE", false); //---------------------------------------------------- // データベース関連 //---------------------------------------------------- define("_DB_USER", "xxx_sample"); define("_DB_PASS", "password"); define("_DB_HOST", "tcp+xxx.xserver.jp"); define("_DB_NAME", "xxx_sampledb"); define("_DB_TYPE", "mysqli"); define("_DSN", _DB_TYPE . '://' . _DB_USER . ':' . _DB_PASS . '@' . _DB_HOST . '/' . _DB_NAME); //---------------------------------------------------- // 認証関連 //---------------------------------------------------- // 会員認証に使うテーブル名 define("_DB_MEMBER_TB", "m_member"); // 管理者認証に使うテーブル名 define("_DB_SYSTEM_TB", "m_system"); // ユーザー名を格納するカラム名 define("_DB_USERNAMECOL", "username"); // パスワードを格納するカラム名 define("_DB_PASSWORDCOL", "password"); //---------------------------------------------------- // 会員・管理者 処理分岐用 //---------------------------------------------------- // 会員用フラッグ define("_MEMBER_FLG", false); // 管理者フラッグ define("_SYSTEM_FLG", true); //---------------------------------------------------- // セッション名 //---------------------------------------------------- // 会員用セッション名 define("_MEMBER_SESSNAME", "PHPSESSION_MEMBER"); // 管理者用セッション名 define("_SYSTEM_SESSNAME", "PHPSESSION_SYSTEM"); //---------------------------------------------------- // ファイル設置ディレクトリ //---------------------------------------------------- //$smarty->○○○を使わない場合下記で表示されました。 define( "_PHP_LIBS_DIR", "/home/xxx/xxx.xsrv.jp/php_libs/"); // 設定ファイル define( "_CONFIG_DIR", _PHP_LIBS_DIR . "config/"); // 機能ファイル define( "_MODULE_DIR", _PHP_LIBS_DIR . "module/"); //---------------------------------------------------- // Smarty関連設定 //---------------------------------------------------- // Smartyのlibsディレクトリ define( "_SMARTY_LIBS_DIR", _PHP_LIBS_DIR . "smarty/libs/"); // Smartyのテンプレートファイルを保存したディレクトリ define( "_SMARTY_TEMPLATES_DIR", _PHP_LIBS_DIR . "smarty/templates/"); // Smartyのlibsディレクトリ Webサーバから書き込めるようにします。、 define( "_SMARTY_TEMPLATES_C_DIR", _PHP_LIBS_DIR . "smarty/templates_c/"); // Smartyのlibsディレクトリ define( "_SMARTY_CONFIG_DIR", _PHP_LIBS_DIR . "smarty/configs/"); // Smartyのlibsディレクトリ Webサーバから書き込めるようにします。、 define( "_SMARTY_CACHE_DIR", _PHP_LIBS_DIR . "smarty/cache/"); ?>

    • 締切済み
    • PHP
  • imgタグでのphpの呼び出しについて

    PHP+smartyを使って開発をしております。 【image.php】 イメージを出力するPHP 【index.php】 処理PHP 【index.tpl】 画面のテンプレート 3つのファイルがあり、 (1) index.phpにアクセスすると、 index.tplのテンプレートが呼び出されるようになっています。 index.tplの中で、<img src="image.php">とすると image.phpで出力した画像がindex.tplの中に表示されます。 (2) index.phpにアクセスすると、 index.tplのテンプレートが呼び出されるようになっています。 index.tplの中で、<img src="{imageChange}">とすると image.phpで出力した画像がindex.tplの中に表示されずバイナリデータが表示されてしまいます。 index.phpの中で関数が使用出来るように $smarty->register_function( "imageChange", "imageChange" ); と書いてあります。 (2)でやりたい理由として、 (1)でやるとパラメータを渡す際に、 ?aaa=1&bbb=2&ccc=9&ddd=4.....としなければいけないのと、 処理毎にPHPファイルを分けないといけない為です。 何とか関数を使用してテンプレートで呼び出す方法はないでしょうか。 他にいい方法がありましたら他の方法でも構いません。 ご教授お願い致します。

    • 締切済み
    • PHP
  • PHP(smarty)についての質問(文字化け)

    あるサイトでsmartyを勉強中ですが、そのサンプルファイルを実行したところ、 文字化けが発生して困っています。 ・form.php←お問い合わせ用テンプレートファイルの指定 ・form.tpl←お問い合わせ情報を入力させるテンプレートファイル ・template.tpl←テンプレートファイルを表示させるテンプレートファイル form.phpから、お客様情報を入力させるためのテンプレートファイル(form.tpl)を指定し、 template.tplにそれを表示させるのが処理概要です。 実行すると、タイトルの"問い合わせフォーム"は表示されますが、 それ以下のform.tplの日本語部分が文字化けします。 template.tplで{include file=$content_tpl params=$params}の処理で form.tplを取り込んでいますが、その時文字コードがおかしくなっている気がします。 form.tplに対して文字コード(UTF-8)が有効になっていないと思われます。 実験的に、{include file=$content_tpl params=$params}を削除して、 そこにform.tplの記載をすべて記述すると文字化けは起こりませんでした。 文字コードの指定をform.tplに対しても有効にするにはどのように修正すればよろしいでしょうか。 以下にソースファイルを記載します。 ★form.php <?php // 共通の設定を読み込む require_once( 'common.php' ); // Smartyオブジェクト取得 $smarty =& getSmartyObj(); // ひな形のSmartyテンプレートでincludeするテンプレートを指定 $smarty->assign( 'content_tpl', 'form.tpl' ); // パラメータを渡す $smarty->assign( 'params', array( 'types' => array( 'request' => '意見、要望', 'question' => '質問、問い合わせ', 'other' => 'その他' ) ) ); // ページを表示する $smarty->display( 'template.tpl' ); ?> ★form.tpl <p>お問い合わせやご意見・ご要望を以下のフォームにご記入の上ご送信ください。</p> <form method="post" action="post.php"> <dl> <dt>お名前</dt> <dd> <input type="text" name="name" value="{$params.name|escape:'html':'UTF-8'}" /> {if $params.errors.name} <p class="error-message">名前を入力してください。</p> {/if} </dd> <dt>メールアドレス</dt> <dd> <input type="text" name="address" value="{$params.address|escape:'html':'UTF-8'}" /> {if $params.errors.address} <p class="error-message">アドレスが不正です。</p> {/if} </dd> <dt>お問い合わせ種類</dt> <dd> {html_options name="type" options=$params.types selected=$params.type} {if $params.errors.type} <p class="error-message">お問い合わせ種類が不正です。</p> {/if} </dd> <dt>お問い合わせ件名</dt> <dd> <input type="text" name="title" value="{$params.title|escape:'html':'UTF-8'}" /> {if $params.errors.title} <p class="error-message">件名を入力してください。</p> {/if} </dd> <dt>お問い合わせ内容</dt> <dd> <textarea name="content" cols="60" rows="5"> {$params.content|escape:'html':'UTF-8'} </textarea> {if $params.errors.content} <p class="error-message">お問い合わせ内容を入力してください。</p> {/if} </dd> </dl> <input type="submit" value="送信する" /> </form> ★template.tpl <?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>問い合わせフォーム</title> <style type="text/css"> {literal} .error-message{ margin:5px; font-size:80%; color:red; } {/literal} </style> </head> <body> <h1>問い合わせフォーム</h1> {include file=$content_tpl params=$params} </body> </html> ★common.php <?php define( 'SMARTY_DIR', 'C:/xampp\php/smarty/libs/' ); require_once( SMARTY_DIR .'Smarty.class.php' ); // Smartyオブジェクト取得 function & getSmartyObj() { static $smarty = null; if( is_null( $smarty ) ){ $smarty = new Smarty(); $smarty->template_dir = 'C:/xampp/php/smarty/templates/'; $smarty->compile_dir = 'C:/xampp/php/smarty/templates_c/'; $smarty->config_dir = 'C:/xampp/php/smarty/configs/'; $smarty->cache_dir = 'C:/xampp/php/smarty/cache/'; } return $smarty; } ?>

    • ベストアンサー
    • PHP
  • phpのエラー

    PHPの初心者です。 smartyを使ってPHP実行したところ、以下のエラーが出ました。 という意味でしょうか?初心者の私さっぱりわかりません。 回答していただけたらとてもありがたいです。よろしくお願いします。 Fatal error: Smarty error: [in 5-5-4.tpl line 21]: syntax error: unclosed tag \{section} (opened line 12). (Smarty_Compiler.class.php, line 317) in C:\php\includes\Smarty\Smarty.class.php on line 1093

    • 締切済み
    • PHP
  • ロリポップでSmartyのtpl読み込みエラー

    下記のコードを実行すると、  Smarty error: unable to read resource: "template1.tpl"  というエラーが出てしまいます。 $smarty->template_dirで指定したディレクトリ名の中に  "template1.tpl"というファイルは配置してあります。  原因などわかればおしえていただけないでしょうか。 index.php <?php require_once("Smarty.class.php"); $smarty = new Smarty; $smarty->template_dir = './templates/'; $smarty->compile_dir = './templates_c/'; $smarty->config_dir = './configs/'; $smarty->cache_dir = './cache/'; $smarty->display("template1.tpl"); ?> 【サーバ】  ロリポップです。 【その他】 index.phpをホームディレクトリ配下におくとエラーは消えます。 【ディレクトリ構成】 modules/index.php と templates/template1.tpl をがあり、 index.php から template1.tpl を読み込もうとしています。  ・modules →index.php ・templates →template1.tpl

    • ベストアンサー
    • PHP
  • Smartyでテンプレートの場所を指定する方法

    Smartyでテンプレートファイルの場所を指定するいい方法を教えてください。 公式マニュアルには基本的には(1)のようにやるのだと書いてあります。そして拡張セットアップとして(2)の方法が紹介されています。これなら「ディレクトリパスの設定を同じ変数に何度も割り当てる代わりに、一箇所でそれらを行う事が出来ます」とのことですが…。 しかし拡張セットアップの方法でも、プログラムファイル(.php)の中に環境依存の値を記述しています。私はJava開発の経験はあり、PHP開発の経験は無く、現在は趣味の範囲でPHPをやっています。 で、Javaの経験からすると、環境依存の値も設定ファイルのパスもプログラムファイルに書くことはまず無いので、(2)の方法でも気持ち悪く感じます…。また「ページを呼び出すたびに毎回setup.phpを呼ぶの?サーバー起動時に読み込むべき値・ファイルだろうが…」とも思ってしまいます。 …しかし私がどう感じるかは別として、実際の開発の現場ではどうすることが多いのか知りたくて質問をする事にしました。 質問は以下です。 [a]Smartyのテンプレートファイルのパスなどは、どこにどう書くことが多いのか? [b]Smartyに限らず、PHPという言語では、環境設定の値や設定ファイルのファイル名やパスを、プログラムファイル(.php)に書くのがあたりまえなのか?どうすることが多いのか。 [c]PHPではプログラムで使う値として、サーバー起動時に設定値・設定ファイルを読み込む一般的な仕組みがあるか?(サーバー設定値でもないのにphp.iniに書いてini_getで取得するなんてことが許される?他にもっとスマートな方法がある?) ※具体的な例を挙げて教えていただけると助かります。また、「あまりやらないけど、こうやったこともあるよ」などというイレギュラーなケースも教えていただけるとうれしいです。 よろしくお願いします。 --(1)index.php--------------------------------------------- <?php require_once(SMARTY_DIR . 'Smarty.class.php'); $smarty = new Smarty(); $smarty->template_dir = '/web/www.example.com/guestbook/templates/'; $smarty->compile_dir = '/web/www.example.com/guestbook/templates_c/'; $smarty->config_dir = '/web/www.example.com/guestbook/configs/'; $smarty->cache_dir = '/web/www.example.com/guestbook/cache/'; $smarty->assign('name','Ned'); $smarty->display('index.tpl'); ?> ----------------------------------------------------------- 基本的なインストール | Smarty http://www.smarty.net/docs/ja/installing.smarty.basic.tpl --(2)setup.php--------------------------------------------- <?php require('Smarty.class.php'); class Smarty_GuestBook extends Smarty { function __construct() { parent::__construct(); $this->template_dir = '/web/www.example.com/guestbook/templates/'; $this->compile_dir = '/web/www.example.com/guestbook/templates_c/'; $this->config_dir = '/web/www.example.com/guestbook/configs/'; $this->cache_dir = '/web/www.example.com/guestbook/cache/'; $this->caching = Smarty::CACHING_LIFETIME_CURRENT; $this->assign('app_name', 'Guest Book'); } } ?> --(2)index.php--------------------------------------------- <?php require('guestbook/setup.php'); $smarty = new Smarty_GuestBook(); $smarty->assign('name','Ned'); $smarty->display('index.tpl'); ?> ----------------------------------------------------------- 拡張セットアップ | Smarty http://www.smarty.net/docs/ja/installing.smarty.extended.tpl

    • ベストアンサー
    • PHP
  • require_once()でファイルが読み込めません

    すいません、色々やったみたのですがよく分からなかったので教えてください。 PHPのテンプレートのSmartyを使いたいと思い、公式サイトからダウンロードして/usr/local/lib/php/Smartyにコピーしました。 その後、php.iniのinclude_pathにて".:/usr/local/lib/php/Smarty"と設定し、require_once("Smarty.class.php");としたのですが、 failed to open stream: No such file or directoryや Failed opening required 'Smarty.class.php' というエラーが出て読み込めません。また、phpinfo()を見る限りではphp.iniはきちんと読みにいっているようでした。 ためしに/usr/にSmartyを置き、include_pathもそのように変更してみたのですが読み込めません。カレントディレクトリに配置した場合は上手く読み込めました。また、Smartyでなくてもどのファイルでも読み込めない状況です。 環境はFedora6、Apache2.0、PHP5です。何かアドバイスよろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPで受け取ったパラメータを別のPHPに移す

    フォーム用HTMLから受け取ったパラメータを処理用PHPで処理したあと、表示用PHPにパラメータを持たせたまま処理を移したいと考えております。 たとえば、form.htmlで受け取ったパラメータをa.phpで処理し、表示用のb.phpに移すには、どのような方法をとるのが効率的なのでしょうか? smartyなどのテンプレートエンジンを使わない形で考えております。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHP Smartyについて質問です。

    レイアウトファイル(main.tpl)にタグを配置し そのタグをあるデータに置換したいと考えています。 例えば、以下のような感じです。 ~~~ main.tpl ~~~~~~~~~~~~~~~~ <html> <body> <div id="header">ヘッダー</div> <div id="nav">ナビゲーション</div> <div id="contents">#CONTENTS#</div> <div id="footer">フッター</div> </body> </html> ~~~~~~~~~~~~~~~~~~~~~~~ 上記の「#CONTENTS#」の部分をDBで保存している コンテンツに置換したいのですが {if}構文や{$hoge}などのSmartyタグが文字列として出力されてしまいます。 何か無理やりDBのデータをSmartyのコンパイラに通すメソッド等ありませんでしょうか? もしくは、他のやり方で何かいい方法はありませんでしょうか? DBで保存している部分をtplファイルにして、$smarty->fetch("fuga.tpl"); 等で読みだせば 解決するんですが、どうしてもこのコンテンツ部分はtplファイルにはせず DBから直接コンパイルしたいのです。 どなたかご教授くださいませ。 よろしくお願いいたします。

    • ベストアンサー
    • PHP