laravel11でプロジェクト作成〜ログイン機能まで


laravel11がリリースされていたので久しぶりにプロジェクト作成するところからやってみる
laravel11のプロジェクトを作成する

composer create-project laravel/laravel sample-laravel

10系がインストールされてね?

cd sample-laravel
php artisan -v
Laravel Framework 10.48.4

うん。10系だね。
あれ?
オーケー
まだ慌てるような時間じゃない
ちゃんと指定してあげよう

composer create-project laravel/laravel sample-laravel --prefer-dist "11.*"

ほう?

PHPのバージョンとな

(あれPHP8.2にしてなかったっけ。。。)

php -v
PHP 8.1.27

うん。ちゃんとバージョンを確認してから作業しましょう。

これ大事。思い込みはだいぶ罠。

laravel11のPHPバージョンは8.2、8.3なので、せっかくだから、PHPも新しいのを使ってやろう

macなのでbrewを利用してインストールする

brew install php

php 8.3.4がインストールされたっぽい

brew link php
 Linking /usr/local/Cellar/php/8.3.4... 24 symlinks created

php -v

PHP 8.1.27

??

brew unlink php@8.1
brew link php
 Linking /usr/local/Cellar/php/8.3.4... 24 symlinks created

php -v

PHP 8.1.27

???

brew list | grep php

あるよね。。。

じゃあ8.2を指定してみる

brew unlink php
brew link --force --overwrite php@8.2
 If you need to have this software first in your PATH instead consider running:
   echo 'export PATH 〜〜
  〜〜〜

パスね

echo 'export PATH="/usr/local/opt/php@8.2/bin:$PATH"' >> /Users/xxx/.bash_profile
echo 'export PATH="/usr/local/opt/php@8.2/sbin:$PATH"' >> /Users/xxx/.bash_profile
source ~/.bash_profile
php -v 
 PHP 8.2.17

ふむふむ

8.2にはできると

brew unlink php@8.2
brew link --force --overwrite php
  Linking /usr/local/Cellar/php/8.3.4... 24 symlinks created
php -v
	PHP 8.2.17

おk

きっとパスね

which php
 /usr/local/opt/php@8.2/bin/php

8.2になっているから

echo 'export PATH="/usr/local/opt/php/bin:$PATH"' >> /Users/xxx/.bash_profile
echo 'export PATH="/usr/local/opt/php/sbin:$PATH"' >> /Users/xxx/.bash_profile
source ~/.bash_profile


php -v 

PHP 8.3.4

ようやく!

brew link phpの時に

If you need to have this software first in your PATH instead consider running:

  echo 'export PATH 〜〜

って出てくれたらよかったのに(なぜ最初にパス確認を思いつかなかった。。。)

これで

composer create-project laravel/laravel sample-laravel

を実行したらlaravel 11で作成されるはず!

よしよし

??

マイグレーション流れた?

??

preparing database??

前からこんなの実行されてたっけ??

composer create-project laravel/laravel sample-laravel10 --prefer-dist "10.*"

うん。実行されてないね。

じゃあ11からなんだ

.env

あるね

じゃあ

sqlite3 database/database.sqlite

で入って

.tables

へー

できてる

.exitで抜けて

php artisan serve

で起動して画面表示

どうせならログイン機能までやってみる

今回はLaravel Breezeを使ってみる

https://readouble.com/laravel/11.x/ja/starter-kits.html

このあたりを参考にインストールする

今回はbladeを選択する

composer require laravel/breeze --dev
php artisan breeze:install

希望するフロントエンドスタックとテストフレームワークの入力を求めらるので、今回はbladeを選択する

Which Breeze stack would you like to install?

 Blade with Alpine

他にも

Would you like dark mode support?

Which testing framework do you prefer?

と聞かれたが好みで!

インストールが終わったら起動した画面を再読み込みしてみる

右上にLoginとRegisterが出てくる

Registerを押すと登録画面が出るので入力して登録する

dashboardが表示されるので、登録されたデータを確認してみる

sqlite3 database/database.slite

select * from users;

ちゃんとデータができている

今度は画面上でログアウトしてログインしてみる

dashboardの右上からログアウトして、Log in を押す

さっき登録したメールアドレスとパスワードを入力してログイン

ログインしてdashboardが表示される

この登録、ログインはどの辺でやっているかというと

routes/auth.phpを見てみる

Route::get('register', [RegisteredUserController::class, 'create'])

               ->name('register');

Route::post('register', [RegisteredUserController::class, 'store']);

Route::get('login', [AuthenticatedSessionController::class, 'create'])

               ->name('login');

Route::post('login', [AuthenticatedSessionController::class, 'store']);

   

とあり、このgetとpostで行われている

ちなみにLaravel Breezeでは、よくある連続してパスワードを間違った時のロック機能はデフォルトで設定されている

デフォルトでは5回間違うと60秒間隔をあけなければいけない

App\Http\Controllers\Auth\AuthenticatedSessionController.php

public function store(LoginRequest $request): RedirectResponse

   {

       $request->authenticate();

       $request->session()->regenerate();

       return redirect()->intended(route('dashboard', absolute: false));

   }

このauthenticate()をみると

App\Http\Requests\Auth\LoginRequest.php

public function authenticate(): void

   {

       $this->ensureIsNotRateLimited();

       if (! Auth::attempt($this->only('email', 'password'), $this->boolean('remember'))) {

           RateLimiter::hit($this->throttleKey());

           throw ValidationException::withMessages([

               'email' => trans('auth.failed'),

           ]);

       }

       RateLimiter::clear($this->throttleKey());

   }

public function ensureIsNotRateLimited(): void

   {

       if (! RateLimiter::tooManyAttempts($this->throttleKey(), 5)) {

           return;

       }

       event(new Lockout($this));

       $seconds = RateLimiter::availableIn($this->throttleKey());

       throw ValidationException::withMessages([

           'email' => trans('auth.throttle', [

               'seconds' => $seconds,

               'minutes' => ceil($seconds / 60),

           ]),

       ]);

   }

この

RateLimiter::tooManyAttempts($this->throttleKey(), 5)

の「5」が試行回数なので「3」に変えれば3回間違ったらロックがかかる

ロック時間は、

App\Http\Requests\Auth\LoginRequest.php

public function authenticate(): void

{

 〜

RateLimiter::hit($this->throttleKey());

の部分で第二引数に秒で指定してあげればよい

例えば

RateLimiter::hit($this->throttleKey(), 300);

とすると、300秒ロックがかかるようになる

私としては、5回もパスワードを間違うんだから、もうパスワードリセットさせればいいと思う

以上!終わり!