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

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

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

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

4403閲覧

Laravel APIを叩いた時のエラー

退会済みユーザー

退会済みユーザー

総合スコア0

Laravel

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2019/08/30 08:17

編集2019/08/30 08:53

前提・実現したいこと

Laravelで簡単なAPIを実装しています。
具体的には、GET,POST,PUT,DELETEのAPIです。
ですが、GET,DELETEはうまくいくのですが、POST,PUTの際にエラーが発生します。
また、POSTはデータだけは一応入ります。
どなたか解決方法のご教授お願い致します。

発生している問題・エラーメッセージ

POST

1// curl -XPOST localhost:8000/api/tasks -d 'name=Learn Vue.js' 2 3[2019-08-30 08:06:35] local.ERROR: Call to a member function fresh() on boolean {"exception":"[object] (Symfony\Component\Debug\Exception\FatalThrowableError(code: 0): Call to a member function fresh() on boolean at /var/www/html/jwt/app/Http/Controllers/TaskController.php:21) 4[stacktrace] 5#0 [internal function]: App\Http\Controllers\TaskController->store(Object(Illuminate\Http\Request))

PUT

1// curl -XPUT localhost:8000/api/tasks/5 -d 'is_done=true' 2 3[2019-08-30 08:05:03] local.ERROR: Call to a member function fresh() on boolean {"exception":"[object] (Symfony\Component\Debug\Exception\FatalThrowableError(code: 0): Call to a member function fresh() on boolean at /var/www/html/jwt/app/Http/Controllers/TaskController.php:38) 4[stacktrace] 5#0 [internal function]: App\Http\Controllers\TaskController->update('5', Object(Illuminate\Http\Request))

該当のソースコード

route

1Route::group(['middleware' => 'api'], function () { 2 Route::resource('tasks', 'TaskController'); 3}); 4

Model

1<?php 2 3namespace App; 4 5use Illuminate\Database\Eloquent\Model; 6 7class Task extends Model 8{ 9 protected $fillable = ['name', 'is_done']; 10 protected $casts = [ 11 'is_done' => 'boolean', 12 ]; 13} 14

Controller

1<?php 2 3namespace App\Http\Controllers; 4 5use Illuminate\Http\Request; 6use App\Task; 7 8class TaskController extends Controller 9{ 10 // GET 11 public function index() 12 { 13 return Task::take(5)->get()->keyBy('id'); 14 } 15 16 // POST 17 public function store(Request $request) 18 { 19 return Task::create($request->only('name'))->save()->fresh(); 20 } 21 22 // DELETE 23 public function destroy($id) 24 { 25 return Task::destroy($id); 26 } 27 28 // PUT 29 public function update($id, Request $request) 30 { 31 return Task::find($id)->fill($request->only('is_done')) 32 ->save()->fresh(); 33 } 34} 35

試したこと

storeでrerurn $request

イメージ説明

updateでreturn $id

イメージ説明

補足情報(FW/ツールのバージョンなど)

Laravel 5.8.33

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

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

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

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

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

m.ts10806

2019/08/30 08:23

$requestがきちんと渡ってきているかとか$idのようなパラメータが渡ってきているかどうかとかは確認されました? エラー内容からbool型になっているようなので、きちんと渡ってきていないように見えます。
退会済みユーザー

退会済みユーザー

2019/08/30 09:08

ご回答ありがとうございます! メソッドの中で$requestと$idを返すようにして、確認したのですが一応渡っている?ようです。 その内容を「試したこと」に追記致しました!
退会済みユーザー

退会済みユーザー

2019/08/30 11:24

saveの戻り値を調べてみたところ、成否値が返ってきていたため、 $task = Task::create($request->only('name'))->save(); if ($task === true) { $freshTask = new Task(); return $freshTask->fresh(); } ... としたところ無事解決致しました。 ありがとうございました!!!
guest

回答1

0

ベストアンサー

save の戻り値が ture(保存できた) か false(保存できなかった) でそれに対してfreshしてもそんなメソッドboolean型にねーから
という事でしょう

投稿2019/08/30 08:54

mikkame

総合スコア5036

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

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

退会済みユーザー

退会済みユーザー

2019/08/30 09:06 編集

ご回答ありがとうございます! freshを消してみたのですが、また新たなエラーが発生いたしました...。 ----- POST ----- [2019-08-30 09:03:59] local.ERROR: The Response content must be a string or object implementing __toString(), "boolean" given. {"exception":"[object] (UnexpectedValueException(code: 0): The Response content must be a string or object implementing __toString(), \"boolean\" given. at /var/www/html/jwt/vendor/symfony/http-foundation/Response.php:401) ----- PUT ----- [2019-08-30 09:05:06] local.ERROR: The Response content must be a string or object implementing __toString(), "boolean" given. {"exception":"[object] (UnexpectedValueException(code: 0): The Response content must be a string or object implementing __toString(), \"boolean\" given. at /var/www/html/jwt/vendor/symfony/http-foundation/Response.php:401)
退会済みユーザー

退会済みユーザー

2019/08/30 09:36 編集

一応、このAPIは下記のサイトを参考にしたものですm(__)m https://qiita.com/acro5piano/items/7ae04c0e57d0027f63c9 下記のサイトでは動いているようなのですが、どうも私のじゃ上手くいきません…。
mikkame

2019/08/30 09:41

これも同じ理由ですね Controllerからreturnする時は StringかObjectを返して欲しいんだけど、boolean型が返ってきてますよ というエラーです(読んだまんま) save fresh return $task で3行に分けて書いてみては?
退会済みユーザー

退会済みユーザー

2019/08/30 11:24

なるほど。saveの戻り値を調べてみたところ、成否値が返ってきていたため、 $task = Task::create($request->only('name'))->save(); if ($task === true) { $freshTask = new Task(); return $freshTask->fresh(); } ... としたところ無事解決致しました。 ありがとうございました!!!
mikkame

2019/08/30 11:59

どちらの問題もエラーメッセージの通りですので まずはエラーメッセージを理解して検証する事をお勧めします
退会済みユーザー

退会済みユーザー

2019/08/30 12:08

ご指摘ありがとうございます。 一応自分なりに調べたりしていたんですが、まだまだ理解が足りていませんでした...。 これからはエラーメッセージを理解、検証することを大切にしたいと思います。 お忙しい中、最後までありがとうございましたm(_ _)m
mikkame

2019/08/30 12:59

本件に関してはエラーを読んだままなので まずは調べる前に翻訳してみましょう
退会済みユーザー

退会済みユーザー

2019/08/30 13:25

はい!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問