<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Chris Carpenter</title>
    <description>The latest articles on Forem by Chris Carpenter (@akimotoarcan).</description>
    <link>https://forem.com/akimotoarcan</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3870429%2F0971d2ef-86dc-4213-a4d0-f1dd130cb43b.jpg</url>
      <title>Forem: Chris Carpenter</title>
      <link>https://forem.com/akimotoarcan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/akimotoarcan"/>
    <language>en</language>
    <item>
      <title>I spent 4 years building a production PHP system. Then I turned the framework into a product.</title>
      <dc:creator>Chris Carpenter</dc:creator>
      <pubDate>Thu, 09 Apr 2026 18:51:05 +0000</pubDate>
      <link>https://forem.com/akimotoarcan/i-spent-4-years-building-a-production-php-system-then-i-turned-the-framework-into-a-product-438l</link>
      <guid>https://forem.com/akimotoarcan/i-spent-4-years-building-a-production-php-system-then-i-turned-the-framework-into-a-product-438l</guid>
      <description>&lt;h2&gt;
  
  
  The backstory
&lt;/h2&gt;

&lt;p&gt;For the past 4 years, I've been the sole developer at a manufacturing facility. I built everything from scratch: a 2,188-file PHP enterprise application managing production tracking, quality control, scheduling, inventory, and shipping. 100+ daily users. 99.9% uptime since 2022.&lt;/p&gt;

&lt;p&gt;No Laravel. No Symfony. Custom MVC architecture with OOP, SOLID principles, and design patterns throughout.&lt;/p&gt;

&lt;h2&gt;
  
  
  The realization
&lt;/h2&gt;

&lt;p&gt;After building the same foundational components for the third time across different projects — authentication, permissions, database connections, API responses, caching, CSRF protection, input validation, logging — I realized these components were genuinely reusable.&lt;/p&gt;

&lt;p&gt;So I extracted them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What PhoenixPHP includes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Base Framework ($40)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Auth.php&lt;/strong&gt; — Session-based authentication with bcrypt, mobile detection, session management&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RBAC&lt;/strong&gt; — Configurable permission groups with &lt;code&gt;Auth::can('admin.write')&lt;/code&gt; pattern&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database.php&lt;/strong&gt; — Multi-database MySQLi + PDO connection pooling with lazy initialization&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API bootstrap&lt;/strong&gt; — Standardized &lt;code&gt;{"ok": true, "data": {...}}&lt;/code&gt; response format, CORS, auth enforcement&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cache.php&lt;/strong&gt; — Multi-driver (Redis → APCu → File) with automatic fallback&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CSRF.php&lt;/strong&gt; — Token generation/validation with constant-time comparison&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validator.php&lt;/strong&gt; — Fluent API with 15+ rules: &lt;code&gt;Validator::make($data, ['email' =&amp;gt; 'required|email'])&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logger.php&lt;/strong&gt; — PSR-3 compatible with file rotation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance.php&lt;/strong&gt; — Operation timers, slow query detection&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SecurityHelper.php&lt;/strong&gt; — Rate limiting, input sanitization, password hashing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ModuleLoader.php&lt;/strong&gt; — Auto-discovers plug-and-play modules&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6 Modules ($20 each)
&lt;/h3&gt;

&lt;p&gt;Each module includes database schema, full REST API routes, and a &lt;code&gt;module.json&lt;/code&gt; manifest:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Module&lt;/th&gt;
&lt;th&gt;Endpoints&lt;/th&gt;
&lt;th&gt;Tables&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Inventory Management&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CMMS Maintenance&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Production Tracker&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Internal Chat&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shift Scheduling&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Report Builder&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Total: 104 API endpoints, 33 database tables.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The demo
&lt;/h2&gt;

&lt;p&gt;I built an interactive dashboard demo showcasing every module:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://akimoto-arcan.github.io/phoenix-php/" rel="noopener noreferrer"&gt;&lt;strong&gt;Live Demo →&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dark theme, animated stats, Chart.js graphs, live activity feeds, and full CRUD previews for every module.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Extracting a framework from a monolith is harder than building one from scratch.&lt;/strong&gt; You have to untangle business logic from framework logic, and the line isn't always clear.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The module system was the key insight.&lt;/strong&gt; Once I designed the ModuleLoader with auto-discovery, adding new capabilities became trivial: create a directory, add a &lt;code&gt;module.json&lt;/code&gt;, and the framework picks it up.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Production code is different from tutorial code.&lt;/strong&gt; Every class handles edge cases, error states, and security concerns that you only discover by running software for real users.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Get it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Base framework:&lt;/strong&gt; &lt;a href="https://cdacprogramming.gumroad.com/l/phoenix-php" rel="noopener noreferrer"&gt;$40 on Gumroad&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complete bundle:&lt;/strong&gt; &lt;a href="https://cdacprogramming.gumroad.com/l/Phoenix-PHP-Bundle" rel="noopener noreferrer"&gt;$99 on Gumroad&lt;/a&gt; (save $61)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Built by CDAC Programming.&lt;/p&gt;

</description>
      <category>php</category>
      <category>mysql</category>
      <category>webdev</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
