kotaro-ktr
@kotaro-ktr (Kotaro Tanaka)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

laravelにてバリデーションのエラーメッセージが表示できません。

Q&A

Closed

解決したいこと

laravelにて簡易ツイートアプリを作成中です。

controllerにてバリデーションを設け、バリデーションに引っかかった際はエラーメッセージが表示されるようにviewに記述しました。

試しにバリデーションにあえて引っかかるようにツイート本文を空欄にして投稿してみましたが、エラーメッセージが出ませんでした。

ちなみに、うまく表示されたときのコードもあります。
そちらを使えればよいのでは?と思われるかもしれませんが、laravel公式のbladeテンプレートを用いたバリデーションエラー(以下のリンク先のように記述しました)に合わせて記述しております。
https://readouble.com/laravel/8.x/ja/blade.html

image.png

うまくは行きましたが、なぜ公式通りの記述(のはず)で機能しないのか気になるため、どなたかわかる方ご教示いただけますと幸いです。

発生している問題・エラー

該当するソースコード

controllerファイル(Tweetcontroller.php)

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Tweet;

class Tweetcontroller extends Controller
{
    public function index()
    {
        $tweets = Tweet::all();
        return view('index',[
            'tweets' =>$tweets 
        ]);
    }
    public function create()
    {
        return view('create');

    }
    public function store(Request $request)
    {
        $this->validate($request,[
          'body'=>['required', 'string', 'max:255']  //バリデーション部分
        ]);

        $tweet = new Tweet;
        $tweet->body = $request->input('body');
        $tweet->save();

        $request->session()->flash('flash_message', 'ツイートの新規登録が完了しました。') ;


        return redirect('/tweets');
    }
//以下省略
}

viewファイル(create.blade.php)

@extends('layouts/default')

@section('page-title')
    ツイート新規投稿
@endsection

@section('content')
    <div class="col-md-12">

        <form action="{{ Route('tweets.index') }}" method="post">
            @csrf

            <div class="form-group row">
                <label for="tweet" class="col-xs-2 col-form-label">ツイート本文</label>
                <div class="col-xs-10">
                    <input id="tweet" type="text" name="body" class="form-control @error('tweet') is-invalid @enderror" placeholder="ツイート本文を入力してください。" value="{{old('body')}}">
                    @error('tweet')
                        <div class="alert alert-danger">{{$message}}</div>
                    @enderror
                </div>
            </div>

            <div class="form-group row">
                <div class="col-xs-offset-2 col-xs-10">
                    <button type="submit" class="btn btn-primary">投稿する</button>
                </div>
            </div>
        </form>
    </div>
@endsection

うまくいった時のソースコード

viewファイル(create.blade.php)

@extends('layouts/default')

@section('page-title')
    ツイート新規投稿
@endsection

@section('content')
    <div class="col-md-12">
        @if(count($errors) > 0)
            <div class="alert alert-danger">
                <ul>
                    @foreach($errors->all() as $error)
                        <li>{{$error}}</li>
                    @endforeach
                </ul>
            </div>
        @endif
        <form action="{{ Route('tweets.index') }}" method="post">
            @csrf

            <div class="form-group row">
                <label for="tweet" class="col-xs-2 col-form-label">ツイート本文</label>
                <div class="col-xs-10">
                    <input type="text" name="body" class="form-control " placeholder="ツイート本文を入力してください。" value="{{old('body')}}">
                </div>
            </div>

            <div class="form-group row">
                <div class="col-xs-offset-2 col-xs-10">
                    <button type="submit" class="btn btn-primary">投稿する</button>
                </div>
            </div>
        </form>
    </div>
@endsection

環境

laravel 8
php 7.2.4

0

1Answer

Comments

  1. @kotaro-ktr

    Questioner

    解決しました!ありがとうございます。

    公式内の文に@error('')内では”指定する属性にバリデーションエラーがあるか判断”すると書いてありました。

    今回、TweetController内のceateメソッドで
    $tweetにbodyプロパティを指定しており、それが$requestに入力された値body(ツイート本文)と一致するように、bodyという属性(公式と言い方を合わせると)を取得しておりました。

    そのため、取得された'body'のバリデーションを@errorディレクティブでは判断していたと認識しております。


    $this->validate($request,[
    'body'=>['required', 'string', 'max:255'] //バリデーション部分
    ]);

    $tweet = new Tweet;
    $tweet->body = $request->input('body');
    $tweet->save();



    ありがとうございました!

Your answer might help someone💌