トップページ
Laravel学習サイトLaravelやるばい

目次

つぶやきの作成

今回はつぶやきを作成します。

難しい内容に感じると思いますが頑張って仕組みを理解して何度も繰り返して自分の中で定着させて下さい。


つぶやきを保存するアクション

今回はどのアクションを使えばいいか分かりますか?

リソースコントローラーのアクションは下記でした。

つぶやきの保存なのでアクション名は「store」です。

TweetController.phpを下記に変更します。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Tweet;                                      //この行を追加

class TweetController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        return view('post.index');
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        return view('post.create');
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
    
    
        //ここから追加
        $tweets = new Tweet();
        $tweets->body = $request->body;
        $tweets->save();
        return back();
        //ここまで追加
        
        
    }

                ・
                ・

追記したコードの意味を説明します。

「use App\Models\Tweet」はTweetモデルを遣う為の設定です。

下記のコードが挫折するポイントです。

$tweets = new Tweet();
$tweets->body = $request->body;
$tweets->save();
return back();

意味を説明しますが「そんなもんか〜」位で考えた方が挫折しないと思います。

「new Tweet()」でTweetクラスのインスタンスを生成していますがこの説明だと「えっ?意味が分からない」となります。

Tweetはモデル名ですがこの記述があることでテーブルのレコードを作成できるという認識があれば問題ないです。

$tweets->body=$request->body;」は$tweets->bodyがtweetテーブルのbodyカラムで「$request->body」がつぶやきを作成するname="body"があったフォームの値です。(下記参照)

<div>
    <h1>つぶやきの作成</h1>
    <form>
        <div>
            <textarea name="body" cols="40" rows="10" placeholder="ここにつぶやきの内容を書く"></textarea>   //←この行
        </div>
        <button type="submit">つぶやく</button>
    </form>
</div>

「$tweets->save()」でつぶやきの内容をbodyカラムに保存します。

「return back();」でつぶやきを作成するページにリダイレクトします。


モデル

テーブルに値を保存する時はモデルに登録できるカラム名を記述しないとエラーになるので記述します。

「tweet > app > Models > Tweet.php」に記述します。

20241123_151937_tweet21.jpg

下記の記述になっています。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Tweet extends Model
{
    use HasFactory;
}

下記の追記をします。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Tweet extends Model
{
    use HasFactory;


    //ここから追加
    protected $fillable = [
        'body'
    ];
    //ここまで追加

    
}

「body」の所にテーブルに登録を許可するカラム名を記述します。

最後にビューをテーブルに保存できるコードにしていないので修正します。

ビュー

create.blade.phpのコードを下記にします。

<div>
    <h1>つぶやきの作成</h1>
    <form method="post" action="{{route('tweet.store')}}">       //この行を修正
        @csrf        //この行を追加
        <div>
            <textarea name="body" cols="40" rows="10" placeholder="ここにつぶやきの内容を書く"></textarea>
        </div>
        <button type="submit">つぶやく</button>
    </form>
</div>

追記したコードの説明をします。

「method="post"」ですが保存する時は「method="〜"」の「〜」は「post」にすると思っていいです。

「action="{{ route('tweet.store') }}"」の「tweet.store」は表示するファイル名を記述すればいいですが下記のコマンドで分かります。

xxxxxx@MacBook-Pro tweet % php artisan route:list

下記の表示になります。

tweet ................. tweet.index › TweetController@index
tweet ................. tweet.store › TweetController@store
tweet/create .......... tweet.create › TweetController@create
tweet/{tweet} ......... tweet.show › TweetController@show
tweet/{tweet} ......... tweet.update › TweetController@update
tweet/{tweet} ......... tweet.destroy › TweetController@destroy
tweet/{tweet}/edit .... tweet.edit › TweetController@edit

つぶやきを保存する時は「tweet.store」です。

だから「action="{{ route('tweet.store') }}"」と記述しました。
「@csrf」はクロスサイトリクエストフォージェリというハッキングみたいなのがあるのですがそれの対策です。

Laravelではフォームタグにこれを記述しないとエラーになる仕様になっています。

これでつぶやきを作成するプログラムは完成しました。

最後に動作確認をします。


動作確認

適当につぶやきを作成して下さい。

作成したら動作確認の為にテーブルを確認します。

phpMyAdminのtweetsテーブルにレコードがあるかを確認して下さい。

下記のようにレコードがあったらつぶやきの保存は成功しています。

20241123_152935_tweet22.jpg

今回はここまでです。


戻る