Twinkle
livewire/livewire v4.0.0-beta.3
https://github.com/livewire/livewire/releases/tag/v4.0.0-beta.3
主な変更内容
ドキュメント改善
- タイポ修正と不要なファイルの削除
- サイドバーナビゲーションに
wire:intersectとwire:refのエントリを追加 - CSPをドキュメントナビゲーションに追加
- アップグレードガイドにVoltを追加
機能追加・改善
- 名前空間のサポートを文書化およびテスト
- 環境変数で
DUSK_HEADLESS_DISABLEDのサポートを追加 - SFCとMFCのテストサポートを追加
- スクリプト内で
$jsを利用可能に - makeコマンドでクラス名前空間をサポート
- Flux向けのファイル追加サポートを追加
- lazyバンドルを修飾子に変更
テスト・CI関連
- ブラウザテストの失敗を修正
- テストヘルパーでスナップショット改ざんを有効化してセキュリティテストを修正
- テストから
console.logを削除 Livewire::visit()にコメントを追加- CIアセットビルドを追加
その他
wire-model.jsの更新
Use Environment-Based Configuration Files
One powerful Laravel configuration tip is to leverage environment-specific configuration files by using the config() helper with environment variables instead of hardcoding values.
The Tip:
Always define configuration values in your config/*.php files and reference environment variables, rather than calling env() directly in your application code.
Why This Improves Flexibility:
Bad Practice:
// In a controller or service
$apiKey = env('EXTERNAL_API_KEY');
Good Practice:
// In config/services.php
return [
'external_api' => [
'key' => env('EXTERNAL_API_KEY'),
'timeout' => env('EXTERNAL_API_TIMEOUT', 30),
'base_url' => env('EXTERNAL_API_URL', 'https://api.example.com'),
],
];
// In your application code
$apiKey = config('services.external_api.key');
Benefits:
- Config Caching Works: When you run
php artisan config:cache,env()calls outside config files returnnull, breaking your app - Centralized Configuration: All settings are in one place, making them easier to find and modify
- Better Testing: You can easily override config values in tests using
Config::set() - Default Values: Provide sensible defaults that work across different environments
- Type Safety: You can cast and validate configuration values in one place
This simple practice significantly improves your application's flexibility and maintainability across different environments.
WSLの再セットアップ
新規Windowsユーザーを作るところからやり直したので今回はDockerなしで軽量な開発環境にする。
PHPは今まで通り、Sailと同じ方法でaptで直接インストール。
node.jsはnvmでインストール。GitHub Copilot CLIやClaude Codeを使うならnvmを使ったほうがトラブルが少ない。
個人用ローカルMCPサーバーを作ると便利
最近は開発用途はGitHub Copilot CLIばかりだけど開発以外の用途には「Claudeデスクトップ+Laravel MCPで作ったローカルMCPサーバー」の組み合わせ。
Claudeデスクトップは開発者向け機能で無料プランでもローカルMCPサーバーは使える。
ちょっとしたことにはこれで十分使える。
Laravel Boostが特殊なだけで普通のローカルMCPサーバーならグローバルなMCP設定ファイルにartisanまでの絶対パスを指定すれば問題なく動く。
Macの場合。
{
"mcpServers": {
"my-mcp": {
"command": "php",
"args": [
"/path/to/artisan",
"mcp:start",
"my-mcp"
]
}
}
}
WSLなら
{
"mcpServers": {
"my-mcp": {
"command": "wsl.exe",
"args": [
"--cd",
"/path/to/project",
"php",
"artisan",
"mcp:start",
"my-mcp"
]
}
}
}
laravel/laravel v12.10.1
https://github.com/laravel/laravel/releases/tag/v12.10.1
- package.jsonのスキーマURLを更新
laravel/framework v12.38.1
https://github.com/laravel/framework/releases/tag/v12.38.1
リリースノート要約
GeneratorCommandに欠けていたpossibleModels()メソッドを修正
laravel/framework v12.38.0
https://github.com/laravel/framework/releases/tag/v12.38.0
リリースノート要約
パフォーマンス最適化
- 設定キャッシュ、ルートキャッシュ、イベントキャッシュの結果をメモ化してパフォーマンス向上
新機能
- テスト用の新しいトレイト
WithCachedRoutesとWithCachedConfigを導入 model:showコマンドでモデルの入力補完機能を追加schedule:listコマンドのJSON出力に環境情報を追加- SQLiteで
whereNotMorphedToメソッドをサポート
バグ修正
- Factoryのinsert時に
Model::toArray()を呼び出さないように修正 Stringable::ucwordsに不足していたセパレータを追加- バリデーションメッセージのプレースホルダーの小文字化を元に戻す
bootstrap/app.php内でのリクエスト例外の切り捨て設定の問題を修正- AWS ElasticCacheのフェイルオーバー時にREADONLYエラーで再接続するように対応
コード改善
- 不要なインポートの削除
- PHPDocの修正
- コアエイリアスをアルファベット順に整理
DumpCommandを禁止可能に変更- Broadcastルートの有効化方法を改善
依存関係
- Symfony 7.4をサポート
- Resend ^1.0を許可
テスト関連
- Redis統合テスト用の個別ワークフローを追加
- 各種テストの改善とクリーンアップ
Laravel Eloquent リレーションシップの実際の使用例
機能:Eloquent リレーションシップ(belongsToとhasMany)
ブログシステムを例に、Laravelの強力なEloquentリレーションシップ機能を説明します。
実世界のシナリオ:ブログ記事とコメント管理システム
モデルの定義
// app/Models/Post.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
protected $fillable = ['title', 'content', 'user_id'];
// 1つの投稿は複数のコメントを持つ
public function comments()
{
return $this->hasMany(Comment::class);
}
// 1つの投稿は1人のユーザーに属する
public function author()
{
return $this->belongsTo(User::class, 'user_id');
}
}
// app/Models/Comment.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Comment extends Model
{
protected $fillable = ['post_id', 'user_id', 'content'];
// 1つのコメントは1つの投稿に属する
public function post()
{
return $this->belongsTo(Post::class);
}
// 1つのコメントは1人のユーザーに属する
public function author()
{
return $this->belongsTo(User::class, 'user_id');
}
}
コントローラーでの使用
// app/Http/Controllers/PostController.php
<?php
namespace App\Http\Controllers;
use App\Models\Post;
use Illuminate\Http\Request;
class PostController extends Controller
{
// 投稿とそのコメントを表示
public function show($id)
{
// Eager Loadingで N+1 問題を回避
$post = Post::with(['comments.author', 'author'])->findOrFail($id);
return view('posts.show', compact('post'));
}
// 新しいコメントを追加
public function addComment(Request $request, $postId)
{
$post = Post::findOrFail($postId);
$post->comments()->create([
'user_id' => auth()->id(),
'content' => $request->content
]);
return redirect()->back()->with('success', 'コメントが投稿されました');
}
// コメント数でフィルタリング
public function popular()
{
$popularPosts = Post::withCount('comments')
->having('comments_count', '>', 10)
->orderBy('comments_count', 'desc')
->get();
return view('posts.popular', compact('popularPosts'));
}
}
ビューでの表示
{{-- resources/views/posts/show.blade.php --}}
<div class="post">
<h1>{{ $post->title }}</h1>
<p class="author">投稿者: {{ $post->author->name }}</p>
<div class="content">{{ $post->content }}</div>
<h2>コメント ({{ $post->comments->count() }}件)</h2>
@foreach($post->comments as $comment)
<div class="comment">
<strong>{{ $comment->author->name }}</strong>
<p>{{ $comment->content }}</p>
<small>{{ $comment->created_at->diffForHumans() }}</small>
</div>
@endforeach
</div>
この機能の利点
- コードの簡潔性: 複雑なJOINクエリを書く必要がなく、直感的な構文でリレーションデータを取得できます
- Eager Loading:
with()メソッドでN+1問題を簡単に回避できます - 保守性: データベース構造の変更があっても、モデルの定義を変更するだけで対応できます
このように、Laravelのリレーションシップ機能は実際のアプリケーション開発で非常に強力かつ実用的です。
Laravel BoostとMCPはほぼ理解
Boostで紛らわしいのはPhpStormとはJunieのことでプラグインで他のツールを使ってる場合は選んではいけない。
GitHub Copilotプラグインを使っているならこれ。
https://github.com/invokable/laravel-boost-phpstorm-copilot
「エディター・IDEの選択=MCP設定ファイルの選択(McpClientinterface)」と「ガイドラインの選択(Agentinterface)」の2段階ある。
MCPサーバー機能はphp-mcpからLaravel公式のlaravel/mcpに書き換えても問題なく動いてる。
Laravelで作るならMCPサーバーはremoteのほうが使い方も簡単だろうけどlocalも作ることはできる。
boostはlocalかつプロジェクト内で動かすので難しくなっている。
Eagerローディング(Eager Loading)
LaravelのEagerローディングは、データ取得を簡素化する強力なリレーションシップ機能です。
特徴
Eagerローディングを使用すると、with()メソッドを使って関連データを一度に取得できます。これにより「N+1問題」を防ぎ、データベースクエリの数を劇的に削減できます。
例
// N+1問題が発生する場合
$posts = Post::all();
foreach ($posts as $post) {
echo $post->author->name; // 投稿ごとにクエリ実行
}
// Eagerローディングを使用(推奨)
$posts = Post::with('author')->get();
foreach ($posts as $post) {
echo $post->author->name; // たった2つのクエリで完了
}
メリット
- データベースクエリの数を最小化
- アプリケーションのパフォーマンス向上
- シンプルで読みやすいコード
- 複数の関連データも同時に取得可能(
with(['author', 'comments']))
laravel/laravel v12.10.0
https://github.com/laravel/laravel/releases/tag/v12.10.0
Laravel のリリースノートに background ドライバーが追加されました。
laravel/framework v12.37.0
https://github.com/laravel/framework/releases/tag/v12.37.0
リリースノート要約
files()とdirectories()関数にカスタム「深さ」パラメータを渡せるようになったEnumerateValues::value()がオブジェクトをサポートし、負の値を返すように改善- 重複ロジックを再利用可能な別のメソッドに移動
- 未公開の
data_hasヘルパーをリファクタリング - キャッシュフェイルオーバードライバーに関する詳細説明を追加
data_hasの空チェックを修正- 空文字列チェック前にトリムを使用するよう修正
- キューフェイルオーバードライバーの詳細説明を追加
- フェイルオーバーとラウンドロビンのメーラー詳細を追加
- 未使用変数を削除
Factory@insert()メソッドを追加- Windows上でのScheduleRunCommandTestの失敗を、OS固有の成功コマンドを使って修正
- StrとStringableに
ucwordsを追加 Connection@listen()のドキュメントブロックを改善- 通知の接続/キューへの正しいフォールバックを修正
- DatabaseServiceProviderで未使用のクロージャパラメータを削除
- RedisクラスターのキューテストにQUEUE_CONNECTIONを追加
- ArtisanServiceProviderで未使用パラメータを削除
- Fileルールでカスタムバリデーションメッセージが機能するよう修正
- JSONスキーマの改善
- キュージョブをバックグラウンド処理する機能を追加
- ChainedBatchがラップされたバッチのキューと接続を維持するよう修正
Contextual Binding for Better Dependency Injection
When working with Laravel's service container, you can use contextual binding to inject different implementations of an interface based on which class is requesting it:
$this->app->when(PhotoController::class)
->needs(StorageInterface::class)
->give(CloudStorage::class);
$this->app->when(DocumentController::class)
->needs(StorageInterface::class)
->give(LocalStorage::class);
This approach allows you to maintain clean dependency injection in your classes while letting the container handle the complexity of determining which implementation to provide. Your controllers can simply type-hint the interface in their constructors, and Laravel will automatically inject the appropriate implementation based on the context.
livewire/livewire v4.0.0-beta.2
https://github.com/livewire/livewire/releases/tag/v4.0.0-beta.2
変更点要約
prepareViewsForCompilationUsingを追加- 遅延読み込みのドキュメントで
lazy_placeholderをcomponent_placeholderに置き換え - ビュー関数へのデータ受け渡しの修正
- スネークケースのコンポーネントパラメータの修正
- composer fixtures の問題を修正
- 内部リンクを v4 に更新
laravel/framework v12.36.1
https://github.com/laravel/framework/releases/tag/v12.36.1
- Laravel 12.xでは、version_compare()関数を使用する際に常にoperator引数を使用するように変更された。
- Filesystem クラスに allDirectories() メソッドが追加された。
- EnumerateValues::value() で負の値をサポートする変更が一度追加されたが、その後取り消された。