Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Laravel11へアップグレード 15分で終わるのか!? / laravel 11 ...
Search
Takuya Katsusa
December 21, 2024
3.3k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Laravel11へアップグレード 15分で終わるのか!? / laravel 11 Upgrade
Takuya Katsusa
December 21, 2024
More Decks by Takuya Katsusa
See All by Takuya Katsusa
Webの外へ飛び出せ NativePHPが切り拓くPHPの未来
takuyakatsusa
2
1.1k
スプリントの新常識 〜1週間未満のアジャイル開発 で成果を最大化する方法〜 / new norm for sprints
takuyakatsusa
2
1.2k
まっちすいっち戦争 / match vs switch
takuyakatsusa
2
1.4k
LaravelにReactを部分導入して感じたこと
takuyakatsusa
5
1.7k
Featured
See All Featured
Leo the Paperboy
mayatellez
7
1.8k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
270
Everyday Curiosity
cassininazir
0
230
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
230
Automating Front-end Workflow
addyosmani
1370
210k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.6k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
430
[SF Ruby Conf 2025] Rails X
palkan
2
1.1k
The Invisible Side of Design
smashingmag
302
52k
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.3k
Building Flexible Design Systems
yeseniaperezcruz
330
40k
Transcript
Laravel 11 へアップグレード 15分 で終わるのか!? BABY JOB Takuya Katsusa PHP
Conference Japan 2024
My Profile 勝佐 拓也 - かつさたくや @kitkattsun0531 BABY JOB 株式会社(Bronzeスポンサー)
保活サイト「えんさがそっ♪」の開発保守 二児の父(9 ~ 11月に育休取得) 子ども大好きおじさん Laravelって なーに? ふ、、ふにゃ (知らんぞ)
施設を 探す 見学の 申込 園の魅力 を発信 見学の 受付 サービス紹介 (えんさがそっ
♪)
Laravel 11 待望のリリース!! 我々のチーム内は歓喜に包まれた
アップグレードガイドという神アイテムを 手にした一同 アップグレードに心を踊らせていた! さあ、アップグレードしてみよう!
Laravel 10 っ♪ は すでに アップグレードの 目安 15分!! Laravel Shift
を見送った理由 • 過去のアップグレードが比較的簡単だったこと • 有料であること 引用:Laravel 11.x アップグレードガイド
PHP 8.3 っ♪ は すでに curl も問題なし! 引用:Laravel 11.x アップグレードガイド
ライブラリのアップグレード composer.json を 書き換えます
ローカルのアプリケーションを起動! Running migrations… 2024_12_22_142500_modify_hoikuens ...................... 647.05ms FAIL
ローカルのアプリケーションを起動! Running migrations… 2024_12_22_142500_modify_hoikuens ...................... 647.05ms FAIL local.ERROR: SQLSTATE[23502]: Not
null violation: 7 ERROR: column "hoikuen_id" of relation "hoikuens" contains null values
ローカルのアプリケーションを起動! Running migrations… 2024_12_22_142500_modify_hoikuens ...................... 647.05ms FAIL local.ERROR: SQLSTATE[23502]: Not
null violation: 7 ERROR: column "hoikuen_id" of relation "hoikuens" contains null values なん...だと...!? Why?
関連のテーブルを調査開始...30分経過 hoikuen_id カラムを VARCHAR に変えただけよ? Schema::table('hoikuens', function (Blueprint $table) {
$table->string('hoikuen_id')->change(); ← }); お気づきだろうか... この時点で トークタイトルの 目安15分に 間に合ってない!
なるほど! つまり、変更分以外も認知して設定しなければならない 引用:Laravel 11.x アップグレードガイド Why?
Why Taylor Otwell
過去のマイグレーションファイルを 改変しなきゃいけないでしょう! それは御法度だろう!!
1回目のマイグレーション(テーブル作成) // 1回目 Schema::create('hoikuens', function (Blueprint $table) { $table->integer('hoikuen_id') ->nullable()
->default(0) ->comment('保育園ID'); (...以下省略) });
// 2回目 Schema::table('hoikuens', function (Blueprint $table) { $table->string('hoikuen_id') ->change(); });
2回目のマイグレーション(型変更)
nullable()、default(0)、comment(’保育園ID’) が未設定になってる... 2回目のカラム変更による比較
// 1回目 Schema::create('hoikuens', function (Blueprint $table) { $table->integer('hoikuen_id')->nullable()->default(0)->comment('保育園ID'); }); //
2回目(型変更) Schema::table('hoikuens', function (Blueprint $table) { $table->string('hoikuen_id')->nullable()->default(0)->comment('保育園 ID')->change(); }); // 3回目(コメント変更) Schema::table('hoikuens', function (Blueprint $table) { $table->string('hoikuen_id')->nullable()->default(0)->comment('保育園の識別 ID')->change(); }); 当時のテーブル構成を再現しないのしんどい💦 なんだっけ? なんだっけ?
えんさがそチームは技術負債が見つかれば、 リファクタリングを積極的にやってくれる!! だからこそ テーブルのカラム名変更はいっぱいありました。 作業時間. . . . . .
なんと 2時間!!
どこでテーブルの差分を確認した? えんさがそっ♪では データベースの定義書を自動生成しています! このおかげで差分がないか 簡単に確認することが できました! tbls はGo製の CLIツール
これで終わりだと 思った? ま゛だ ま゛だ あ゛る゛よ゛!!
config の 仕様が変わっていた! アップグレードガイドにも特に書いてなさそう たまたま、アップグレードに取り掛かる前に 奇跡的にこの記事に出会えました ❤ なおさんありがとうございます!とても参考になりました!
config ディレクトリが laravel(プロジェクト直下)にあるのは ご存知だと思います / └─ config └─ app.php ├─
auth.php ├─ cache.php └─ ...
Laravel 11 になると、 config が Laravel / framework にも作成されます v10.48.4
v11.7.0
ややこしいのが、 config が未設定だと laravel/framework の config で マージ されてしまうこと どういうことか?
Why?
config('database.connections.sqlite'); = [ "driver" => "sqlite", "url" => null, "database"
=> "/laravel/database/database.sqlite", "prefix" => "", "foreign_key_constraints" => true, ] 例えば、config / database.php の sqlite を空白にします なんとconfigで参照すると、値が復活してます! つまり、未設定だとデフォルトの値で復活するということ! Why?
たまたま気づいたからいいけど... アップグレードガイドに書いてなかったような...
Why Taylor Otwell
Config の設定値をデフォルト値で マージするんじゃないよ!
設定ファイルなので慎重に調査を進めました💦 1. config の差分確認 2. php artisan tinker で config
の値をチェック 3. Webアプリの動作確認 作業時間......なんと 4時間!!
一応、v11.11.0 で変更が入ったようです dontMergeFrameworkConfiguration メソッドを呼び出せば、 laravel/framework 側の config を参照しなくなるようです return Application::configure(basePath:
dirname(__DIR__)) ->withRouting( web: __DIR__.'/../routes/web.php', commands: __DIR__.'/../routes/console.php', health: '/up', ) ->withMiddleware(function (Middleware $middleware) { // }) ->withExceptions(function (Exceptions $exceptions) { // }) ->create() ->dontMergeFrameworkConfiguration(); bootstrap/app.php
さあ 次はなんだ? (開き直り)
引用:Laravel 11.x アップグレードガイド
つまりログイン認証が通って必要であれば 再ハッシュして保存するということ ※再ハッシュといっても、 ハッシュ済みを再ハッシュ化するのではなく、 平文パスワードを新しい設定で ハッシュ化するということ Why?
なかなか強引な仕組み💦 実は理由があったようで... 引用:Laravel の PR
Laravel10 で bcrypt ラウンド数(パスワードハッシュ の計算強度)を 10 から 12 に増加する変更が行われた しかし、現在の
Laravel の認証システムでは、ユーザー がログインする際に、ハッシュ設定が変更されても既存 のパスワードが再ハッシュされない これにより、セキュリティ上のリスクが生じる可能性が ある。たとえば、計算強度を増加させても、それが既存 のハッシュに適用されない場合、システム全体のセキュ リティの一貫性がなくなる (ビー・クリプト) パスワードの再ハッシュの実装経緯
どう考えてもトラブルになりそうなので で無効化することにしました 'rehash_on_login' => false,
理由は簡単で 実装者が意図せずに フレームワーク内でデータを 更新されるのが嫌だから
1. パスワードハッシュの計算強度の変更前である Laravel10 でユーザーを作成 2. 作成したユーザーでログインしてハッシュ値に変更 がないことを確認 作業時間......なんと 3時間!! 再ハッシュされないか確認
Why Taylor Otwell
そんな危ない設定を ログイン時に仕込むなよ!
もし再ハッシュが 有効になったら気になること
// ハッシュ済みか判定をせずに無条件でハッシュ化してしまうケース public function setPasswordAttribute($value) { $this->attributes['password'] = Hash::make($value); }
ハッシュ済みの値を再ハッシュすることはない?
ハッシュ済みの値を再ハッシュすることはない? 対策 1:ハッシュ済みか判定処理を入れる 1 if ($this->hasher->needsRehash($hash)) { $this->attributes['password'] = Hash::make($value);
}
ハッシュ済みの値を再ハッシュすることはない? 対策 2:キャストを利用してハッシュ化する protected $casts = [ 'password' => 'hashed',
];
サーバーリソースの消費が一時的に増加しない? 再ハッシュが必要であれば実行されるものではあるけど、 利用者数が多いWebアプリは影響受けそう
それでは皆さんお待ちかね アップグレードに かかった時間を発表します!
アップグレードにかかった時間 パスワードの再ハッシュ Config のマージ カラムの変更 26% 42% 32% 約 10
時間
1 5 分とは...
それでもやっぱり Laravel が大好き!!
だって laravelとMarvel 似てるんだもん だからアメコミ感を出してみた!
(ネタは置いといて...)
環境構築が簡 単
Web アプリケーション として扱える幅が大きい 認証・認可、メール・通知機能、 APIサポート、スケジューリング...etc
10時間で アップグレード できちゃう (ただしプロダクトによる)
強く当たっちゃったけど 私たちが仕事できているのは 皆様のおかげです
CREDITS: This presentation template was created by Slidesgo, including icons
by Flaticon, infographics & images by Freepik thanks! 渾身の育休 note を執筆しました!
番外編! 引用:Laravel 11.x アップグレードガイド
diffIn 系メソッドは、float 型を返す! $startDate = new Carbon('2024-12-01'); $endDate = new
Carbon('2024-12-03'); $startDate->diffInDays($endDate)); Carbon 2 の場合は、差が 2 Carbon 3 の場合は、差が 2.0 Why?
diffIn 系メソッドは、相対差分を返す! $startDate = new Carbon('2024-12-01'); $endDate = new Carbon('2024-12-03');
$endDate->diffInDays($startDate)); Carbon 2 の場合は、差が 2 Carbon 3 の場合は、差が - 2.0 Why? マイナス!?
Why Carbon Library
既存メソッドの仕様を 変えるんじゃないよ!
CREDITS: This presentation template was created by Slidesgo, including icons
by Flaticon, infographics & images by Freepik thanks! 弊社はアドベントカレンダー実施中です