プロジェクト名は example-app
Windows11 WSL2 Ubuntu22.04環境で実施
管理者登録機能は無し(tinkerで直接DBに投入)
プロジェクト作成
curl -s https://laravel.build/example-app | bash
プロジェクトディレクトリに移動して開発環境起動してsanctumを使えるようにする
cd example-app
./vendor/bin/sail up
composer require laravel/sanctum
マイグレーションを実行
もし、DB接続エラーみたいなの出たら.env
のDB_HOST
をmysql
か127.0.0.1
に変えたら動いた気がする
php artisan migrate
config/auth.phpファイルでguardsのapiのdriverをsanctumに変更
'guards' => [
// ...
'api' => [
'driver' => 'sanctum',
'provider' => 'users',
'hash' => false,
],
],
app/Http/Kernel.phpファイルでapiミドルウェアを追加(コメントアウトを外す)
protected $middlewareGroups = [
'web' => [
// ...
],
'api' => [
\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
\Illuminate\Routing\Middleware\ThrottleRequests::class.':api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];
tinkerで管理者を追加
php artisan tinker
>>> $user = new App\Models\User
>>> $user->name = 'admin'
>>> $user->email = 'admin@example.com'
>>> $user->password = bcrypt('password')
>>> $user->save()
ログイン画面(resources/views/auth/login.blade.php)ファイルを作成
<form method="POST" action="{{ route('login') }}">
@csrf
<div>
<label for="email">メールアドレス</label>
<div>
<input id="email" type="email" name="email" value="{{ old('email') }}" required autofocus>
</div>
</div>
<div>
<label for="password">パスワード</label>
<div>
<input id="password" type="password" name="password" required>
</div>
</div>
<div>
<div>
<button type="submit">ログイン</button>
</div>
</div>
</form>
ルーティングをroutes/web.phpに定義
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Auth;
// ログイン画面を表示する
Route::get('/login', function () {
return view('auth.login');
})->name('login');
// ログイン処理を実行する
Route::post('/login', function () {
$credentials = request()->only('email', 'password');
if (Auth::attempt($credentials)) {
request()->session()->regenerate();
return redirect()->intended('/dashboard');
}
return back()->withErrors([
'message' => '認証失敗',
]);
})->name('login');
// ログアウト処理を実行する
Route::post('/logout', function () {
Auth::logout();
request()->session()->invalidate();
request()->session()->regenerateToken();
return redirect('/');
})->name('logout');
// 認証が必要なページ
Route::middleware('auth')->group(function () {
// ダッシュボード画面とか
Route::get('/dashboard', function () {
return view('dashboard');
})->name('dashboard');
});
ログアウトボタン
<form method="POST" action="{{ route('logout') }}">
@csrf
<button type="submit">ログアウト</button>
</form>
ログイン判定してコンテンツを出し分けたいとき
@if (Auth::check())
<!-- ログイン済みの場合に表示するコンテンツ -->
@else
<!-- ログインしていない場合に表示するコンテンツ -->
@endif