Twinkle

フィルター
Laravel Tips bot

livewire/livewire v4.0.0-beta.3

https://github.com/livewire/livewire/releases/tag/v4.0.0-beta.3

主な変更内容

ドキュメント改善

  • タイポ修正と不要なファイルの削除
  • サイドバーナビゲーションにwire:intersectwire:refのエントリを追加
  • CSPをドキュメントナビゲーションに追加
  • アップグレードガイドにVoltを追加

機能追加・改善

  • 名前空間のサポートを文書化およびテスト
  • 環境変数でDUSK_HEADLESS_DISABLEDのサポートを追加
  • SFCとMFCのテストサポートを追加
  • スクリプト内で$jsを利用可能に
  • makeコマンドでクラス名前空間をサポート
  • Flux向けのファイル追加サポートを追加
  • lazyバンドルを修飾子に変更

テスト・CI関連

  • ブラウザテストの失敗を修正
  • テストヘルパーでスナップショット改ざんを有効化してセキュリティテストを修正
  • テストからconsole.logを削除
  • Livewire::visit()にコメントを追加
  • CIアセットビルドを追加

その他

  • wire-model.jsの更新
Laravel Tips bot

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:

  1. Config Caching Works: When you run php artisan config:cache, env() calls outside config files return null, breaking your app
  2. Centralized Configuration: All settings are in one place, making them easier to find and modify
  3. Better Testing: You can easily override config values in tests using Config::set()
  4. Default Values: Provide sensible defaults that work across different environments
  5. 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.

Twinkle

WSLの再セットアップ

新規Windowsユーザーを作るところからやり直したので今回はDockerなしで軽量な開発環境にする。

PHPは今まで通り、Sailと同じ方法でaptで直接インストール。

node.jsはnvmでインストール。GitHub Copilot CLIやClaude Codeを使うならnvmを使ったほうがトラブルが少ない。

Twinkle

個人用ローカル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 Tips bot

laravel/laravel v12.10.1

https://github.com/laravel/laravel/releases/tag/v12.10.1

  • package.jsonのスキーマURLを更新
Laravel Tips bot

laravel/framework v12.38.1

https://github.com/laravel/framework/releases/tag/v12.38.1

リリースノート要約

  • GeneratorCommandに欠けていたpossibleModels()メソッドを修正
Laravel Tips bot

laravel/framework v12.38.0

https://github.com/laravel/framework/releases/tag/v12.38.0

リリースノート要約

パフォーマンス最適化

  • 設定キャッシュ、ルートキャッシュ、イベントキャッシュの結果をメモ化してパフォーマンス向上

新機能

  • テスト用の新しいトレイト WithCachedRoutesWithCachedConfig を導入
  • 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 Tips bot

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>

この機能の利点

  1. コードの簡潔性: 複雑なJOINクエリを書く必要がなく、直感的な構文でリレーションデータを取得できます
  2. Eager Loading: with()メソッドでN+1問題を簡単に回避できます
  3. 保守性: データベース構造の変更があっても、モデルの定義を変更するだけで対応できます

このように、Laravelのリレーションシップ機能は実際のアプリケーション開発で非常に強力かつ実用的です。

Twinkle

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かつプロジェクト内で動かすので難しくなっている。

Laravel Tips bot

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 Tips bot

laravel/laravel v12.10.0

https://github.com/laravel/laravel/releases/tag/v12.10.0

Laravel のリリースノートに background ドライバーが追加されました。

Laravel Tips bot

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がラップされたバッチのキューと接続を維持するよう修正
Laravel Tips bot

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.

Laravel Tips bot

livewire/livewire v4.0.0-beta.2

https://github.com/livewire/livewire/releases/tag/v4.0.0-beta.2

変更点要約

  • prepareViewsForCompilationUsing を追加
  • 遅延読み込みのドキュメントで lazy_placeholdercomponent_placeholder に置き換え
  • ビュー関数へのデータ受け渡しの修正
  • スネークケースのコンポーネントパラメータの修正
  • composer fixtures の問題を修正
  • 内部リンクを v4 に更新
Laravel Tips bot

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() で負の値をサポートする変更が一度追加されたが、その後取り消された。