質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

1300閲覧

独自フレームワークのアクションにviewを紐付けたい

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2019/06/20 09:38

編集2019/06/20 09:59

検索してもなかなか出てこなかったので、質問させていただきます。

phpもある程度理解できるようになったので、
すごく簡易的なMVCの独自フレームワークを作成しています。

現在、以下のサイトを参考にしながら独自フレームワークを作成しています。
http://www.objective-php.net/mvc/framework

そこで、Viewとcontrollerのアクションの紐付けに関してなのですが、
先ほどのサイトよりViewのセクションで、Smartyを使用してテンプレートと紐付けをしていると思います。
http://www.objective-php.net/mvc/view
おそらく、以下の記述かと思います。

php

1$smarty->display('sample.tpl');

しかし、今回はphpのみで完結させたいなと考えており、
smartyを組み込んでのフレームワーク作成は次回にしようと思っています。

Smartyを使用せずに、controllerのactionとテンプレートを紐づけるには
どのような実装をしたら良いでしょうか?

ちなみにURLは

で、コントローラーとアクションを識別しています。


具体的にした方が、より明確な回答を得られるとアドバイスをいただいたので
追記いたします。

私のイメージしているcontrollerのactionとテンプレートの紐付けとは
以下のような感じです。

php

1<?php 2//sample_controler.php 3 4/** 5 * AppControllerはControllerを継承しています。 6 * 7 * Controllerでは、PDOのinstance化などの 8 * 主要な機能を使えるようにする処理を書いています。 9 */ 10class sample_controller extends AppController 11{ 12 function something() 13 { 14 $view->assign($msg,'post送信です。'); 15 $view->setTmp('sample.php'); 16 } 17}

php

1//sample.php 2<!DOCTYPE html> 3<html> 4<head> 5 <meta charset="utf-8"> 6 <title>sample</title> 7</head> 8<body> 9 <form action="?cont=sample:something" method="post" accept-charset="utf-8"> 10 <input type="text" name="something"> 11 <button type="submit">送信</button> 12 </form> 13 <?=$msg?> 14</body> 15</html>

不足していることがありましたら、修正します。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hentaiman

2019/06/20 09:46

この質問文だと考え方の問題なので方法も自由過ぎて回答し辛いと思うな コントローラー(?)というファイルの中ではこういう記載をしたい、テンプレート(htmlのこと?)はこういう風に呼び出したいまたは明記しないがコントローラー(?)のアクション(?)名から判断するようにしたくて今はこういう作りをしている、とか コードを載せたらきっとナイスな回答者達がエクセレントな回答してくれるよ
退会済みユーザー

退会済みユーザー

2019/06/20 09:48

コメントいただきまして、ありがとうございます。 おっしゃる通り、考え方は色々ありますね。 もう少し、具体的な質問になるように修正します! ありがとうございます。
hentaiman

2019/06/20 10:10

追記見ました。 極端なやり方で言うと明示的にテンプレートに相当するファイルを指定するなら$view->setTmp('sample.php');に相当する個所でファイルをrequire_onceでもすれば済む事だからね。 そういったところに対する感覚もまだまだ曖昧だと思うので、とりあえず参考にしてるサイトそのまんま真似してみた方がいいかもしんないですね。その後に自分ならここをこうした方が使いやすいとか色々考えが出てくると思うので、その時に改造していくのが近道だと思います
guest

回答2

0

検索してもなかなか出てこなかったので

検索しても出てこないのは当然かと思います。
独自フレームワークなのであればそれこそドンピシャな情報は載っていません。
基本はどうすればできるか自分で考えることです。

Smartyを使用せずに、controllerのactionとテンプレートを紐づけるには

どのような実装をしたら良いでしょうか?

独自フレームワークなのであればお好みのようにすれば良いと思います。
おおよそはコントローラーのアクションに紐づかせるものですし。

どのような構成か分からないので思うように答えますが、
例えば、設定を配列か何かで持っておいて紐づかせるやり方でもいいですし

php

1$viewSetting = [ 2 "コントローラA"=>["アクション1"=>"ビュー","アクション2"=>"ビュー",], 3 "コントローラB"=>["アクション1"=>"ビュー","アクション2"=>"ビュー",] 4];

いっそアクションに直に書いてもいいのではと。

アクションでどういう処理を書こうとしているのか分からないですが、
ビューのテンプレートを作っておいてアクションではコンテンツ部分を作るだけに終始して、
同じ変数で受け取ってテンプレートに流すでも良いですし。

↓アクションからは必要なデータをreturnさせる

php

1echo <<<HTML 2<html lang="ja"> 3<head> 4<meta charset="UTF-8"> 5<title>{$data["title"]}</title> 6</head> 7<body> 8 {$data["contents"]} 9</body> 10</html> 11HTML;

幾らでもやりようはあるので、自分がやりやすい方法を考えたら良いかと思います。


既存フレームワークを参照するのが最も参考になると思いますよ。
Smartyなり何なりテンプレートエンジンを使ってたとしても、
結局は「ビューに必要な情報を準備して、渡す」のがコントローラのアクションが行うことなので。
ビューは基本は来たデータを表示するだけです。

投稿2019/06/20 09:53

編集2019/06/20 09:56
m.ts10806

総合スコア80765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/06/20 10:03

おっしゃる通り、様々な方法がありますね。 ただ、処理と表示は分けたいので、 コードリーディングを磨くためにも、既存フレームワークを参考にしてみます。 ありがとうございます!
m.ts10806

2019/06/20 10:06

それにSmartyもPHPで作られてますからね… 結局動いてるのは全部phpです。
m.ts10806

2019/06/20 10:11

それに、自分でルールを設ければいいだけなので如何様にもできるんですよ。 例えば、viewディレクトリのコントローラ名ディレクトリ配下のアクション名.phpを読むってルールを設けてそのように作れば設定ファイルで紐づける必要もないわけですしね。決めた命名規則にそってviewファイルを置くだけです。 先にルールを決めてください。
退会済みユーザー

退会済みユーザー

2019/06/20 10:19

わかりました。。。 命名規則等などの設計からやってみます! ありがとうございます。
guest

0

ベストアンサー

以下のようにして、ActionとViewを紐付けました。

php

1<?php 2/** 3 * Controller 4 * sample_controller.php 5 */ 6 7class sample_controller extends AppController 8{ 9 function index() 10 { 11 $name = "こんにちは"; 12 13 $this->view_assing('name',$name); 14 $this->view_display('index.php'); 15 return true; 16 } 17}

php

1/** 2 * sample_controllerの親クラス 3 * AppController.php 4 */ 5<?php 6class AppController extends Controller 7{ 8 /** 9 * View instance 10 * @var Object 11 */ 12 private $_view; 13 14 15 16 17 /** 18 * Viewクラスのインスタンス生成。 19 * 生成元は、Controller.php 20 */ 21 function set_view() 22 { 23 $this->_view = $this->intance_view(); 24 return true; 25 } 26 27 28 29 /** 30 * View Objectに渡して指定のTemplateをincludeしてもらう 31 */ 32 function view_display($tmp_name) 33 { 34 $this->_view->_setTemplate($tmp_name)->include_template(); 35 } 36 37 38 39 /** 40 * Templateに使う変数を指定 41 * @param [string] $str key 42 * @param [mixed] $variable value 43 */ 44 function view_assing($str,$variable) 45 { 46 $this->set_view(); 47 $this->_view->assign_param($str,$variable); 48 } 49}

php

1/** 2 * View 3 * sample.php 4 */ 5<!DOCTYPE html> 6<html lang="ja"> 7<head> 8 <title>sample</title> 9</head> 10<body> 11 <h1>indexです。</h1> 12 <?= View::$view['name']);?> 13</body> 14</html>

php

1<?php 2class View 3{ 4 private $_tmp_name; 5 private $_controller; 6 public static $view; 7 8 /** 9 * Templateをset 10 */ 11 public function _setTemplate($tmp_name) 12 { 13 $this->_tmp_name = $tmp_name; 14 15 return $this; 16 } 17 18 19 /** 20 * 現段階では使わない 2019/06/21 21 */ 22 public function _setController($controller_name) 23 { 24 $this->_controller = $controller_name; 25 } 26 27 28 29 /** 30 * テンプレートをrequire 31 */ 32 public function include_template() 33 { 34 $tmp_is = $this->file_check('tmp'); 35 if(!$tmp_is) return false; 36 37 require_once $tmp_is; 38 } 39 40 41 42 /** 43 * ViewでControllerから受け取った値を使えるようにする 44 * Template側では、View::$viewで値を使う 45 */ 46 public function assign_param($string,$parameter) 47 { 48 View::$view = array( 49 $string => $parameter 50 ); 51 } 52 53 54 55 /** 56 * ファイル存在チェック 57 */ 58 private function file_check($string) 59 { 60 switch ($string) { 61 case 'tmp': 62 $view_tmp = MVC_V .'/' .$this->_tmp_name; 63 return (!file_exists($view_tmp)) ? false : $view_tmp; 64 65 break; 66 67 case 'cont': 68 $cont_timp = MVC_C .'/' .$this->_controller; 69 return (!file_exists($cont_timp)) ? false : $cont_timp; 70 break; 71 } 72 73 } 74 75}

Viewクラスで一度templateをincludeして、
controllerから渡したい値がある場合は、
Viewクラスのstaticプロパティである$viewに値をkeyとvalueで保持してあげて、
template側では、View::$view['key']で呼び出せるようにしました。

まだまだ修正する予定で、
本当にこれが効率が良いかわかりませんが、問題は解決できました。

ご回答してくださった方、ありがとうございました。

投稿2019/06/21 05:12

編集2019/06/21 05:13
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/06/21 05:22

ざっと読んで気になった点 ・コントローラーはあくまで出力するデータを準備する場所なのでviewの面倒を見るview_*系の関数を持っているのは役割として越えています。Viewに持つべきでしょう。そうすることでデータへのアクセスが楽になります。 ・なので親クラスは例えば抽象クラスにしておいて抽象メソッドを準備し、子クラスに実装を強制させる仕組みがあっても良いと思います。 例えばgetとpostとか。 ひとつ指摘。 参考先はあくまで参考なので自身が組んだ現在のコードはきちんと提示しましょう。 誰もあなたが今回回答に投稿したようなコードを組んでいると知らないわけですから「現在の実装に合わせた回答」はできません。
退会済みユーザー

退会済みユーザー

2019/06/21 05:28 編集

気になった点に関しまして、確かにcontrollerの役割が大きすぎますね。 とても参考になります。ありがとうございます。 抽象メソッドを準備して実装し直してみます! 指摘に関してもありがとうございます。 質問時点で、詳細なコードを記載しておくべきでした。 色々勉強になりました。ありがとうございます!
m.ts10806

2019/06/21 05:30

「ファットコントローラー」 がキーワードです(ダメな意味で) 知っておくとよりきちんとした実装ができます。 ただでさえオレオレフレームワークはコードが整理されないまま肥大化しがちですから。 設計思想を大事にすべきですね
退会済みユーザー

退会済みユーザー

2019/06/21 05:42

「ファットコントローラー」で早速調べてみました。 独自フレームワークは、自由に作成できる分 controllerに処理が集中してしまい、明確な処理の分割ができなくなりますね。 もう一度設計を見直して、ファットコントローラーにならないように実装してみます!!!
m.ts10806

2019/06/21 05:47 編集

ファットコントローラはどちらかというとフレームワークを使って製造している側の配慮が欠けていることや本来モデルやサービスなどで書けばいいロジックを全部コントローラにゴリゴリ書いてしまうことで起きてしまう現象です。 なのでフレームワークとしての規約を少し厳しくして「ファットになりにくい」設計を心がけてください。 たぶん色々な情報と連携しないと組めないような形になると思いますが、そこはフレームワークが何に重きを置くかだと思います。 ルールを重んじるのか、組みやすさを重んじるのか。 両方のいいとこどりというのは結構難しいのです・・・
退会済みユーザー

退会済みユーザー

2019/06/21 05:52

なるほど... 確かにこれまでも、modelなどに分けられるはずの処理をcontrollerに書いてしまってました。 私もまだまだ勉強が足りませんね。。。 フレームワークを作る側も、使う側もなんの処理を実装しているかを明確にして 処理を適切に分ける必要がありますね。 ありがとうございます!
m.ts10806

2019/06/21 05:57

自身で作ってみることで分かることもたくさんありますしオブジェクト指向への理解も深まると思います(私もそうでした) がんばってください。
退会済みユーザー

退会済みユーザー

2019/06/21 08:02

ありがとうございます! もっとたくさんのコードに触れて、自分で作成してみて理解を深めていきます! ご親切にありがとうございました。 とても勉強になりました!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問