Laravel Debugbar
Laravelでプロジェクトを作ったらとりあえず入れておくパッケージのひとつです。
そんな便利なLaravel Debugbarですが、先日これが原因でちょっと困ったことになりました。(原因はこちらにありますが......)
困ったこと
とあるプロジェクトでjsonを返すWebAPIがありました。
もちろんLaravelです。
このAPI、フロントで使うこと前提で作ってたのですが、サーバーサイドでも呼び出すことになりました。
「はいはい、curlで呼べばいいのね~」(Guzzle使いました)と思いコードを書き、実行してみたところ......
$url = route('test-api');
$client = new \GuzzileHttp\Client();
// 自己証明書なhttpsなので['verify' => false]
$response = $client->get($url, ['verify' => false]);
$content = $response->getBody()->getContents();
$json = json_encode($content);
// var_dump全部出す
ini_set('xdebug.var_display_max_children', -1);
ini_set('xdebug.var_display_max_data', -1);
ini_set('xdebug.var_display_max_depth', -1);
var_dump($json); // null!!
え、なんでや......
レスポンスの中身を確認してみると
string(3458) ""{
"status" : "200",
"data" : [
"データがいろいろ"
]
"<link rel='stylesheet' type='text/css' property='stylesheet'
href='//localhost/_debugbar/assets/stylesheets?v=1551204114'><script
type='text/javascript' src='//localhost/_debugbar/assets/javascript?
v=1551204114'></script><script type="text/javascript">jQuery.noConflict(true);
</script>
.....
!?
なんだこれは......
jsonデータに大量のCSSやJavaSctipt、HTMLが含まれていました。
よく見てみると、_debugbar
の文字がちらほら
どうやらこれはLaravel DebugbarのHTML部分のようです。
APIをコールした場合に、debugbarを再表示するために付与されるもののようです。
解決策
ぐぐったら一発でした。
Laravel debugbar adding data to my api response.
<?php
return [
// 省略
'except` => [
'telescope*',
// これを追加
'api*',
]
// 以下省略
]
これだけ
debugbar.php
がない人は以下を実行してください。
php artisan vendor:publish --provider="Barryvdh\Debugbar\ServiceProvider"
これでAPIのレスポンスにdebugbarの情報が付与されることはなくなりました。
めでたし
根本的な原因
ちょろっと調査したところ、問題のWebAPIはController側でjson文字列
を返していることがわかりました。
// 実際はDBから取ってきていろいろしてる
$json = '"status": "200","data": [いろいろ]';
return $json;
文字列で返すのが良いのか悪いのかは置いておいて、以下のようにすればdebugbarの情報は付与されずに返ってきます。
$json = [
'status' => 200,
'data' => [
// いろいろ
]
];
return $json;
わざわざstring
にしなくてもLaravelがjson形式にしてくれるので、不要な手間をかけずにすみますね。
(もしくは元ソースの$jsonをjson_decodeするとか
)
というかこれが普通のやり方だと思うんですが、なぜstring
なんかになっていたのでしょうか......
何はともあれ、ぐぐって解決策が出てくるということは、稀によくあることだと思うので、備忘録として残してみました。
以上です。