Open nakatievent opened 3 years ago
とりあえず新規登録ページは↑のような感じにする。 内容に変更があればその都度追加したり修正したりする。
*横向きにしないとアップロードできなかったので少し見づらい😓
なんと、Laravel8
からはBootstrap
じゃなくてTailwindCSS
とのこと。
と言っても、正直TailwindCSS
とか全然分からない。
しかも、自動でログイン機能を実装したらregister.blade.php
はおそらくTailwindCSS
のやり方でコードが書かれている。
もうこうなったら、無理やりBootstrap
で書くしかない!
下記のコードは自動生成されたコードである。 これを修正して自分で考えた新規登録フォームにしていく。
<x-guest-layout>
<x-auth-card>
<x-slot name="logo">
<a href="/">
<x-application-logo class="w-20 h-20 fill-current text-gray-500" />
</a>
</x-slot>
<!-- Validation Errors -->
<x-auth-validation-errors class="mb-4" :errors="$errors" />
<form method="POST" action="{{ route('register') }}">
@csrf
<!-- Name -->
<div>
<x-label for="name" :value="__('Name')" />
<x-input id="name" class="block mt-1 w-full" type="text" name="name" :value="old('name')" required autofocus />
</div>
<!-- Email Address -->
<div class="mt-4">
<x-label for="email" :value="__('Email')" />
<x-input id="email" class="block mt-1 w-full" type="email" name="email" :value="old('email')" required />
</div>
<!-- Password -->
<div class="mt-4">
<x-label for="password" :value="__('Password')" />
<x-input id="password" class="block mt-1 w-full"
type="password"
name="password"
required autocomplete="new-password" />
</div>
<!-- Confirm Password -->
<div class="mt-4">
<x-label for="password_confirmation" :value="__('Confirm Password')" />
<x-input id="password_confirmation" class="block mt-1 w-full"
type="password"
name="password_confirmation" required />
</div>
<div class="flex items-center justify-end mt-4">
<a class="underline text-sm text-gray-600 hover:text-gray-900" href="{{ route('login') }}">
{{ __('Already registered?') }}
</a>
<x-button class="ml-4">
{{ __('Register') }}
</x-button>
</div>
</form>
</x-auth-card>
</x-guest-layout>
<!doctype html>
<html lang="ja">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
<!-- <link rel="stylesheet" type="text/css" href="login.css"> -->
<title>新規登録ページ</title>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-6 mx-auto border border-dark border-3 p-5 position-absolute top-50 start-50 translate-middle">
<!-- Validation Errors -->
<x-auth-validation-errors class="mb-4" :errors="$errors" />
<div class="fw-bolder text-center">
<h1 class="fw-bolder fs-2"><br>新規登録フォーム</h1>
<p></p>
<p>下記の項目を記入後、「新規登録」ボタンを押して頂くと、ログインが可能です。</p>
</div>
<form class="col-lg-8 mx-auto" method="POST" action="{{ route('register') }}">
@csrf
<!-- 名前 -->
<div class="form-group">
<label for="name" class="form-label">お名前</label>
<input id="name" class="form-control" type="text" name="name" :value="old('name')" required autofocus>
</div>
<br>
<!-- メールアドレス -->
<div class="form-group">
<label for="email" class="form-label">メールアドレス</label>
<input id="email" class="form-control" type="email" name="email" :value="old('email')" required />
</div>
<br>
<!-- パスワード -->
<div class="form-group">
<label for="password" class="form-label">パスワード</label>
<input id="password" class="form-control" type="password" name="password" required autocomplete="new-password">
</div>
<!-- Confirm Password -->
<div class="flex items-center justify-center mt-4">
<label for="password_confirmation" class="form-label">パスワードの認証</label>
<input id="password_confirmation" class="form-control" type="password" name="password_confirmation" required />
</div>
<div class="flex items-center justify-end mt-4">
<a class="underline text-sm text-gray-600 hover:text-gray-900" href="{{ route('login') }}">
{{ __('登録済みですか?') }}
</a>
<button type="submit" class="btn btn-primary">新規登録</button>
</div>
</form>
</div>
</div>
</div>
<!-- Option 1: Bootstrap Bundle with Popper -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.bundle.min.js"
integrity="sha384-ygbV9kiqUc6oa4msXn9868pTtWMgiQaeYH7/t7LECLbyPA2x65Kgf80OJFdroafW"
crossorigin="anonymous"></script>
</body>
</html>
上記のコードを実装し、見た目の部分はできたけど、実際に新規登録できるかを試してみたところ、下記のエラーが出た。
Illuminate\Database\Eloquent\MassAssignmentException
Add [name] to fillable property to allow mass assignment on [App\Models\User].
Argument 1 passed to Illuminate\Auth\SessionGuard::login() must be an instance of Illuminate\Contracts\Auth\Authenticatable, instance of App\Models\User given, called in /work/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php on line 307
Argument 1 passed to Illuminate\Auth\SessionGuard::login() must be an instance of Illuminate\Contracts\Auth\Authenticatable, instance of App\Models\User given, called in /work/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php on line 307
上記のエラーについて、ググっても公式リファレンスを見ても解決しなかったため、Teratail
で質問してみた。あと、Qiita
にも良さげな記事があったのでそれも参考にした。
<?php
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class User extends Authenticatable
{
use HasFactory;
protected $guarded = ['id'];
}
つまり「class クラス名」に続けて「extends クラス名」を記述します。すると、ここで宣言するクラスはextendsの後に記述されたクラスを継承したことになります。「UserクラスはAuthenticatableクラスを継承した」ということになります。
どうやらUser
クラスはAuthenticatable
クラスを継承していて、それについての記載がなかったから(?)エラーが出たと思われるので、上記の記載をしたところエラーは解決した。ログインについてもエラーが出なくなった。
Composer
からLaravel Breeze
を消して、Laravel/ui
にしたことでフロントの実装がBootstrap
になった。
Laravel/ui
にしたことでregister.blade.php
が初期化されたので再度作り直すこととなった。
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-6 mx-auto border border-dark border-3 p-5 position-absolute top-50 start-50 translate-middle">
<div class="fw-bolder text-center">
<h1 class="fw-bolder fs-2">新規登録フォーム</h1>
<p></p>
<p>下記の項目を入力後、「新規登録」ボタンを押すとすぐに始めることができます。</p>
</div>
<form class="col-lg-8 mx-auto" method="POST" action="{{ route('register') }}">
@csrf
<div class="form-group">
<label for="name" class="form-label">{{ __('お名前') }}</label>
<input id="name" type="text" class="form-control @error('name') is-invalid @enderror" name="name" value="{{ old('name') }}" required
autocomplete="name" autofocus>
@error('name')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
<br>
<div class="form-group">
<label for="email" class="form-label">{{ __('メールアドレス') }}</label>
<input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}"
required autocomplete="email">
@error('email')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
<br>
<div class="form-group">
<label for="password" class="form-label">{{ __('パスワード') }}</label>
<input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required
autocomplete="new-password">
@error('password')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
<br>
<div class="form-group">
<label for="password-confirm" class="form-label">{{ __('*パスワードを再度入力して下さい') }}</label>
<input id="password-confirm" type="password" class="form-control" name="password_confirmation" required autocomplete="new-password">
</div>
<br>
<div class="signup-btn">
<button type="submit" class="btn btn-primary">
{{ __('新規登録') }}
</button>
</div>
</form>
</div>
</div>
</div>
@endsection