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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Takuya Katsusa
December 21, 2024
3.4k
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
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Building Applications with DynamoDB
mza
96
7.1k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Docker and Python
trallard
47
3.9k
Unsuck your backbone
ammeep
672
58k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.2k
Agile that works and the tools we love
rasmusluckow
331
22k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.3k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
55k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
170
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.7k
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! 弊社はアドベントカレンダー実施中です