<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Laravel on ROBOCO</title>
    <link>https://roboco.io/ja/tags/laravel/</link>
    <description>Recent content in Laravel on ROBOCO</description>
    <generator>Hugo</generator>
    <language>ja</language>
    <lastBuildDate>Fri, 16 Oct 2026 18:00:00 +0900</lastBuildDate>
    <atom:link href="https://roboco.io/ja/tags/laravel/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>バイブコーディングでレガシーをモダナイズする（2/2）：Webの歴史とともに積み重なったPHP</title>
      <link>https://roboco.io/ja/posts/legacy-php-vibe-coding-modernization/</link>
      <pubDate>Fri, 16 Oct 2026 18:00:00 +0900</pubDate>
      <guid>https://roboco.io/ja/posts/legacy-php-vibe-coding-modernization/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;PHPレガシーのリスクはポインタではなく、老朽化した実行環境、暗黙の型変換、権限チェック、そしてDBや外部連携に潜んでいます。ほとんどの場合、正解はPHPを捨てることではなく、PHPをサポート対象のバージョンに上げ、検証とデプロイの仕組みを先に整えることです。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;figure&gt;&lt;img src=&#34;https://roboco.io/posts/images/Dohyun.png&#34;&gt;&lt;figcaption&gt;&#xA;      &lt;h4&gt;チョン・ドヒョン - ROBOCO首席コンサルタント&lt;/h4&gt;&#xA;    &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://roboco.io/ja/posts/legacy-cpp-vibe-coding-modernization/&#34;&gt;第1部&lt;/a&gt;では、20年以上前のC/C++アプリケーションをバイブコーディングでモダナイズする方法を扱いました。&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; 今回は、レガシーWeb、なかでもPHPを扱います。&lt;/p&gt;&#xA;&lt;p&gt;PHPは1995年に登場し、Webの歴史とほぼ同じ時間をともに歩んできました。その間に数多くの企業サイト、ECサイト、コミュニティ、社内業務システムがPHPで作られ、その相当数はいまも稼働しています。韓国国内だけでも、GnuboardやYoungcartで作られたサイト、自作のPHP5管理画面、古いLaravelやCodeIgniterのプロジェクトに、コンサルティングの現場でよく出会います。こうしたプロジェクトでも「エージェントがきちんと仕事をしてくれない」という声を聞きます。&lt;/p&gt;&#xA;&lt;p&gt;第1部の結論は、PHPにもそのまま当てはまります。エージェントが失敗する主な理由は、自分が行った変更が正しいかを確かめる手段がないことです。だからこそ、モダナイゼーションの最初の投資先は検証環境であるべきです。しかし、何を検証すべきかはC/C++とは異なります。本記事では、2026年10月16日時点で調査した公開事例・公式サポートポリシー・ツールドキュメントをもとに、PHPに合ったモダナイゼーション戦略を整理します。事例の数値はすべて発表主体による自己報告であり、私が独自に再現したものではありません。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;シリーズ：バイブコーディングでレガシーをモダナイズする&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://roboco.io/ja/posts/legacy-cpp-vibe-coding-modernization/&#34;&gt;20年もののC/C++アプリケーション&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Webの歴史とともに積み重なったPHP（本記事）&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;tldr&#34;&gt;TL;DR&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;PHPレガシーの主なリスクはポインタの寿命ではなく、サポートが終了した実行環境、動的型付けと暗黙の動作、グローバル状態、認証・認可、DBと外部連携、そしてテストとデプロイの仕組みの欠如です。&lt;/li&gt;&#xA;&lt;li&gt;ほとんどのプロジェクトには、PHPを維持しながらランタイムと依存関係をサポート対象のバージョンに上げ、検証・デプロイの仕組みを作ったうえで、必要な部分だけを再構成する方法が適しています。&lt;/li&gt;&#xA;&lt;li&gt;ルールが明確な大量変換はRectorのような決定的なツールに任せ、エージェントは調査・残った例外の修正・テスト作成を担当します。人は業務上の動作・権限・データ・切り替えのリスクを判断します。&lt;/li&gt;&#xA;&lt;li&gt;Webプロジェクトの同等性は、画面が表示されることでは確認できません。HTTPリクエスト、ユーザー権限、セッション、DBの変更、メール・決済のような外部効果を1つのシナリオとして比較する必要があります。&lt;/li&gt;&#xA;&lt;li&gt;公開事例では、エージェントが権限チェックの欠落（IDOR）、メール送信の欠落、&lt;code&gt;+1&lt;/code&gt;のような定数補正、DBカラムをnullableに変える回避策を実際に作り出しました。こうした失敗を捕捉する検証基準を先に立てる必要があります。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;1-phpレガシーはccレガシーと何が違うのか&#34;&gt;1. PHPレガシーはC/C++レガシーと何が違うのか&lt;/h2&gt;&#xA;&lt;p&gt;C/C++レガシーの核心的な難題は、ポインタの所有権とオブジェクトの寿命でした。PHPはリクエストが終わるとメモリが解放される実行モデルなので、この問題はほとんどありません。そのかわり、別のところで問題が起きます。&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;区分&lt;/th&gt;&#xA;          &lt;th&gt;C/C++レガシー&lt;/th&gt;&#xA;          &lt;th&gt;PHPレガシー&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;主なリスク&lt;/td&gt;&#xA;          &lt;td&gt;ポインタの所有権、オブジェクトの寿命、メモリ欠陥&lt;/td&gt;&#xA;          &lt;td&gt;実行環境の老朽化、暗黙の型変換、権限、DB・外部への副作用&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;事実上の仕様&lt;/td&gt;&#xA;          &lt;td&gt;オリジナルのバイナリの動作とABI&lt;/td&gt;&#xA;          &lt;td&gt;稼働中のサーバーのコード、DBスキーマとデータ、URL&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;同等性の比較単位&lt;/td&gt;&#xA;          &lt;td&gt;関数・ライブラリの入出力&lt;/td&gt;&#xA;          &lt;td&gt;HTTPリクエスト、ユーザーロール、セッション、DBの変更、外部効果&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;代表的な決定的ツール&lt;/td&gt;&#xA;          &lt;td&gt;clang-tidy、LibTooling、C2Rust&lt;/td&gt;&#xA;          &lt;td&gt;Rector、PHPStan、PHPCompatibility、Composer&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;よくある誤った目標&lt;/td&gt;&#xA;          &lt;td&gt;すべてをRustに翻訳&lt;/td&gt;&#xA;          &lt;td&gt;すべてを最新フレームワークとSPAで書き直し&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;私が現場で見てきたPHPレガシーで、エージェントの作業ループが途切れるポイントはおおむね4つです。&lt;/p&gt;&#xA;&lt;p&gt;1つ目に、&lt;strong&gt;リポジトリのコードが本番のコードと異なります。&lt;/strong&gt; FTPでサーバー上で直接修正したファイル、ベンダーやCMSのコアを直接書き換えた部分、Gitに入っていない設定ファイルはよくあります。エージェントがリポジトリだけを読んで作業すると、実際には稼働していないコードを基準に判断してしまいます。&lt;/p&gt;&#xA;&lt;p&gt;2つ目に、&lt;strong&gt;実際の実行環境を再現するのが困難です。&lt;/strong&gt; WebサーバーのPHPとcronが使うCLIのPHPとで、バージョンや&lt;code&gt;php.ini&lt;/code&gt;が異なることがあります。サポートが終了したPHP 5.xと古い拡張モジュール、EUC-KRのような文字エンコーディング、特定のMySQL設定に動作が依存しているケースも多くあります。&lt;/p&gt;&#xA;&lt;p&gt;3つ目に、&lt;strong&gt;コード検索だけではエントリーポイントをすべて見つけられません。&lt;/strong&gt; URLから直接呼び出されるPHPファイル、動的な&lt;code&gt;include&lt;/code&gt;、&lt;code&gt;eval&lt;/code&gt;、DBに保存されたSQLやルールがあると、シンボル検索では呼び出し関係が見えてきません。そのため、アクセスログとcronのスケジュールもあわせて確認する必要があります。&lt;/p&gt;&#xA;&lt;p&gt;4つ目に、&lt;strong&gt;DBと外部連携が事実上の仕様です。&lt;/strong&gt; ORMのモデルクラスが実際のDBスキーマと異なるケースは多くあります。実際のDDL、インデックス、trigger、データの分布が業務ルールを担っています。メール・SMS・決済（PG）連携は、テスト中に実際に実行されてしまうと取り消せません。&lt;/p&gt;&#xA;&lt;h2 id=&#34;2-公開事例が示すこと&#34;&gt;2. 公開事例が示すこと&lt;/h2&gt;&#xA;&lt;p&gt;PHPのモダナイゼーション事例はC/C++より多くあります。ただし、単純なAI支援コーディング、ツールを直接実行するエージェント、ルールベースの自動変換が混在しているので、区別して読む必要があります。&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;事例&lt;/th&gt;&#xA;          &lt;th&gt;元のシステムと目標&lt;/th&gt;&#xA;          &lt;th&gt;ツール&lt;/th&gt;&#xA;          &lt;th&gt;発表された結果&lt;/th&gt;&#xA;          &lt;th&gt;適用上の限界&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;DVHARDWARE&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;&#xA;          &lt;td&gt;2002年から積み重なった手続き型PHPのCMS → PHP 8.5とレイヤー構造&lt;/td&gt;&#xA;          &lt;td&gt;Codex、Docker、PHPStan、Deptrac&lt;/td&gt;&#xA;          &lt;td&gt;初期の機能対応版を3晩の作業で確保し、その後も改善を続けてデプロイ&lt;/td&gt;&#xA;          &lt;td&gt;比較的単純なCRUDのCMSであり、機能の同等性は運営者自身の判断&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Progrit&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;&#xA;          &lt;td&gt;7つのリポジトリ、PHP 8.2→8.4、Laravel 10→12&lt;/td&gt;&#xA;          &lt;td&gt;Claude Code、Rector&lt;/td&gt;&#xA;          &lt;td&gt;通常の開発と並行して大きな問題なく完了したと報告&lt;/td&gt;&#xA;          &lt;td&gt;期間・コスト・自動化率は非公開&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Rocket&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;&#xA;          &lt;td&gt;PHPの画面・ロジック → Angular中心の構造への残りの移行&lt;/td&gt;&#xA;          &lt;td&gt;Claude Code&lt;/td&gt;&#xA;          &lt;td&gt;教育を含めて4か月、シニアエンジニアの作業処理量が82件→201件&lt;/td&gt;&#xA;          &lt;td&gt;組織の変化もあわせて反映された数値であり、PHPサーバー全体の置き換えの根拠ではない&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Boldare&lt;sup id=&#34;fnref:5&#34;&gt;&lt;a href=&#34;#fn:5&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Symfony 5.4→6.4&lt;/td&gt;&#xA;          &lt;td&gt;Claude&lt;/td&gt;&#xA;          &lt;td&gt;数日と見込んでいた作業を数時間で実施&lt;/td&gt;&#xA;          &lt;td&gt;包括的な既存テストがあった。プロジェクト規模は非公開&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;2am.tech&lt;sup id=&#34;fnref:6&#34;&gt;&lt;a href=&#34;#fn:6&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;6&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;&#xA;          &lt;td&gt;古いLaravelアプリ → 新しいLaravel APIとReact&lt;/td&gt;&#xA;          &lt;td&gt;GitHub Copilotエージェント&lt;/td&gt;&#xA;          &lt;td&gt;垂直な機能単位で移植しながら、権限・メール・状態の欠陥を発見・修正&lt;/td&gt;&#xA;          &lt;td&gt;期間と生産性の数値は非公開&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;FuelPHP→Laravel&lt;sup id=&#34;fnref:7&#34;&gt;&lt;a href=&#34;#fn:7&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;7&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;&#xA;          &lt;td&gt;40万行以上、2千以上のファイル&lt;/td&gt;&#xA;          &lt;td&gt;ユーザー定義のRectorルール約80個&lt;/td&gt;&#xA;          &lt;td&gt;PHPファイルの99%を自動変換&lt;/td&gt;&#xA;          &lt;td&gt;2021年の作業でありLLMの事例ではない。約11か月にわたるQAとcanaryが必要&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;この表でもっとも学ぶべき点は、成果の数値ではなく、公開された失敗です。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
