標準のユーザー認証機能の利用 Jetstreamの利用 #Laravel頻出パターン #Laravelの教科書
Laravel8が2020年9月8日に公開されました。
新規にcomposer create-projectを作成するとLaravel8でプロジェクトが作成されます。大きな変更点はいくつかありますが、ログイン周りがいくつかリニューアルが発生したため、Laravel8での認証方法について説明を行います。
Laravel7でプロジェクトを作った場合はこちらを参考にしてください。
# はじめに
Laravel8での認証はLaravel-uiから「Laravel Jetstream」と呼ばれるものにかわりました。
公式のドキュメントはこちらです。(2020年9月9日段階ではGitHubが公式のようです)
Laravel-uiと比較すると、APIでの認証機能やチーム管理機能が追加されているようです。
# 課題
・Laravel Jetstreamをインストールする
・認証機能を組み込んで会員登録・ログインを試す
・作成されたコードを確認する
・ログイン状態に応じた書き方を学ぶ
自動で高機能なログイン処理が作成されるため、自分で作ることはほとんどありません。
# プロジェクトの準備
まずはプロジェクトの準備を行います。create-projectを使ってプロジェクトを作成します。既存のプロジェクトに導入することも可能です。
今回は「auth_sample8」というプロジェクトにしました。
composer create-project --prefer-dist laravel/laravel auth_sample8
cd auth_sample8
次にDBの設定と作成を行います。こちらについては記述を省略しますが、.envに正しく接続情報を記述してください。
.envの設定例(MAMPの場合)
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=8889
DB_DATABASE=laravel_sample
DB_USERNAME=root
DB_PASSWORD=root
DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock
マイグレーションの実行は後で行うため今は不要です。
# Laravel Jetsreamのインストール
認証機能を利用するためにLaravel Jetstreamをインストールします。インストールはcomposerを利用して下記コマンドを実行します。
composer require laravel/jetstream
少し時間がかかったのち、インストールが完了します。
インストール後、artisanコマンドに「jetstream:install」が追加されます。
Laravel Jetstreamを利用する時に「livewire」と「inertia」のどちらかを選ぶことができます。inertiaはフロント側をVueやReactで作る場合に用いられるものなので、ここでは「livewire」を選択します。
jetstream:installコマンドを使ってlivewireをインストールします。
php artisan jetstream:install livewire
実行後、「CreateSessionsTable」「AddTwoFactorColumnsToUsersTable」「CreatePersonalAccessTokensTable」という3つのマイグレーションが作成されます。
usersテーブルを作成する必要もあるため、ここでマイグレーションを実行します。
php artisan migrate
マイグレーションの実行で下記6個のテーブルが作成されます。(New!)と書いているのがLaravel Jetstreamで追加されたテーブルです。
failed_jobs
migrations
password_resets
personal_access_tokens (New!)
sessions(New!)
users
JSとCSSをビルドするために下記コマンドを入力します。
npm install && npm run dev
npmコマンドが無いというエラーが出る場合はNodeのインストールを行う必要があります。
上記コマンドを実行すると下記の2ファイルが作成されます。
public/css/app.css
public/js/app.js
# 動作確認
サーバーを動かして動作確認をしましょう。
php artisan serve
Laravel Jetstreamのインストールとセットアップが完了すると、Welcomeの画面の右上にRegisterとLoginのメニューが表示されます。
こちらか新規会員登録、ログインを試すことができます。
# ログイン後の画面
Jetstreamでのログイン画面はこのようになっています。
標準機能でプロフィールの編集やAPIのトークンの管理、2段階認証などができるようになっています。
他にもログインしている端末の数までわかるようになっています。セキュリティのことを考えた非常に高機能な作りです。
# ログイン状態でのテンプレートの出し分け
ログインしているかどうか、テンプレートにはどのように書くかはwelcome.blade.phpにかかれています。
resources/views/welcome.blade.php
@auth
<a href="{{ url('/dashboard') }}" class="text-sm text-gray-700 underline">Dashboard</a>
@else
<a href="{{ route('login') }}" class="text-sm text-gray-700 underline">Login</a>
@if (Route::has('register'))
<a href="{{ route('register') }}" class="ml-4 text-sm text-gray-700 underline">Register</a>
@endif
@endif
@auth構文はLaravel7までは@auth〜@endauthでしたが、@auth〜@endifでも良くなったようです。
上記の例では@auth〜@elseの間がログイン中に表示、@else〜@endifの間がログイン前に表示されます。
# Dashboardの作り方
ログイン後に表示される「dashboard.blade.php」ですが、次のようなコードになっています。
resources/views/dashboard.blade.php
<x-app-layout>
<x-slot name="header">
<h2 class="font-semibold text-xl text-gray-800 leading-tight">
Dashboard
</h2>
</x-slot>
<div class="py-12">
<div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
<div class="bg-white overflow-hidden shadow-xl sm:rounded-lg">
<x-jet-welcome />
</div>
</div>
</div>
</x-app-layout>
<x-jet-welcome />
と書かれている部分はLaravel7までは存在していなかった箇所です。
これはLaravel8で追加されたDynamic Blade Componentsと呼ばれるものでその名の通り動的にコンテンツが差し替わる部分です。
この本体はJetstreamのコードの中の「vendor/laravel/jetstream/resources/views/components/welcome.blade.php」にかかれています。
これは@componentで呼び出していたコンポーネントを<x-xxxx />の形式で呼び出されるようになった仕組みです。
Blade::component("クラス名", "タグ名");
コンポーネントをBlade::compoent()関数で登録することが出来ます。Jetstreamは内部で「jet-」から始まるコンポーネントを登録しているため、このように呼び出すことが出来ます。
## 自作のコンポーネントの登録と表示
<x-jet-welcome />ではなく自作のコンポーネント<x-welcome />を作成し、表示してみます。
resources/views/dashboard.blade.php
<div class="py-12">
<div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
<div class="bg-white overflow-hidden shadow-xl sm:rounded-lg">
<x-welcome />
</div>
</div>
</div>
<x-welcome />の形式でコンポーネントを登録するにはresources/viewsの中に「components」というディレクトリを作成し、そこにテンプレートを設置するだけで可能です。
resources/views/components/dashboard.blade.php
<div class="p-6">
<h2>ダッシュボードの表示です</h2>
<p>Laravel8とっても難しいです🥺</p>
</div>
ファイルを作成後、表示を確認してみましょう。
無事書き換えが出来ましたね!
# まとめ
Laravel8での認証機能、Laravel7からも大きく変わっています。
機能としては充実していますが、初心者向きではないような印象です。中心となる機能はいままでの認証機能から大きく変わっていないので、Laravel7で開発をしている方は一度チャレンジしてみて違いに触れてみるのも良いと思います。
今後追加される記事についてはLaravel8で作成していきます。また、既存の記事も徐々にLaravel8に置き換えて行く予定です。
完成まで突っ走る意気込みです。サポートしていただけると非常に嬉しいです。応援よろしくお願いします。