Laravel 6でユーザー登録の項目を追加して修正できるようにする

Laravel Laravel

laravel/uiをセットアップするとユーザー登録することができるようになりますが、登録できる項目は、

  • 名前
  • E-mail
  • パスワード

のみです。

ECサイトのように、他の項目も登録できるようにします。また、修正する機能も追加します。

作成したときの環境

  • macOS 11.2.3 
  • PHP 8.0.3
  • Laravel 6.20.22

環境設定は、こちらを参考にしてください。

マイグレーション

マイグレーションファイルを修正する

マイグレーションファイルを修正します。

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->timestamp('email_verified_at')->nullable();
        $table->string('password');
        $table->string('postal_code')->comment('郵便番号');
        $table->integer('pref_id')->comment('都道府県ID');
        $table->string('city')->comment('市区町村');
        $table->string('town')->comment('町名番地等');
        $table->string('building')->nullable()->comment('建物等');
        $table->string('phone_number')->comment('電話番号');
        $table->rememberToken();
        $table->timestamps();
    });
}

9-14行目に項目を追加しています。

マイグレーションを実行する

マイグレーションを実行します。

php artisan migrate

テーブルが作成されていることを確認します。

コントローラとモデル、フォームリクエスト

ユーザー登録用のコントローラは既に”app/Http/Controllers/Auth/RegisterController.php”がありますので、それを使います。

ユーザー修正用には”app/Http/Controllers/UserController.php”を新規作成します。

Userモデル

“RegisterController”にバリデーションルールの記載がありますが、同じものを”UserController”でも使いたいので、Userモデルに記載することにします。”RegisterController”からは、バリデーションルールとエラーメッセージの内容は削除しました。

/**
 * バリデーションルール
 * Auth\RegisterControllerから移動しています。
 * 追加したユーザーの項目を追記しています。
 *
 * @var array
 */
public static $rules = [
    'name' => ['required', 'string', 'max:50'],
    'email' => ['required', 'string', 'email:rfc', 'max:255', 'unique:users'],
    'password' => ['required', 'string', 'min:8', 'confirmed'],
    'postal_code' => ['required', 'regex:/^[0-9]{3}-[0-9]{4}$/'],
    'pref_id' => ['required'],
    'city' => ['required', 'max:50',],
    'town' => ['required', 'max:50'],
    'building' => ['max:50'],
    'phone_number' => ['required', 'regex:/^[0-9]{2,4}-[0-9]{2,4}-[0-9]{4}$/'],
];

/**
 * バリデーションエラーメッセージ
 * Auth\RegisterControllerから移動しています。
 * 追加したユーザーの項目を追記しています。
 *
 * @var array
 */
public static $messages = [
    'name.required' => 'お名前を入力してください。',
    'name.max' => 'お名前は50文字以内で入力してください。',
    'email.required' => 'E-mailアドレスを入力してください。',
    'email.email' => '正しいE-mailアドレスを入力してください。',
    'email.max' => 'E-mailアドレスは255文字以内で入力してください。',
    'email.unique' => 'そのメールアドレスは既に登録されています。',
    'password.required' => 'パスワードを入力してください。',
    'password.min' => 'パスワードは8文字以上で入力してください。',
    'password.confirmed' => '入力されたパスワードが一致しません。',
    'postal_code.required' => '郵便番号を入力してください。',
    'postal_code.regex' => '郵便番号は、半角数字3桁、半角ハイフン、半角数字4桁、の形式で入力してください。',
    'pref_id.required' => '都道府県を選択してください。',
    'city.required' => '市区町村を入力してください。',
    'city.max' => '市区町村は50文字以内で入力してください。',
    'town.required' => '町名番地等を入力してください。',
    'town.max' => '町名番地等は50文字以内で入力してください',
    'building.required' => '建物等は50文字以内で入力してください。',
    'phone_number.required' => '電話番号を入力してください。',
    'phone_number.regex' => '電話番号は、半角数字と半角ハイフンで入力してください。'
];

また、都道府県はselectボックスから選択した都道府県のIDの値をインサート・アップデートに使用したいので、リスト作成用の連想配列もUserモデルに用意しました。

/**
 * 都道府県リスト
 * viewで使用する都道府県のリスト
 *
 * @var array
 */
public static $prefs = [
    1 => '北海道',
    2 => '青森県', 3 => '岩手県', 4 => '宮城県', 5 => '秋田県', 6 => '山形県', 7 => '福島県',
    8 => '茨城県', 9 => '栃木県', 10 => '群馬県', 11 => '埼玉県', 12 => '千葉県', 13 => '東京都', 14 => '神奈川県',
    15 => '新潟県', 16 => '富山県', 17 => '石川県', 18 => '福井県', 19 => '山梨県', 20 => '長野県',
    21 => '岐阜県', 22 => '静岡県', 23 => '愛知県', 24 => '三重県',
    25 => '滋賀県', 26 => '京都府', 27 => '大阪府', 28 => '兵庫県', 29 => '奈良県', 30 => '和歌山県',
    31 => '鳥取県', 32 => '島根県', 33 => '岡山県', 34 => '広島県', 35 => '山口県',
    36 => '徳島県', 37 => '香川県', 38 => '愛媛県', 39 => '高知県',
    40 => '福岡県', 41 => '佐賀県', 42 => '長崎県', 43 => '熊本県', 44 => '大分県', 45 => '宮崎県', 46 => '鹿児島県', 47 => '沖縄県',
];

RegisterController

ユーザー登録後のリダイレクト先を変更します。

/**
 * Where to redirect users after registration.
 *
 * @var string
 */
protected $redirectTo = RouteServiceProvider::HOME;

/**
 * Create a new controller instance.
 *
 * @return void
 */
public function __construct()
{
    $this->middleware('guest');

    // プロパティの値を書き換えて、ユーザー登録後のリダイレクト先を変更しています。
    $this->redirectTo = route('user.index');
}

コンストラクタでプロパティの値を変更せずに

protected $redirectTo = route('user.index');

上記のように、直接変更してもOKです。

validator()メソッドは、下記のようにUserモデルに移動したバリデーションルールとエラーメッセージを使うように修正しました。

use App\User;    // 追記

/**
 * Get a validator for an incoming registration request.
 *
 * @param  array  $data
 * @return \Illuminate\Contracts\Validation\Validator
 */
protected function validator(array $data)
{
    // バリデーションルールとエラーメッセージは、
    // UserControllerと共用したいので、Userモデルに移動しています。
    return Validator::make($data, User::$rules, User::$messages);
}

create()アクションメソッドは、fill()を使って登録できるようにしました。

/**
 * Create a new user instance after a valid registration.
 *
 * @param  array  $data
 * @return \App\User
 */
protected function create(array $data)
{
    // 元はUser::create()メソッドを使って登録されていたのを、
    // fill()メソッドとsave()メソッドを使って登録しています。
    $user = new User();
    $user->fill($data);
    // パスワードはハッシュ化しないといけないので、値を上書きしています。
    $user->password = Hash::make($data['password']);
    $user->save();
    return $user;
}

UserController

ユーザー情報を修正するためのUserControllerを作成します。

php artisan make:controller UserController

作成したUserControllerを修正します。

ユーザー情報を表示するためのindex()アクションメソッド。

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

ユーザー情報を編集するためのedit()アクションメソッド。

/**
 * Show the form for editing the specified resource.
 *
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function edit($id)
{
    return view('user.edit');
}

レコードをアップデートするupdate()アクションメソッド。

/**
 * Update the specified resource in storage.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \App\User $user
 * @return \Illuminate\Http\Response
 */
public function update(UserRequest $request, User $user)
{
    $user->fill($request->all());

    // パスワードの項目があるとき(つまり、パスワードを変更するとき)
    if (!is_null($request->password)) {
        // パスワードの値をハッシュ化して上書きする。
        $user->password = Hash::make($request->password);
    } else {
        // パスワードの項目に値がないときは、アップデートの対象にしない。
        unset($user->password);
    }
    $user->save();
    return redirect(route('user.index'));
}

パスワードの項目が入力されているときは、値をハッシュ化してRequestオブジェクトのpasswordプロパティを上書きします。パスワードの項目が入力されていないとき(=nullのとき)はパスワードを変更しないものとして、passwordプロパティを削除し、アップデートの対象から外します。

また、システム全体で「バリデーションはFormRequestを使用する」という前提のもとで、統一感を出すために、UserRequestクラスを作成してバリデーションを行うようにしています。

UserRequest

UserRequestを作成します。

php artisan make:request UserRequest

作成したUserRequestを編集します。

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Validation\Rule;

use App\User;

/**
 * UserRequest ユーザー更新用FormRequestクラス
 * バリデーションルールとエラーメッセージは、
 * Auth\RegisterControllerクラスと共用したいので、
 * Userモデルに記載しています。
 */
class UserRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        // UserRequestを使えるようにtrueを返します。
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules(Request $request)
    {
        // バリデーションルールはUserモデルに記載しています。
        $rules = User::$rules;

        // メソッドがPATCHのとき(つまりupdate()アクションが呼ばれるとき)
        if ($request->method() == 'PATCH') {
            // passwordのrequiredの条件を外し、nullableにします。
            $key = array_search('required', $rules['password']);
            unset($rules['password'][$key]);
            array_push($rules['password'], 'nullable');

            // updateのときに、元のemailと同じ値であってもバリデーションエラーにならないようにします。
            // https://readouble.com/laravel/6.x/ja/validation.html#rule-unique
            $key = array_search('unique:users', $rules['email']);
            unset($rules['email'][$key]);
            array_push($rules['email'], Rule::unique('users')->ignore(Auth::user()));
        }
        return $rules;
    }

    /**
     * バリデーションエラーメッセージ
     *
     * @return array
     */
    public function messages()
    {
        // Userモデルに記述しているエラーメッセージを返します。
        return User::$messages;
    }
}

バリデーションルール、エラーメッセージともに、Userモデルに記述した内容を利用しています。

UserController@updateが呼ばれるときは、メソッドが”PATCH”なので、そのときだけバリデーションルールを変更するようにしています。

  • passwordの値がnullのときは、”required”のルールを外す。
  • emailの値を変更しなかったときは、”unique”バリデーションエラーを避けるようにする。

“unique”バリデーションエラーの件は、ドキュメントのこちらに記述があります。

uniqueチェックで指定したIDを除外したい場合があります。たとえばユーザー名、メールアドレス、それと住所の「プロフィール更新」の状況を考えてください。メールアドレスは一意であることを確認したいと思います。しかし、もしユーザーが名前フィールドだけ変更し、メールフィールドを変更しなければ、そのユーザーがすでにそのメールアドレスの所有者として登録されているために起きるバリデーションエラーを避けたいと思うでしょう。

https://readouble.com/laravel/6.x/ja/validation.html#rule-unique
6.x バリデーション Laravel

ビューとビューの日本語化

ビューのレイアウトは”resources/views/layouts/app.blade.php”を利用します。ユーザー情報修正画面へのリンクを追加します。

<!doctype html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- CSRF Token -->
    <meta name="csrf-token" content="{{ csrf_token() }}">

    <title>{{ config('app.name', 'Laravel') }}</title>

    <!-- Scripts -->
    <script src="{{ asset('js/app.js') }}" defer></script>

    <!-- Fonts -->
    <link rel="dns-prefetch" href="//fonts.gstatic.com">
    <link href="https://fonts.googleapis.com/css?family=Nunito" rel="stylesheet">

    <!-- Styles -->
    <link href="{{ asset('css/app.css') }}" rel="stylesheet">
</head>

<body>
    <div id="app">
        <nav class="navbar navbar-expand-md navbar-light bg-white shadow-sm">
            <div class="container">
                <a class="navbar-brand" href="{{ url('/') }}">
                    {{ config('app.name', 'Laravel') }}
                </a>
                <button class="navbar-toggler" type="button" data-toggle="collapse"
                    data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false"
                    aria-label="{{ __('Toggle navigation') }}">
                    <span class="navbar-toggler-icon"></span>
                </button>

                <div class="collapse navbar-collapse" id="navbarSupportedContent">
                    <!-- Left Side Of Navbar -->
                    <ul class="navbar-nav mr-auto">

                    </ul>

                    <!-- Right Side Of Navbar -->
                    <ul class="navbar-nav ml-auto">
                        <!-- Authentication Links -->
                        @guest
                        <li class="nav-item">
                            <a class="nav-link" href="{{ route('login') }}">{{ __('Login') }}</a>
                        </li>
                        @if (Route::has('register'))
                        <li class="nav-item">
                            <a class="nav-link" href="{{ route('register') }}">{{ __('Register') }}</a>
                        </li>
                        @endif
                        @else
                        <li class="nav-item dropdown">
                            <a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button"
                                data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>
                                {{ Auth::user()->name }} <span class="caret"></span>
                            </a>

                            <div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdown">
                                <a href="{{ route('user.edit', Auth::user()) }}" class="dropdown-item">{{ __('Modify') }}</a>
                                <a class="dropdown-item" href="{{ route('logout') }}" onclick="event.preventDefault();
                                                     document.getElementById('logout-form').submit();">
                                    {{ __('Logout') }}
                                </a>

                                <form id="logout-form" action="{{ route('logout') }}" method="POST"
                                    style="display: none;">
                                    @csrf
                                </form>
                            </div>
                        </li>
                        @endguest
                    </ul>
                </div>
            </div>
        </nav>

        <main class="py-4">
            @yield('content')
        </main>
    </div>
</body>

</html>

63行目にリンクを追加しています。

ユーザー登録画面用の”resources/views/auth/register.blade.php”を修正します。登録項目を追加しています。

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md">
            <div class="card">
                <div class="card-header">{{ __('Register') }}</div>

                <div class="card-body">
                    <form method="POST" action="{{ route('register') }}">
                        @csrf

                        <div class="form-group row">
                            <label for="name" class="col-md-4 col-form-label text-md-right">{{ __('Name') }}</label>

                            <div class="col-md-6">
                                <input id="name" type="text" class="form-control @error('name') is-invalid @enderror" name="name" value="{{ old('name') }}" autocomplete="name" autofocus>

                                @error('name')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>

                            <div class="col-md-6">
                                <input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" autocomplete="email">

                                @error('email')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label>

                            <div class="col-md-6">
                                <input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" autocomplete="new-password">

                                @error('password')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="password-confirm" class="col-md-4 col-form-label text-md-right">{{ __('Confirm Password') }}</label>

                            <div class="col-md-6">
                                <input id="password-confirm" type="password" class="form-control" name="password_confirmation" autocomplete="new-password">
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="postal_code" class="col-md-4 col-form-label text-md-right">{{ __('Postal Code') }}</label>

                            <div class="col-md-6">
                                <input id="postal_code" type="text" class="form-control @error('postal_code') is-invalid @enderror" name="postal_code" value="{{ old('postal_code') }}" autocomplete="postal_code" placeholder="000-0000">

                                @error('postal_code')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="pref" class="col-md-4 col-form-label text-md-right">{{ __('Prefectures') }}</label>

                            <div class="col-md-6">
                                <select name="pref_id" id="pref_id" class="form-control @error('pref_id') is-invalid @enderror">
                                    <option value="">-- 選択してください --</option>
                                    @foreach (App\User::$prefs as $key => $pref)
                                    <option value="{{ $key }}" @if (old('pref_id') == $key) selected @endif>{{ $pref }}</option>
                                    @endforeach
                                </select>

                                @error('pref_id')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="city" class="col-md-4 col-form-label text-md-right">{{ __('City') }}</label>

                            <div class="col-md-6">
                                <input id="city" type="text" class="form-control @error('city') is-invalid @enderror" name="city" value="{{ old('city') }}" autocomplete="city" placeholder="大阪市北区">

                                @error('city')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="town" class="col-md-4 col-form-label text-md-right">{{ __('Town') }}</label>

                            <div class="col-md-6">
                                <input id="town" type="text" class="form-control @error('town') is-invalid @enderror" name="town" value="{{ old('town') }}" autocomplete="town" placeholder="中之島1丁目1-1">

                                @error('town')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="building" class="col-md-4 col-form-label text-md-right">{{ __('Building') }}</label>

                            <div class="col-md-6">
                                <input id="building" type="text" class="form-control @error('bilding') is-invalid @enderror" name="building" value="{{ old('building') }}" autocomplete="building" placeholder="中之島○○ビル101号室">

                                @error('building')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="phone_number" class="col-md-4 col-form-label text-md-right">{{ __('Phone Number') }}</label>

                            <div class="col-md-6">
                                <input id="phone number" type="tel" class="form-control @error('phone_number') is-invalid @enderror" name="phone_number" value="{{ old('phone_number') }}" autocomplete="phone_number" placeholder="06-0000-0000">

                                @error('phone_number')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row mb-0">
                            <div class="col-md-6 offset-md-4">
                                <button type="submit" class="btn btn-primary">
                                    {{ __('Register') }}
                                </button>
                            </div>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

修正画面用の”resources/views/user/edit.blade.php”を作成します。”resources/views/auth/register.blade.php”をコピーして編集しました。

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md">
            <div class="card">
                <div class="card-header">{{ __('Modify') }}</div>

                <div class="card-body">
                    <form method="POST" action="{{ route('user.update', Auth::user()) }}">
                        @method('PATCH')
                        @csrf

                        <div class="form-group row">
                            <label for="name" class="col-md-4 col-form-label text-md-right">{{ __('Name') }}</label>

                            <div class="col-md-6">
                                <input id="name" type="text" class="form-control @error('name') is-invalid @enderror" name="name" value="{{ old('name', Auth::user()->name) }}" autocomplete="name" autofocus>

                                @error('name')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>

                            <div class="col-md-6">
                                <input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email', Auth::user()->email) }}" autocomplete="email">

                                @error('email')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label>

                            <div class="col-md-6">
                                <input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" autocomplete="new-password">

                                @error('password')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="password-confirm" class="col-md-4 col-form-label text-md-right">{{ __('Confirm Password') }}</label>

                            <div class="col-md-6">
                                <input id="password-confirm" type="password" class="form-control" name="password_confirmation" autocomplete="new-password">
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="postal_code" class="col-md-4 col-form-label text-md-right">{{ __('Postal Code') }}</label>

                            <div class="col-md-6">
                                <input id="postal_code" type="text" class="form-control @error('postal_code') is-invalid @enderror" name="postal_code" value="{{ old('postal_code', Auth::user()->postal_code) }}" autocomplete="postal_code" placeholder="000-0000">

                                @error('postal_code')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="pref" class="col-md-4 col-form-label text-md-right">{{ __('Prefectures') }}</label>

                            <div class="col-md-6">
                                <select name="pref_id" id="pref_id" class="form-control @error('pref_id') is-invalid @enderror">
                                    <option value="">-- 選択してください --</option>
                                    @foreach (App\User::$prefs as $key => $pref)
                                    <option value="{{ $key }}" @if (old('pref_id', Auth::user()->pref_id) == $key) selected @endif>{{ $pref }}</option>
                                    @endforeach
                                </select>

                                @error('pref_id')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="city" class="col-md-4 col-form-label text-md-right">{{ __('City') }}</label>

                            <div class="col-md-6">
                                <input id="city" type="text" class="form-control @error('city') is-invalid @enderror" name="city" value="{{ old('city', Auth::user()->city) }}" autocomplete="city" placeholder="大阪市北区">

                                @error('city')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="town" class="col-md-4 col-form-label text-md-right">{{ __('Town') }}</label>

                            <div class="col-md-6">
                                <input id="town" type="text" class="form-control @error('town') is-invalid @enderror" name="town" value="{{ old('town', Auth::user()->town) }}" autocomplete="town" placeholder="中之島1丁目1-1">

                                @error('town')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="building" class="col-md-4 col-form-label text-md-right">{{ __('Building') }}</label>

                            <div class="col-md-6">
                                <input id="building" type="text" class="form-control @error('building') is-invalid @enderror" name="building" value="{{ old('building', Auth::user()->building) }}" autocomplete="building" placeholder="中之島○○ビル101号室">

                                @error('building')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="phone_number" class="col-md-4 col-form-label text-md-right">{{ __('Phone Number') }}</label>

                            <div class="col-md-6">
                                <input id="phone number" type="tel" class="form-control @error('phone_number') is-invalid @enderror" name="phone_number" value="{{ old('phone_number', Auth::user()->phone_number) }}" autocomplete="phone_number" placeholder="06-0000-0000">

                                @error('phone_number')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row mb-0">
                            <div class="col-md-6 offset-md-4">
                                <button type="submit" class="btn btn-primary">
                                    {{ __('Modify') }}
                                </button>
                            </div>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

ビューを日本語化するための”resources/lang/ja.json”を作成します。

{
    "Login": "ログイン",
    "Logout": "ログアウト",
    "Register": "会員登録",
    "Modify": "会員情報修正",
    "Name": "お名前",
    "E-Mail Address": "E-mailアドレス",
    "Password": "パスワード",
    "Confirm Password": "パスワード再入力",
    "Remember Me": "ログイン情報を記憶しておく",
    "Forgot Your Password?": "パスワードを忘れた方はこちら",
    "Postal Code": "郵便番号",
    "Prefectures": "都道府県",
    "City": "市区町村",
    "Town": "町名番地等",
    "Building": "建物等",
    "Phone Number": "電話番号"
}

日本語化については、こちらにも書きました。

ルーティング

ユーザー修正のためのルーティングを設定します。

<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
    return view('welcome');
});

Auth::routes();

Route::get('/home', 'HomeController@index')->name('home');

// 必要なルーティングのみに限定する
Route::resource('user', 'UserController')->only(['index', 'edit', 'update'])->middleware('auth');

“user”へのルーティングは、index()、edit()、update()以外必要ないので、他のアクションメソッドへのアクセスは制限しています。

6.x コントローラ Laravel

完成

ユーザー登録

ユーザー情報表示

ユーザー情報修正

この記事を書いた人

余分なこだわりは捨てる。それがぼくのスタイル。

PHPでWebアプリを作り、小さな花の写真を撮ってよろこんでいる人。元Webエンジニア。プログラミング講師。余分なこだわりを捨てて生きやすくなりたいと思いつつも、なかなかこだわりを捨てきれない頑固者。まろと呼んでください。

さかのうえの まろをフォローする
Laravel
シェアする