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

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

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

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

Q&A

解決済

1回答

2970閲覧

Request::forge が接続に失敗したことを検知する方法

退会済みユーザー

退会済みユーザー

総合スコア0

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

0グッド

0クリップ

投稿2019/06/27 03:10

編集2019/06/27 04:04
$request = Request::forge($url, 'curl'); $response = $request->execute(); $response = $this->logger->log(\Fuel::L_ERROR, $response); $response = $response->response(); // ここで例外

このようなコードをかいて URL 先のネットワークに接続できない場合
response() で例外をはきます

その前の execute() の結果を出力してみると膨大な中身が出力されるんですが
execute() の時点で接続失敗したことを検知するにはどうすればいいのでしょうか

http://fuelphp.jp/docs/1.7/classes/request/request.html
ドキュメントには excute の後 response 以外のメソッドがのっていません
例外で検知するしかないですか?

追記:

try { $request = Request::forge($url, 'curl'); $response = $request->execute(); $response = $response->response(); $scope = $response->body; } catch (\Exception $e) { $resMsg = json_decode($e->getMessage()); if(isset($resMsg->error)){ : } else { : // ここにとんでくる } }

のような感じで接続に成功すること前提で例外を分岐に使ってるようなコードがあって
レスポンスフォーマットによって例外をだすださないで分岐してるような糞コードみたいで
接続失敗の際に正常処理扱いされて他の場所に影響がでている感じなのです
(自分がかいたわけではないのでレスポンスの中身やロジックが不明)

なので接続失敗の場合だけさっさと別のエラーレスポンスを返してしまいたいです

追記:

{'error' : 'message'}
というようなレスポンスを返却したとして
例外にとんできて $e->getMessage() で取得できるロジックもよくわからないのですが…
これが Request::forge の普通の使い方なのでしょうか

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

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

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

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

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

m.ts10806

2019/06/27 03:28 編集

>response() で例外をはきます try-catchで例外を捕捉するとかそういう話ではないのでしょうか?
退会済みユーザー

退会済みユーザー

2019/06/27 03:47

追記をみていただきたいのですが すでに例外を別の正常処理の一部に使われているので コネクションエラーだけを正常処理から分離したい感じです
m.ts10806

2019/06/27 03:53

>json_decode($e->getMessage()); ここが良く分かりません。通常はgetMessage()には単なる文字列が入っているはずですが、フレームワークの方でJSON形式のエラーをおさめるようになっているということでしょうか?(FuelPHPは未経験なので私が知らないだけかもしれませんが)
退会済みユーザー

退会済みユーザー

2019/06/27 03:59 編集

自分もよくわかっていませんがそこで例外は出ていないようです どうもそこに入るメッセージは相手のサーバー側で作成しているようで そっちのレスポンスも同じ人がかいたものなので JSON で返却して error というキーをいれるかどうかで対応をかえてるんだと想像してます
m.ts10806

2019/06/27 04:09

そもそも元が自身が書いたコードではないということでしょうか。
退会済みユーザー

退会済みユーザー

2019/06/27 04:31

そうです
guest

回答1

0

ベストアンサー

ドキュメントで解説がない部分はコアソースを読むしかないと思います。

/fuel/core/classes/request.php
Githubの最新コード

を読むと、PHPDocが下記のようになっています。

php

1 /** 2 * This executes the request and sets the output to be used later. 3 * 4 * Usage: 5 * 6 * $request = Request::forge('hello/world')->execute(); 7 * 8 * @param array|null $method_params An array of parameters to pass to the method being executed 9 * @return Request This request object 10 * @throws \Exception 11 * @throws \FuelException 12 * @throws \HttpNotFoundException 13 */ 14 public function execute($method_params = null)

つまり、引数$method_params(null可)によって内容を解析し、その状況次第で様々なExceptionをthrowしていることが分かります。

質問者さんが受け取りたいのはどういう状況のExceptionでしょうか?
「URL 先のネットワークに接続できない場合」としたら\HttpNotFoundExceptionが拾えるかもしれません。

試してみてください。

php

1 try { 2 $request = Request::forge($url, 'curl'); 3 $response = $request->execute(); 4 $response = $response->response(); 5 $scope = $response->body; 6 } catch (\HttpNotFoundException $e) { //これを追加してみる 7 var_dump($e); 8 } catch (\FuelException $e) { //これも追加してみる 9 var_dump($e); 10 } catch (\Exception $e) { 11 $resMsg = json_decode($e->getMessage()); 12 13 if(isset($resMsg->error)){ 14 : 15 } 16 else { 17 : // ここにとんでくる 18 } 19 } 20

もし拾えないのでしたら現状ではexecute時点ではExceptionをthrowする情報ではないということになりそうです。

追記:

例外にとんできて $e->getMessage() で取得できるロジックもよくわからないのですが…

これが Request::forge の普通の使い方なのでしょうか

いえ。PHPの例外処理の仕様です。

意図的に例外をthrowする場合は、引数で「メッセージ」を指定できます。
それを取得するのがExceptionのgetMessage()メソッドというだけの話です。

php

1<?php 2try{ 3 throw new Exception("テスト"); 4}catch(Exception $e){ 5 echo $e->getMessage(); 6} 7//出力結果:テスト

投稿2019/06/27 04:52

編集2019/06/27 05:15
m.ts10806

総合スコア80765

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

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

退会済みユーザー

退会済みユーザー

2019/06/27 11:09

ありがとうございました gitソースを提示していただいたおかげで非常にわかりやすかったです やりたいことができました
m.ts10806

2019/06/27 11:16

私もFuel詳しいわけではないですが、別のフレームワークでも「ドキュメントに言及されてなければコアソースを読む」ようにしているので、そこからできることできないことを探っています。 PHPの勉強にもなりますよ。
m.ts10806

2019/06/27 11:18 編集

Githubのコードは質問者さんに見やすくするために提示しただけで、実際は自身の環境にComposerでFuelPHP入れてコード検索して確認しています。
退会済みユーザー

退会済みユーザー

2019/06/27 11:32

fuel にソースコードがあること自体初めて知りました ruby の git に比べたら遥かによみやすいので ブックマークして今後は参考にしていきたいと思います ありがとうございます
m.ts10806

2019/06/27 11:49

ん。あくまで「PHPフレームワーク」なので、PHPで組まれたコードがちゃんとありますよ。 もっと言えばPHPもC言語で作られたオープンソースなので、CのコードがGithubで公開されています。
m.ts10806

2019/06/27 11:51

フレームワーク導入されている以上はお手元の環境にも提示のバージョンのソースがあるはずなので、何かあればお手元のソースを確認してみてください。Githubに上がっているのは最新なのでお手元のバージョンと全く同じとは限りませんし
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問