Twinkle
laravel/framework v12.17.0
https://github.com/laravel/framework/releases/tag/v12.17.0
- 11.xにおいてTestResponse::assertRedirectBackをバックポート
- Resendメールで非エンコードの添付ファイル送信をサポート
- タイムスタンプ関連メソッドがCollectionを返却するよう変更
- Collection返却型を完全修飾
- カスタム名前空間のBladeネスト済みデフォルトコンポーネント解決を修正
- コンソールコマンドハンドラの戻り型をvoidに修正
- Collectionアイテムへの高階静的呼び出しを可能に
- カーソルページネーターにリソースヘルパーを追加
- クエリビルダーにreorderDesc()を追加
- 11.xでSymfony Console 7.3の非推奨通知をクロージャコマンドから修正
- AsUriモデルキャストを追加
- PHP8属性によるコンテキスト実装/インターフェースバインディングを追加
- AuthenticateSessionミドルウェアのテストを追加
- brick/math ^0.13を許可
- Factory::stateおよびprependStateのジェネリクスを修正
laravel/framework v11.45.1
https://github.com/laravel/framework/releases/tag/v11.45.1
- Resendメール機能に生(未エンコード)添付ファイルの送信対応を追加
- 11.xでSymfony Console 7.3のクロージャコマンドに関する非推奨警告を修正
Use a custom Eloquent “Castable” class (i.e. a Value Object) for your model attributes so you get strong typing, encapsulated logic and automatic DB conversion.
-
Create your Value Object implementing the Castable & CastsAttributes contracts:
use Illuminate\Contracts\Database\Eloquent\Castable; use Illuminate\Contracts\Database\Eloquent\CastsAttributes; class Money implements Castable, CastsAttributes { public int $amount; public string $currency; public function __construct(int $amount, string $currency = 'USD') { $this->amount = $amount; $this->currency = $currency; } // Eloquent will call this when retrieving public function get($model, string $key, $value, array $attributes) { [$amount, $currency] = explode(':', $value); return new self((int)$amount, $currency); } // Eloquent will call this when saving public function set($model, string $key, $value, array $attributes) { /** @var Money $value */ return "{$value->amount}:{$value->currency}"; } // required by Castable public static function castUsing(array $arguments) { return new self(...$arguments); } }
-
Register it in your model’s
$casts
:class Product extends Model { protected $casts = [ 'price' => Money::class.':USD', // optional constructor args ]; }
Now $product->price
is a Money
object with your domain logic, and Eloquent handles serialization to/from the database automatically.
技術記事 長文はDiscussionsに移行
短文はここ。
Zennの通常記事は全部削除済。過去の記事はDiscussionsに移すかも。
Zennの本はそのまま残すけど一冊分の書くことができない限り再開はなさそう。
My new home on GitHub
I've joined a friend's GitHub organization, and this is where I'll be developing my packages from now on.
https://github.com/invokable
tailwindlabs/tailwindcss v4.1.8
https://github.com/tailwindlabs/tailwindcss/releases/tag/v4.1.8
追加された機能
@apply
が失敗した際のエラーメッセージを改善
修正点
<style>
ブロック内の候補に見える宣言を誤ってマイグレーションしないように- pnpm モノレポ環境での Tailwind CSS 検出時および依存更新時のエラーを解消
- 非推奨の
order-none
をorder-0
にマイグレーション - Leptos の
class:
属性からのクラス抽出をサポート - 不正な任意値で発生する「undefined のプロパティ読み取り」クラッシュを修正
-mt-[0px]
を正しくmt-[0px]
にマイグレーション- ファイル末尾に改行がない Haml 事前処理時のクラッシュを修正
.pnpm-store
フォルダを既定で無視(必要に応じてソースルールで上書き可能)toJSON()
呼び出し時の PostCSS クラッシュを修正
Devin型エージェントの便利なところは
iPadからでも使えるところ。
最近の技術記事は企業の宣伝ばかりで前提が違いすぎて参考にならない。
「就業時間内だけの作業で常にPCの前にいる前提」ならローカルで動くツールでいいけど
時間に関係なくいつでもGitHubの更新したい人にはブラウザさえあれば使えるツールが便利。
とはいえ何に使ってるかって英語を書かせてるだけなんだけど。
OSSだとコードよりも英語でドキュメントを書く作業が大変。
ここを任せると捗る。
laravel/laravel v12.0.9
https://github.com/laravel/laravel/releases/tag/v12.0.9
- 12.xブランチからapcを削除
- package.jsonにJSONスキーマを追加
- 言語表現を小規模に更新
- .gitignoreを強化し、OSやログの一般的なファイルを除外
laravel/framework v12.16.0
https://github.com/laravel/framework/releases/tag/v12.16.0
・optimize:clearコマンドの優先度を変更
・TestResponse::assertSessionMissing()で配列キー指定時の不具合を修正
・Context属性とHiddenプロパティの連携対応
・Resendメールドライバーで生データ添付をサポート
・Flexible Cacheに常時ディファーオプションを追加
・null合体代入演算子(??=)を適用したコード整備
・Arr::hasAllメソッドを追加
・レイジーロードチェックを復活
・マイナーな文言更新
・RedisStore::putMany()でconnectionAwareSerializeを使用するキャッシュ修正
・ResponseFactoryがnullコールバックを受け入れるよう修正
・ビューのテンプレート変数をスコープに追加
・StringableクラスにtoUriメソッドを導入
・コンストラクタから@returnタグを削除
・is_integer()をis_int()に置換
・Query Builder::upsert()の引数型を修正
・in_array_keysバリデーションルールを追加
・Rule::containsバリデーションを追加
Create a custom Eloquent cast to turn attributes into rich “value objects” (or any complex type) automatically. Implement the CastsAttributes interface (or Castable) in a class with get() and set() methods, then register it on your model’s $casts:
// app/Casts/JsonSettingsCast.php
namespace App\Casts;
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
class JsonSettingsCast implements CastsAttributes
{
public function get($model, string $key, $value, array $attributes)
{
return new SettingsCollection(json_decode($value, true));
}
public function set($model, string $key, $value, array $attributes)
{
return [$key => json_encode(
$value instanceof SettingsCollection
? $value->toArray()
: (array) $value
)];
}
}
// In your model
protected $casts = [
'settings' => \App\Casts\JsonSettingsCast::class,
];
Now $model->settings
is always a SettingsCollection, and serialization is handled for you.
Devinでの新規Laravelプロジェクト作成
インストーラー実行時の選択肢もしっかり選べてて偉い。事前にどれを選ぶか指示を出しておけばコマンドの途中で選ぶ行為ができる。
laravel new my-app
laravel/framework v12.15.0
https://github.com/laravel/framework/releases/tag/v12.15.0
・Number クラスにロケール対応の数値解析メソッドを追加
・データから enum を取得する際のデフォルトオプションを追加
・「Number::fileSize」のプレフィックス修正を取り消し
・APC 拡張の除去
・assertJsonStructure/assertExactJsonStructure メソッドにパラメータ型を付与
・設定ファイル内の環境変数に対する型キャスト不具合を修正
・モデルの「以前の状態(previous)」を保持するよう改善
・Eloquent\Builder の getCountForPagination をパススルー対応
・TestResponse に assertClientError メソッドを追加
・Livewire スターターキット向け放送コマンドのインストール処理を修正
・ベンチマーク値の単位を明示して IDE の可読性を向上
・Eloquent のオリジナル属性取得メソッドの PHPDoc リターンタイプを改善
・自動リレーションロード時に発生する preventsLazyLoading 例外を抑制
・文字列ヘルパーとして hash 関数を追加
・assertSessionMissing のシグネチャを assertSessionHas と一致させるよう更新
・パスワード未設定時の artisan db コマンド実行エラーを修正
・InteractsWithPivotTable::sync の型定義を追加
・Paginator に current_page_url プロパティを追加
・コマンド失敗時の fail メソッド PHPDoc 戻り型を修正
・リダイレクト先がコントローラアクションかを検証する assertRedirectToAction メソッドを追加
・Context 属性を導入し、コンテキスト情報を付与
laravel/framework v11.45.0
https://github.com/laravel/framework/releases/tag/v11.45.0
• テスト機能を改善
• Passport をバージョン13.xに対応
• league/commonmark の最低バージョン要件を引き上げ
• Timebox に関する修正を 11.x 系にバックポート
• Ubuntu 22.04 上で SQLServer 2017 のテストを実施
• Symfony 7.3 の非推奨警告への対応を修正
• TestResponse::assertRedirectBack を 11.x 系にバックポート
GitHub Copilot Coding Agent
Devinと同じようにシェルでコマンドの実行ができるのでこれも使えるはず。
https://github.blog/news-insights/product-news/github-copilot-meet-the-new-coding-agent/
https://github.blog/jp/2025-05-20-github-copilot-meet-the-new-coding-agent/
後はコストや性能や導入しやすさでどれか人気になるか決まっていくんだろう。
サービスコンテナのコンテキストバインディングを活用し、同じインターフェイスに対して呼び出し元クラスごとに異なる実装を注入する。例えば:
// App\Providers\AppServiceProvider.php の register() 内
$this->app->when(\App\Services\OrderService::class)
->needs(\App\Contracts\PaymentGatewayInterface::class)
->give(\App\Gateways\StripeGateway::class);
$this->app->when(\App\Services\ReportService::class)
->needs(\App\Contracts\PaymentGatewayInterface::class)
->give(\App\Gateways\PaypalGateway::class);
こうすることで、同一インターフェイスでも用途に応じた実装差替えが容易になり、テストや拡張性が格段に向上します。