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

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

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

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

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

1回答

5225閲覧

cakephpでの例外処理(try catch)の書き方を教えてください。

amakusa

総合スコア176

PHP

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

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2015/08/05 08:50

皆さんお疲れ様です。
先日から何度もcakephp関連の質問に対して丁寧にお答えしていただきありがとうございます。
今回はすごく具体的なことをお聞きします。
質問が長くなり、見えにくいかとは思いますがご容赦ください。
私のcakephpはversion2.6.4です。

今現在、cakephpにtry catch文を用いて例外処理をしようとしています。
しかし、正直まだ例外処理をどこに書いたらよいのかもあまり理解できておりません。
バリデーションは書いていますが、これでよいのかさえ正直わかりません。
目星として、データを扱うcontroller内に書けばよいのかなとあたりをつけています。

以下コードです。

php

1public function index() { 2 3 //Reportコレクションに対するバリデーション-------------------------------------- 4 $this->Report->set($this->request->data); 5 if ($this->Report->validates()) { 6 //正しい場合のロジック 7 } else { 8 //正しくない場合のロジック 9 $errors = $this->Report->validationErrors; 10 } 11 12 //Requestコレクションに対するバリデーション------------------------------------- 13 $this->Request->set($this->request->data); 14 if ($this->Request->validates()) { 15 //正しい場合のロジック 16 } else { 17 //正しくない場合のロジック 18 $errors = $this->Request->validationErrors; 19 } 20 21 //queryのidを元にreportのオブジェクトを取得------------------------------------- 22 $reportId = $this->request->query['id']; 23 24 $report = $this->Report->find('all', array('conditions' => array("id" => $reportId)));//そのreportsの中にあるさっきのidがあるドキュメントの情報を取得 25 $report_obj = $report[0]["Report"]; 26 27 //ReportsCollectionから変数をセット------------------------------------------- 28 $userid = $report_obj["userObjectId"]; 29 $requestId = $report_obj["requestId"]; 30 $reason = $report_obj["reason"]; 31 $message = htmlspecialchars($report_obj["message"]); 32 $comment = $report_obj["comment"]; 33 $reportstatus = $report_obj["status"]; 34 $modified = $report_obj["modified"]->toDateTime()->format('Y-m-d H:i:s'); 35 $created = $report_obj["created"]->toDateTime()->format('Y-m-d H:i:s'); 36 37 //report_objのrequestIdから該当するオブジェクトを取得---------------------------- 38 $request = $this->Request->find('all', array('conditions' => array("id" => $requestId)));//先ほどのrequestIdがあるrequestsの中のドキュメントを取得 39 $request_obj = $request[0]["Request"]; 40 41 //RequestsCollectionから変数をセット------------------------------------------ 42 $imagepath = $request_obj["imagePath"]; 43 $requeststatus = $request_obj["status"]; 44 45 //ビューに変数を引き渡す------------------------------------------------------- 46 $this->set(compact("reportId", "userid", "requestId", "reason", "message", "comment", "reportstatus", "modified", "created", "imagepath", "requeststatus")); 47 $this->set('imagehost', IMAGEPATH); 48 } 49

このpublic function indexでは主に変数を決めてviewに渡しているだけなので、バリデーションしか書いておりません。もしここでも例外処理を書く必要があればどこにどう書けばよいのか教えていただきたいです。

次はpublic function updateです

php

1 public function update(){ 2 3 //Reportコレクションに対するバリデーション-------------------------------------- 4 $this->Report->set($this->request->data); 5 if ($this->Report->validates()) { 6 //正しい場合のロジック 7 } else { 8 //正しくない場合のロジック 9 $errors = $this->Report->validationErrors; 10 } 11 12 //Requestコレクションに対するバリデーション------------------------------------- 13 $this->Request->set($this->request->data); 14 if ($this->Request->validates()) { 15 //正しい場合のロジック 16 } else { 17 //正しくない場合のロジック 18 $errors = $this->Request->validationErrors; 19 } 20 21 $this->autoRender = false; 22 //処理状態の更新-------------------------------------------------------------- 23 24 if(isset($this->request->data['report_status'])){ 25 $reportId = $this->request->data['report_id']; 26 $report = $this->Report->find('all', array('conditions' => array("id" => $reportId)));//そのreportsの中にあるさっきのidがあるドキュメントの情報を取得 27 $report_obj = $report[0]["Report"]; 28 $report_obj["status"] = $this->request->data['report_status']; 29 $report_obj["modified"] = array('modified' => date('Y-m-d H:i:s')); 30 $data = $report_obj; 31 $this->Report->save($data); 32 33 $this->redirect($_SERVER['HTTP_REFERER']); 34 } 35 //表示状態の更新-------------------------------------------------------------- 36 37 if(isset($this->request->data['request_status'])){ 38 $requestId = $this->request->data['request_id']; 39 $request = $this->Request->find('all', array('conditions' => array("id" => $requestId)));//そのreportsの中にあるさっきのidがあるドキュメントの情報を取得 40 $request_obj = $request[0]["Request"]; 41 $request_obj["status"] = $this->request->data['request_status']; 42 $data = $request_obj; 43 $this->Request->save($data); 44 45 $reportId = $this->request->data['report_id']; 46 $report = $this->Report->find('all', array('conditions' => array("id" => $reportId)));//そのreportsの中にあるさっきのidがあるドキュメントの情報を取得 47 $report_obj = $report[0]["Report"]; 48 $report_obj["modified"] = array('modified' => date('Y-m-d H:i:s')); 49 $data = $report_obj; 50 $this->Report->save($data); 51 52 $this->redirect($_SERVER['HTTP_REFERER']); 53 } 54 //コメントの更新-------------------------------------------------------------- 55 56 if(isset($this->request->data['report_comment'])){ 57 $reportId = $this->request->data['report_id']; 58 $report = $this->Report->find('all', array('conditions' => array("id" => $reportId)));//そのreportsの中にあるさっきのidがあるドキュメントの情報を取得 59 $report_obj = $report[0]["Report"]; 60 $report_obj["comment"] = $this->request->data['report_comment']; 61 $report_obj["modified"] = array('modified' => date('Y-m-d H:i:s')); 62 $data = $report_obj; 63 $this->Report->save($data); 64 65 $this->redirect($_SERVER['HTTP_REFERER']); 66 } 67 }

こちらではDBのフィールド3つに対してpostしています。
saveがあるのでこの部分に例外処理を書かなければいけないだろうとは思うのですが、
function自体に対して例外処理をかけるのか、それとも$this->Report->save();のところだけにかけるのかを教えていただきたいです。

1つとっかかりがわかればだいたいできると思うのですがとっかかりすらない状態なのでなんとか教えていただきたいです。宜しくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

$this->Request->save(); この行の結果が失敗だった場合falseが返りますので、
以下の通りで大丈夫です。

php

1if ($this->Request->save(....) === false) { 2 //エラーメッセージやその後の処理 3}

try catch を使う必要はないかと思います。

例外処理とは関係ありませんが、
$this->Request->save() の第3引数にフィールドリストを指定することをお勧めします。

try catch の必要性が最初から分かっている箇所では、それを未然に防ぐコードを書くべきです。
例えばゼロでの除算が発生しうる箇所では除算前にゼロか否かの判断をして適切な分岐を行います。
と、私は考えます。

投稿2015/08/05 10:25

編集2015/08/05 11:11
rik

総合スコア1151

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

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

amakusa

2015/08/05 16:47

回答ありがとうございます! では、他の箇所でのtry catch文は必要ない、ということでしょうか? DBからgetでdataを持ってきたりするときには必要なくて、postでdataを送るときのみ例外処理は必要になる、という認識でよろしいのでしょうか? 質問ばかりですみませんがお願い致します。
rik

2015/08/05 23:32

phpの場合は例外を投げる(throw)することによりcatchできますので、これは事前のif文などの分岐で対応できます。勝手にthrowされることは有りません。 他のコンパイラ言語の場合は自動的にthrowされる仕様の言語が有りますのでtry catch を書けばエラーを捕獲してくれます。 と思いますがこのあたりの回答は自信がありません。 と言いますのは、 私はtry catch で処理するよりは想定されるエラーが有るなら条件分岐でエラーを回避するべきと考えており、極力try catchを使わないようにしているからです。 phpではtry catchをほぼ使ったことが有りません。 例外を未然に防ぐコードを書く事により、フローが明確になりますし、デバッグ意識が高まります。 VB.NET等のコンパイラ言語ではそれなりにtry catchを使用します。 これは書き方に個人差があると思います。 逆に皆様にphpでtry catchを使用するか否か聞いてみたいですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問