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

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

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

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Redis

Redisは、オープンソースのkey-valueデータストアで、NoSQLに分類されます。すべてのデータをメモリ上に保存するため、処理が極めて高速です。

PHP

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

Eloquent

Eloquentとは、PHPフレームワークのLaravelに最初から含まれているORM(Object-relational mapping:オブジェクト関係マッピング)です。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

1回答

4076閲覧

DBやRedisでのデータやり取り時のエラーハンドリングについて。

退会済みユーザー

退会済みユーザー

総合スコア0

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Redis

Redisは、オープンソースのkey-valueデータストアで、NoSQLに分類されます。すべてのデータをメモリ上に保存するため、処理が極めて高速です。

PHP

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

Eloquent

Eloquentとは、PHPフレームワークのLaravelに最初から含まれているORM(Object-relational mapping:オブジェクト関係マッピング)です。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

1グッド

1クリップ

投稿2016/06/10 10:51

現在Laravelを使用してWebアプリケーションを開発しています。

EloquentやRedisで処理が失敗する可能性がある場合にどのようなコードを書くべきか悩んでいます。

例えば、ユーザー情報(ここではメールアドレスとします。)をEloquentで保存する場合、以下のように書くと思います。(綺麗にクラス設計するといった話は無視です。本質のみに焦点を当ててますのでご了承ください。)

*サンプルコード*

lang

1class UserController extends Controller 2{ 3 /** 4 * 5 * UserはEloquentを継承。 6 * 7 * @param string $email 8 */ 9 public function postEmail(Request $request, User $user, $email) 10 { 11 $user->email = e($email); 12 $user-save(); 13 14 // 保存できたuserのEmailをRedisにも保存。 15 Redis::hmset($user->getAuthIdentifier(), ['email' => $email]) 16 17 return Response::make('ALL, OK!!'); 18 } 19}

こういうコードがあった場合に、Laravelであれば、Laravelの例外ハンドラ(App\Exceptions\Handler)でキャッチしてDBで失敗しました、というレスポンスを返すか、try~catchで例外をpostEmail内でキャッチしてエラーレスポンスを返すべきか、悩んでいます。

悩む理由ですが、ライブラリでたまにコードを見てみると例外が発生する可能性がありますが、try~catchを使用していないのを見かけるんです。そして何故そう実装するのか理由が知りたいです。

補足の説明となりますが、
EloquentやRedisに接続し、データのやり取りを行う際に、当然途中で処理に何らかの理由により失敗する可能性があると思います。ほとんどのエラー(パラメーターが不足しているとか、文法が異なるとか)は開発時に発見可能なものであると思っていまして、やり取りでエラーになるのは例えば、アクセス負荷が大きくてDBが死んだ、メモリが不足していったなどなど、コードレベルとはまた異なる領域で発生するエラーであり、コードレベルではそれらを例外として扱うことになると考えています。

ですので、私の考えとしてはLaravelの例外ハンドラでそう言った失敗系のエラーはキャッチして、適切なレスポンスを返し、失敗するのは稀でありコード上では何か特別な理由がない限り上記のサンプルコードのようにすべきかと思っているのですが、皆様のご意見を伺ってみたいと思っています。

失敗可能性のあるコードはtry~catchが入ってきてコードをうまく記述するの難しいと感じているので、
PHPにて何かうまい書き方などありましたら、ご教授いただきたいと思っています。(PHPじゃなくても何かありましたら教えていただきたいです。)

また、例外が発生する可能性がある処理(ここでは$user->save()とその後のRedis::hmset)が連続する場合も、どう例外を処理し、コードもうまく書けるか、教えて頂きたいです。

分かりづらかったらすみません。

よろしくお願いします!

yodel👍を押しています

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

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

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

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

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

guest

回答1

0

Laravelの話というか、例外ハンドリングのプログラミング技法の悩みのように聞こえます。

例外ハンドリングをどこで行うかは、どこで例外ハンドリングしたいか?を考えることです。そうすると、自ずとどの部分で例外ハンドリングをすれば良いかが見えてきます。

どのレイヤーで例外をハンドリングするかは、ポリシーや、1つのロジック実行など、複合的な要素が絡んできますので、よく考えれば良いと思います。

基本的に、例外ハンドリングをする場合、どこでハンドリングするかという土肥に対する答えは1つです。どこでハンドリングするか悩むというのは、未だ考えが浅いからかと思います。

考えるアプローチとしては、機能ごとに責務があると思います。その責務を明確に考えることです。あるメソッド(機能)はどんな責任があるのか?を考えることです。例えば、接続エラーが起きたときにはその機能内の責任で処理してしまって良いのか、ダメであればより上位でハンドリングする必要があります。良ければ、その機能内でハンドリングしてしまえば良いのです。

投稿2016/06/17 08:56

編集2016/06/17 09:02
matsubokkuri

総合スコア744

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問