Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Laravel11へアップグレード 15分で終わるのか!? / laravel 11 ...
Search
Takuya Katsusa
December 21, 2024
3.5k
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.2k
スプリントの新常識 〜1週間未満のアジャイル開発 で成果を最大化する方法〜 / new norm for sprints
takuyakatsusa
2
1.3k
まっちすいっち戦争 / match vs switch
takuyakatsusa
2
1.4k
LaravelにReactを部分導入して感じたこと
takuyakatsusa
5
1.7k
Featured
See All Featured
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
410
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
エンジニアに許された特別な時間の終わり
watany
108
250k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
240
Code Reviewing Like a Champion
maltzj
528
40k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
240
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
670
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.4k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
380
My Coaching Mixtape
mlcsv
0
310
The Cost Of JavaScript in 2023
addyosmani
55
10k
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! 弊社はアドベントカレンダー実施中です