<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:media="http://search.yahoo.com/mrss/" >

<channel>
	<title>PHP Development &#8211; Macronimous Blog</title>
	<atom:link href="https://www.macronimous.com/blog/category/php-development/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.macronimous.com/blog</link>
	<description>Web design, web programming, Mobile apps, Opensource , SEO etc</description>
	<lastBuildDate>Fri, 09 Oct 2026 15:18:29 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>
	<item>
		<title>Testing in Agentic Coding: From Safety Net to Steering Wheel</title>
		<link>https://www.macronimous.com/blog/testing-in-agentic-coding/</link>
					<comments>https://www.macronimous.com/blog/testing-in-agentic-coding/#respond</comments>
		
		<dc:creator><![CDATA[Jeffy Susan]]></dc:creator>
		<pubDate>Thu, 27 Aug 2026 07:33:47 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[AI Web Development]]></category>
		<category><![CDATA[Laravel Development]]></category>
		<category><![CDATA[PHP Development]]></category>
		<category><![CDATA[React development]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[web programming]]></category>
		<category><![CDATA[agentic coding]]></category>
		<category><![CDATA[AI code review]]></category>
		<category><![CDATA[Test-driven development]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[Vibe coding]]></category>
		<guid isPermaLink="false">https://www.macronimous.com/blog/?p=5308</guid>

					<description><![CDATA[<p>Testing in agentic coding is no longer a safety net written after the code. Tests are now the specification, the constraint, and the steering wheel for the AI agent itself. Teams that define expected behavior as tests before the agent writes a line ship faster and break less. Teams that let the agent grade its [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/testing-in-agentic-coding/">Testing in Agentic Coding: From Safety Net to Steering Wheel</a> first appeared on <a rel="nofollow" href="https://www.macronimous.com/blog">Macronimous Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<a href="https://www.macronimous.com/blog/wp-content/uploads/2026/08/Testing-in-Agentic-Coding-scaled.jpg"><img fetchpriority="high" decoding="async" width="2560" height="1352" src="https://www.macronimous.com/blog/wp-content/uploads/2026/08/Testing-in-Agentic-Coding-scaled.jpg" alt="Testing in Agentic Coding: " class="aligncenter size-full wp-image-5310" /></a>
<div class="mac-direct-answer">
<p><strong>Testing in <a href="https://www.macronimous.com/blog/agentic-coding-domain-knowledge/">agentic coding</a></strong> is no longer a safety net written after the code. Tests are now the specification, the constraint, and the steering wheel for the <a href="https://www.macronimous.com/blog/wordpress-7-0-ai-the-token-cost-reality-for-site-owners/">AI</a> agent itself. Teams that define expected behavior as tests before the agent writes a line ship faster and break less. Teams that let the agent grade its own homework ship confident-looking bugs.</p>
</div>
<p>We have been shipping a lot of apps with agents lately: Claude Code on some projects, our developers on Kilocode and Codex on others. The developers adapted fast. The question that kept bothering me was our test engineers, and whether twenty years of testing discipline just became obsolete overnight. This post is my answer: it did not. It became more important, and it moved to a different place in the process. Along the way I will also answer the question that follows immediately after: if agents write the code, who reviews it, and does agent-reviewing-agent even make sense?</p>
<div class="mac-toc">
<p class="mac-toc-title">In this post</p>
<ul>
<li><a href="#safety-net-steering-wheel">The safety net became the steering wheel</a></li>
<li><a href="#agent-without-tests">What happens when an agent codes without tests</a></li>
<li><a href="#test-driven-prompting">Test-driven prompting: write the contract, not the code</a></li>
<li><a href="#regression-first">Fix bugs backwards: regression test first, patch second</a></li>
<li><a href="#agent-code-review">Can an agent review agent code?</a></li>
<li><a href="#team-lead-changes">What changes for the team lead</a></li>
<li><a href="#testers-promoted">Your testers just got promoted</a></li>
</ul>
</div>
<h2 id="safety-net-steering-wheel">The safety net became the steering wheel</h2>
<p>For twenty years, tests sat downstream of code. You wrote the feature, then you wrote tests to prove it worked, and everyone quietly accepted that half the time the tests came late or not at all. Tests were insurance. Skipping them was a debt, not a disaster.</p>
<p>Agentic coding flipped the direction of that arrow. When Claude Code, Cursor, or any autonomous agent writes and modifies code in a loop, the test suite is the only channel through which reality reaches the agent. The agent cannot see your product spec. It cannot sit in your standup. What it can do, thousands of times an hour, is run a test and read the result. That makes tests the primary steering mechanism, not the final checkpoint. Anthropic&#8217;s own <a href="https://code.claude.com/docs/en/best-practices" target="_blank" rel="noopener noreferrer">Claude Code best practices</a> put test-driven workflows at the center for exactly this reason: a red-to-green cycle gives the agent unambiguous feedback it can iterate against without a human in the loop.</p>
<p>Here is the position I will defend: in an agentic team, writing tests after the code is not a smaller version of testing. It is theater.</p>
<p><img decoding="async" class="alignnone size-full wp-image-5307" src="https://www.macronimous.com/blog/wp-content/uploads/2026/08/testing-agentic-coding-vs-traditional-development.jpg" alt="Diagram comparing testing as a safety net in traditional development versus testing as driver and constraint in agentic vibe coding" width="1600" height="893"></p>
<h2 id="agent-without-tests">What happens when an agent codes without tests</h2>
<p>The failure modes are predictable, and if you manage a web team using AI agents, you have already seen at least one of them.</p>
<ul>
<li><strong>Hallucinated correctness.</strong> The agent reports &#8220;done, all working&#8221; for code it never executed against a real assertion. It is not lying. It has no ground truth to check against, so its confidence is a language pattern, not a verdict.</li>
<li><strong>Fix one, break three.</strong> Ask an agent to patch a Laravel endpoint and it will happily rewrite a shared helper, silently changing behavior in two other controllers. Without a regression suite, nobody notices until a client does.</li>
<li><strong>Spec drift.</strong> Over a long session, the agent&#8217;s idea of the feature slowly diverges from yours. Each individual change looks reasonable. The sum is a checkout flow that does something you never asked for.</li>
</ul>
<p>There is a fourth failure mode that surprises people: unlike a human developer, an agent almost never says no. A senior developer will push back on a bad requirement. An agent builds whatever you describe, including the unwise version, and builds it convincingly. Tests are the mechanism that replaces the pushback you lost.</p>
<h2 id="test-driven-prompting">Test-driven prompting: write the contract, not the code</h2>
<p>The practical shift for developers is that you stop typing assertions by hand and start defining behavior up front, in plain language or minimal test skeletons, then instruct the agent to write code that makes those tests pass. Kent Beck, who literally wrote the book on TDD, calls this discipline the difference between <a href="https://www.macronimous.com/blog/is-vibe-coding-bad/">vibe coding</a> and <a href="https://newsletter.kentbeck.com/p/augmented-coding-beyond-the-vibes" target="_blank" rel="noopener noreferrer">augmented coding</a>: in one you only care that the behavior looks right, in the other you own the tests and the design while the agent does the typing.</p>
<p>The working sequence looks like this:</p>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">1. "Write failing tests for the coupon validation endpoint.
   Expected: 422 on expired codes, 200 with discount object on valid codes,
   409 when the coupon is already redeemed. No implementation yet."
2. "Run the tests. Confirm they all fail."
3. Commit the failing tests.
4. "Now implement until every test passes.
   Do not modify the tests."</pre><p>&nbsp;</p>
<p>Step 3 is not optional. Agents will sometimes edit a test to make it pass instead of fixing the implementation. Committing the failing tests first means any tampering shows up in the diff, and you can revert it in seconds. That one git commit is doing the supervision work a human reviewer used to do line by line.</p>
<p>For web teams, the same pattern applies at every layer: Pest or PHPUnit for the API, Vitest for React components, and <a href="https://playwright.dev/docs/intro" target="_blank" rel="noopener noreferrer">Playwright</a> for the end-to-end flows that actually pay the bills, like login, cart, and checkout. The agent can write and run all of them. Your job is deciding what they must assert.</p>
<h2 id="regression-first">Fix bugs backwards: regression test first, patch second</h2>
<p>When a bug surfaces, the old reflex is to dive into the implementation. The agentic reflex should be different: prompt the agent to write a test that reproduces the bug, watch it fail, and only then allow the agent to generate the fix.</p>
<p>This ordering matters for two reasons. First, a reproducing test proves the agent understood the bug; a patch without one proves nothing. Second, that test stays in the suite forever, so the same agent (or the next one, or the junior developer six months from now) cannot reintroduce the bug without the pipeline going red. Every incident becomes a permanent constraint. Over a year, this is how a codebase touched by agents gets more stable instead of less. This is the same discipline we described in <a href="https://www.macronimous.com/blog/controlled-ai-coding/">controlled AI coding</a>, applied to defects instead of features.</p>
<div class="mac-key-point">
<p>In agentic development, the test suite is the only part of the codebase a human must fully own. Everything else is negotiable.</p>
</div>
<h2 id="agent-code-review">Can an agent review agent code?</h2>
<p>This is the question that sounds like a trap: if the agent wrote the code, having an agent review it feels like a developer testing his own work. Sometimes it is exactly that, and sometimes it is not. The difference is context, and it is worth being precise about.</p>
<p>An agent reviewing code inside the same session that wrote it is worthless. It carries the full memory of its own reasoning, so it re-approves its own assumptions, the same way you cannot proofread your own email five seconds after sending it. But a <strong>fresh agent session with no memory of the implementation</strong> is a genuinely different reviewer. It reads the diff cold, with no attachment to the decisions behind it, which is closer to a new team member reviewing a PR than to a developer grading himself. Anthropic recommends this writer/reviewer split as a standard pattern for the same reason.</p>
<p>So agent review is real, but it is narrow. A fresh agent catches logic errors, missed edge cases, and deviations from the test contract. What it cannot do is be accountable. Both agents still share the same training, the same blind spots, and the same inability to know your client, your compliance obligations, or your business. That is where the human stays, and not as a formality:</p>
<ul>
<li><strong>Owning the behavior contract.</strong> A human decides what the tests must assert. Agents can propose edge cases; a person approves them.</li>
<li><strong>Reviewing the tests, not the volume.</strong> Nobody honestly reads 800 generated lines. A human reads the 60 lines of tests that govern them, plus a spot-check of anything touching money, auth, or data deletion.</li>
<li><strong>Architectural and product judgment.</strong> Whether this feature should exist, whether this dependency is acceptable, whether this shortcut will hurt in a year. No test suite encodes that.</li>
<li><strong>The merge.</strong> A human presses the button, and that name in the git history means something a bot&#8217;s cannot.</li>
</ul>
<p>Put plainly: shipping unreviewed code was never acceptable, and agents do not change that. They change what review looks like. Test contract reviewed by a human, implementation reviewed by a fresh agent, judgment calls and the merge held by a human. That is not weaker than traditional code review. Done honestly, it is stricter, because the contract is explicit instead of living in a reviewer&#8217;s head.</p>
<h2 id="team-lead-changes">What changes for the team lead</h2>
<p>If you run a web team, the shift is bigger for you than for your developers. The summary:</p>
<table class="styled-table">
<thead>
<tr>
<th>Dimension</th>
<th>Traditional workflow</th>
<th>Agentic workflow</th>
</tr>
</thead>
<tbody>
<tr>
<td>Role of tests</td>
<td>Validate finished code</td>
<td>Specify and constrain the agent</td>
</tr>
<tr>
<td>When tests are written</td>
<td>After implementation, if time allows</td>
<td>Before the agent writes code</td>
</tr>
<tr>
<td>Debugging</td>
<td>Manual analysis, then refactor</td>
<td>Regression test first, then prompted fix</td>
</tr>
<tr>
<td>What reviewers read</td>
<td>The implementation diff</td>
<td>The tests, then the diff</td>
</tr>
<tr>
<td>QA position</td>
<td>End of the cycle</td>
<td>Start of the cycle, encoded as tests</td>
</tr>
</tbody>
</table>
<p>The review change deserves emphasis. An agent can generate 800 lines of plausible React in a minute; no human reviews that honestly. What a human can review is the 60 lines of tests that define what those 800 lines must do. Review the contract, spot-check the implementation. Where the <a href="https://www.macronimous.com/blog/web-development-life-cycle-process-flow-diagram/">web development life cycle</a> used to place QA as a phase, agentic teams place it as a gate: CI runs the full suite on every agent-generated commit, and the agent is simply not allowed to ship red. Budget-wise, the hours you used to spend on post-build QA move upstream into behavior definition. The total testing effort does not shrink. It moves to the front, where it is cheap.</p>
<p>A policy checklist worth adopting before your team&#8217;s next sprint:</p>
<ul class="mac-checklist">
<li>Every agent-built feature starts from tests the agent was given or asked to generate first, committed while still failing</li>
<li>Agents are instructed never to modify existing tests; any test change requires a human commit</li>
<li>No agent-generated PR merges with a red pipeline, no exceptions for &#8220;it works locally&#8221;</li>
<li>Every production bug gets a reproducing regression test before its fix is accepted</li>
<li>Critical user flows (auth, cart, checkout, payments) have end-to-end coverage the agent must keep green</li>
<li>Reviewers read tests first and sign off on behavior, not line-by-line implementation</li>
</ul>
<h2 id="testers-promoted">Your testers just got promoted</h2>
<p>The uncomfortable conclusion for managers: the people on your team who are good at defining expected behavior, edge cases, and failure conditions just became your highest-leverage engineers. That skill used to be undervalued as &#8220;QA work.&#8221; It is now the interface through which your team controls its fastest developer, the agent. The developers who thrive in this model are the ones who can hold the whole behavior of a feature in their head and write it down precisely, which is also the skill we argued matters most in <a href="https://www.macronimous.com/blog/vibe-coding-for-web-developers-amplify-your-flow-state-with-ai/">vibe coding for web developers</a> and in <a href="https://www.macronimous.com/blog/writing-clean-code-with-ai/">writing clean code with AI</a>.</p>
<p>So no, test cases did not die in the age of agentic coding. They stopped being paperwork and became the steering wheel. The teams that treat them that way will let agents run fast safely. The teams that skip them will discover that an agent with no constraints is just a very fast way to write next quarter&#8217;s incident report.</p>
<div class="mac-cta-box">
<h3>Putting agents to work on a real web project?</h3>
<p>We build and manage <a href="https://www.macronimous.com/blog/fluency-without-keystrokes-web-developers-in-the-ai-era/">web development</a> sprints where AI agents do the heavy lifting inside test-gated pipelines, so speed never comes at the cost of stability.</p>
<p><a href="https://www.macronimous.com/agile-web-development/" class="mac-cta-button">Plan a test-gated sprint with us</a>
</div>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/testing-in-agentic-coding/">Testing in Agentic Coding: From Safety Net to Steering Wheel</a> first appeared on <a rel="nofollow" href="https://www.macronimous.com/blog">Macronimous Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.macronimous.com/blog/testing-in-agentic-coding/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Preparing for Agentic Commerce Implementation: A Technical Guide to UCP for Developers</title>
		<link>https://www.macronimous.com/blog/intro-to-ucp-for-developers/</link>
					<comments>https://www.macronimous.com/blog/intro-to-ucp-for-developers/#respond</comments>
		
		<dc:creator><![CDATA[Benny]]></dc:creator>
		<pubDate>Fri, 16 Jan 2026 12:40:16 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[AI Programming]]></category>
		<category><![CDATA[ECommerce Development]]></category>
		<category><![CDATA[Agentic commerce]]></category>
		<category><![CDATA[AI shopping]]></category>
		<category><![CDATA[UCP]]></category>
		<category><![CDATA[UCP for Developers]]></category>
		<guid isPermaLink="false">https://www.macronimous.com/blog/?p=5086</guid>

					<description><![CDATA[<p>January 2026 marks a pivotal shift in the digital commerce landscape with Google&#8217;s launch of the Universal Commerce Protocol (UCP). We are moving from an era where humans browse websites to an era of &#8220;Agentic Commerce,&#8221; where AI agents (like Gemini, ChatGPT, or specialized bots) discover, negotiate, and purchase products on a user&#8217;s behalf. For [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/intro-to-ucp-for-developers/">Preparing for Agentic Commerce Implementation: A Technical Guide to UCP for Developers</a> first appeared on <a rel="nofollow" href="https://www.macronimous.com/blog">Macronimous Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<a href="https://www.macronimous.com/blog/wp-content/uploads/2026/01/Preparing-for-Agentic-Commerce-Implementation.png"><img decoding="async" class="aligncenter wp-image-5089 size-full" src="https://www.macronimous.com/blog/wp-content/uploads/2026/01/Preparing-for-Agentic-Commerce-Implementation.png" alt="" width="1960" height="1103" /></a>
<p>January 2026 marks a pivotal shift in the digital commerce landscape with Google&#8217;s launch of the <a href="https://developers.googleblog.com/under-the-hood-universal-commerce-protocol-ucp/" target="_blank" rel="noopener">Universal Commerce Protocol</a> (UCP). We are moving from an era where humans browse websites to an era of &#8220;Agentic Commerce,&#8221; where <a href="https://www.macronimous.com/blog/the-code-your-ai-wants-to-delete-is-load-bearing/">AI</a> agents (like Gemini, ChatGPT, or specialized bots) discover, negotiate, and purchase products on a user&#8217;s behalf. For development teams at Macronimous and our clients, this means the immediate challenge is mastering <strong>Universal Commerce Protocol implementation</strong>.</p>
<p>If you are a developer I recommend you to give a quick visit to the developers guidelines <a href="https://ucp.dev/specification/overview/" target="_blank" rel="noopener">here</a>.</p>
<p>Instead of building a visual frontend for human eyes, <a href="https://ucp.dev/" target="_blank" rel="noopener">UCP</a> requires us to build standardized API endpoints for AI interpretation. This blog breaks down what UCP is technically, how it impacts the major platforms we support, and the immediate action steps developers need to take.</p>
<h2><strong>The Problem UCP Solves: The &#8220;N x N&#8221; Complexity</strong></h2>
<p>Until now, if an AI assistant wanted to purchase a product from 10,000 different online stores, it would technically require 10,000 custom integrations to understand how each store’s cart, checkout, and inventory systems work. This is unscalable.</p>
<p>UCP acts as a standardized lingua franca. It is an open, RESTful API standard using JSON payloads that allows any e-commerce store to &#8220;speak&#8221; directly to any certified AI agent. It standardizes three core pillars of commerce:</p>
<ol>
<li><strong>Discovery:</strong> How an agent learns what a store sells and what UCP features it supports.</li>
<li><strong>Capabilities Negotiation:</strong> How the agent asks real-time questions like, &#8220;Is SKU-123 in stock?&#8221; or &#8220;Can this be shipped to zip code 90210?&#8221;</li>
<li><strong>Checkout Execution:</strong> A standardized session for securely completing the transaction without the user ever visiting the store&#8217;s domain.</li>
</ol>
<h2><strong>The Developer Paradigm Shift</strong></h2>
<p>For developers used to building traditional Magento or WooCommerce sites, UCP requires a shift in mindset toward &#8220;Headless&#8221; and API-first architectures.</p>
<h3><strong>Key Technical Requirements:</strong></h3>
<ul>
<li><strong>The Discovery Endpoint:</strong> You must implement a .well-known style endpoint. This is where your store declares its supported UCP capabilities (e.g., <em>dev.ucp.shopping.checkout, dev.ucp.shopping.discount</em>).</li>
<li><strong>State Management (The &#8220;Checkout Session&#8221;):</strong> The traditional &#8220;Cart&#8221; object, often tied to a user&#8217;s browser cookie, is replaced by a server-side &#8220;Checkout Session.&#8221; Your backend must be able to create, update, and finalize this session state via API calls from the AI agent.</li>
<li><strong>Security is Paramount:</strong>
<ul>
<li><strong>Request Signing:</strong> Requests coming from agents (like Google) will be cryptographically signed. Your endpoints must verify these signatures to prevent spoofing.</li>
<li><strong>OAuth 2.0:</strong> This is required for &#8220;Account Linking.&#8221; If a user wants the AI agent to use their existing store account and saved addresses, you must implement an OAuth flow to grant the agent permission.</li>
</ul>
</li>
</ul>
<h2><a href="https://www.macronimous.com/blog/wp-content/uploads/2026/01/UCP-for-Developers.jpg"><img loading="lazy" decoding="async" class="aligncenter wp-image-5087 size-large" src="https://www.macronimous.com/blog/wp-content/uploads/2026/01/UCP-for-Developers-1024x687.jpg" alt="UCP for developers" width="1024" height="687" /></a></h2>
<h2><strong>Platform-Specific Impact Matrix</strong></h2>
<p>The effort required for <strong>Universal Commerce Protocol implementation</strong> varies significantly depending on the underlying architecture of the e-commerce platform. Below is a breakdown of how UCP affects the major platforms we support at Macronimous.</p>
<table class="styled-table">
<thead>
<tr>
<td><strong>Platform</strong></td>
<td><strong>Integration Strategy &amp; Effort Level</strong></td>
<td><strong>Technical Considerations for Developers</strong></td>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Shopify</strong></td>
<td><strong>Low Effort (Native/Configuration).</strong> As a launch partner, Shopify&#8217;s integration is largely native. It is activated via the Google &amp; YouTube Sales Channel settings as &#8220;Agentic Checkout.&#8221;</td>
<td>Focus on ensuring product data feeds utilize new native_commerce attributes. Minimal coding required; primarily configuration and data hygiene.</td>
</tr>
<tr>
<td><strong>WooCommerce</strong></td>
<td><strong>Medium Effort (Plugin/Adapter).</strong> Expect official plugins or adapters utilizing the Model Context Protocol (<a href="https://www.macronimous.com/blog/building-a-wordpress-mcp-server-when-the-spec-changed/">MCP</a>) to act as the bridge between UCP and Woo Core.</td>
<td>Developers will need to install, configure, and test these adapters. Key work involves mapping UCP standardized fields (Line Items, Shipping Rates) to WooCommerce internal objects.</td>
</tr>
<tr>
<td><strong><a href="https://www.macronimous.com/blog/magento-react-development/">Magento</a> (Adobe Commerce)</strong></td>
<td><strong>High Effort (Custom Module).</strong> Currently, requires building custom modules to expose UCP-compliant REST endpoints.</td>
<td>You must map the UCP Checkout Session to Magento Quote objects. Crucially, implement aggressive caching strategies for inventory/price checks, as AI agents may poll frequently.</td>
</tr>
<tr>
<td><a href="https://www.macronimous.com/services/ecommerce-development/prestashop-development-india/"><strong>PrestaShop</strong></a></td>
<td><strong>High Effort (Custom Overrides).</strong> Similar to Magento, this requires significant custom development to create the necessary API layer.</td>
<td>Developers will need to override standard controllers to accept and process UCP JSON payloads. Ensure Google Merchant Center feeds are updated to signal UCP eligibility.</td>
</tr>
</tbody>
</table>
<h2><strong>Action Plan for Developers and Technical Leads</strong></h2>
<p>First, you may have to explain this to your clients; while some forward-thinking merchants might already be aware of Agentic Commerce, others will need guidance on why this shift matters. To prepare both your clients and your internal teams for this shift, you need to execute a clear plan, but it is vital to communicate that this is a new integration layer, which implies there is a budget for this additional work. Depending on the platform and specific requirements, you can achieve this implementation either through <strong data-path-to-node="2" data-index-in-node="522">custom code</strong> for bespoke architectures or by leveraging <strong data-path-to-node="2" data-index-in-node="577">commercial and open-source plugins or extensions</strong> for a more streamlined, cost-effective rollout.</p>
<h3><strong>Phase 1: Immediate Prerequisites (Weeks 1-4)</strong></h3>
<ol>
<li><strong>Master the Spec:</strong> Lead developers must review the official UCP specification documentation (available at <em>ucp.devor</em> associated GitHub repos) to understand the required JSON structures.</li>
<li><strong>Data Hygiene is Critical:</strong> UCP relies heavily on data feeds (like Google Merchant Center) to &#8220;match&#8221; user intent to products. Before writing code, ensure client product data is pristine. Missing GTINs, incorrect stock status, or vague descriptions will break the AI discovery process.</li>
<li><strong>Security Infrastructure:</strong> Begin reviewing existing OAuth 2.0 implementations on custom platforms. A successful <strong>Universal Commerce Protocol implementation</strong> hinges on secure request signature verification, so plan the necessary middleware for Magento/PrestaShop now.</li>
</ol>
<h3><strong>Phase 2: Pilot Implementation (Months 2-3)</strong></h3>
<ol>
<li><strong>The &#8220;Hello World&#8221; of UCP:</strong> On a staging environment for a flexible platform (ideally WooCommerce), attempt to implement just the <em>Discovery Endpoint</em>. Verify that an external tool can read your store&#8217;s capabilities.</li>
<li><strong>Rethink the Cart:</strong> Start architecting how your chosen platform handles server-side cart sessions decoupled from browser cookies. This is often the hardest part of <a href="https://www.macronimous.com/blog/is-headless-wordpress-worth-it/">headless</a> implementations.</li>
</ol>
<h2><strong>Conclusion</strong></h2>
<p>UCP is not just another sales channel; it is the infrastructure for the next decade of commerce. By understanding the technical requirements now, <a href="https://www.macronimous.com" target="_blank" rel="noopener">Macronimous</a> can help our clients transition from merely having a website to being fully accessible to the emerging economy of AI agents. The time to start preparing your architecture is today.</p>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/intro-to-ucp-for-developers/">Preparing for Agentic Commerce Implementation: A Technical Guide to UCP for Developers</a> first appeared on <a rel="nofollow" href="https://www.macronimous.com/blog">Macronimous Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.macronimous.com/blog/intro-to-ucp-for-developers/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Future of Software Development: From Fast Builders to Master Verifiers</title>
		<link>https://www.macronimous.com/blog/future-of-software-development/</link>
					<comments>https://www.macronimous.com/blog/future-of-software-development/#respond</comments>
		
		<dc:creator><![CDATA[Benny]]></dc:creator>
		<pubDate>Tue, 30 Dec 2025 05:01:08 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[AI Programming]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Macronimous]]></category>
		<category><![CDATA[PHP Programming]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[Developer Trends]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[web technology]]></category>
		<guid isPermaLink="false">https://www.macronimous.com/blog/?p=5065</guid>

					<description><![CDATA[<p>What does the future of software development in 2026 look like? Looking at the Stack Overflow survey data across 2020, 2023, and 2025, it’s clear we aren&#8217;t just seeing new tools—we are seeing a total re-calibration of how we define &#8220;productivity&#8221; and &#8220;trust.&#8221; As a web agency owner who has navigated every tech shift since [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/future-of-software-development/">Future of Software Development: From Fast Builders to Master Verifiers</a> first appeared on <a rel="nofollow" href="https://www.macronimous.com/blog">Macronimous Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<a href="https://www.macronimous.com/blog/wp-content/uploads/2025/12/From-Builders-to-Verifiers.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-5068 size-large" src="https://www.macronimous.com/blog/wp-content/uploads/2025/12/From-Builders-to-Verifiers-1024x576.png" alt="From Builders to Verifiers" width="1024" height="576" /></a>
<p>What does the <b data-path-to-node="2" data-index-in-node="14">future of software development in 2026</b> look like? Looking at the Stack Overflow survey data across <a href="https://survey.stackoverflow.co/2020" target="_blank" rel="noopener">2020</a>, <a href="https://survey.stackoverflow.co/2023/" target="_blank" rel="noopener">2023</a>, and <a href="https://survey.stackoverflow.co/2025/" target="_blank" rel="noopener">2025</a>, it’s clear we aren&#8217;t just seeing new tools—we are seeing a total re-calibration of how we define &#8220;productivity&#8221; and &#8220;trust.&#8221;</p>
<p>As a web agency owner who has navigated every tech shift since 1998, here is how I see the last five years of evolution:</p>
<h2><strong>2020: The &#8220;Flexible Foundation&#8221; Era</strong></h2>
<p>The industry was in reaction mode. Remote work shifted from a &#8220;perk&#8221; to a &#8220;mandate&#8221; (today, ~32% of devs are still fully remote). <a href="https://www.macronimous.com/blog/replace-javascript-with-css-a-lightweight-approach-to-faster-frontends/">JavaScript</a> was the undisputed king, and we were focused on building the &#8220;digital-first&#8221; world. Tools like Jira were the standard for keeping these new, distributed teams in sync. We were focused on connectivity.</p>
<h2><strong>2023: The &#8220;AI Honeymoon&#8221; Era</strong></h2>
<p>We entered the &#8220;Magic Phase.&#8221; Positive sentiment toward <a href="https://www.macronimous.com/blog/the-code-your-ai-wants-to-delete-is-load-bearing/">AI</a> tools exceeded 70%. <a href="https://www.macronimous.com/blog/vibe-coding-for-web-developers-amplify-your-flow-state-with-ai/">Developers</a> rushed to integrate LLMs, and the focus shifted to sheer speed. Barriers to entry dropped, and we felt like we had superpowers. We were focused on acceleration.</p>
<a href="https://www.macronimous.com/blog/wp-content/uploads/2025/12/stackoverflow-dev-survey-2025-ai-ai-agents-ai-agents-social.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-5066 size-large" src="https://www.macronimous.com/blog/wp-content/uploads/2025/12/stackoverflow-dev-survey-2025-ai-ai-agents-ai-agents-social-1024x512.png" alt="" width="1024" height="512" /></a>
<h2><strong>2025: The &#8220;Cautious Transformation&#8221; Era</strong></h2>
<p>According to the 2025 data, the honeymoon is over. We have entered a mature, sober phase:</p>
<ul>
<li><strong>High Usage, High Skepticism:</strong> AI usage is up to <strong>84%</strong>, but favorable sentiment has dropped to <strong>60%</strong>. The realization? AI is &#8220;frequently almost right,&#8221; leading to frustration for 66% of developers.</li>
<li><strong>The Python Surge:</strong> Python has jumped 7% in a single year (to <strong>9%</strong>), officially becoming the &#8220;connective tissue&#8221; for the AI era.</li>
<li><strong>The Rise of the Architect:</strong> For the first time, &#8220;Architect&#8221; is a top-4 role. We aren&#8217;t just writing code anymore; we are designing systems that can withstand the chaos of <a href="https://www.macronimous.com/blog/intelligent-phone-era/">AI agents</a> and complex infrastructure.</li>
</ul>
<a href="https://www.macronimous.com/blog/wp-content/uploads/2025/12/stackoverflow-dev-survey-2025-ai-developer-tools-ai-explain-social.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-5067 size-large" src="https://www.macronimous.com/blog/wp-content/uploads/2025/12/stackoverflow-dev-survey-2025-ai-developer-tools-ai-explain-social-1024x589.png" alt="" width="1024" height="589" /></a>
<h2><strong>My Perspective as an Agency owner:</strong></h2>
<p><strong> </strong>In 2020,We hired developers who could<a href="https://www.macronimous.com/blog/from-2014-to-2025-common-programming-mistakes-that-still-matter-and-5-new-ones-to-avoid/"> write code fast.</a></p>
<p>In 2023, We looked for developers who used AI to write code faster.</p>
<p>In 2025, We are looking for &#8220;Verifiers.&#8221;</p>
<p>Like it or not &#8211; With 46% of developers now distrusting <a href="https://www.macronimous.com/blog/agile-in-the-age-of-ai-coding/">AI</a> accuracy, the most valuable person in the room is no longer just the coder—it’s the one who can debug the &#8220;almost right&#8221; logic that AI produces.</p>
<h2><strong>The Shift in Analogy:</strong></h2>
<ul>
<li><strong>2020:</strong> We were builders carrying bricks by hand.</li>
<li><strong>2023:</strong> We got heavy machinery (AI) and moved at record speeds.</li>
<li><strong>2025:</strong> We realized the machine sometimes places the bricks slightly crooked. Now, the most important person on the site isn&#8217;t the driver—it’s the inspector with the level and the blueprint.</li>
</ul>
<a href="https://www.macronimous.com/blog/wp-content/uploads/2025/12/2025-Dev-Data-scaled.jpg"><img loading="lazy" decoding="async" class="aligncenter wp-image-5071 size-full" src="https://www.macronimous.com/blog/wp-content/uploads/2025/12/2025-Dev-Data-scaled.jpg" alt="2025 Developer Trends" width="2560" height="1429" /></a>
<h2>Looking Ahead: 2026 and the &#8220;Orchestration Era&#8221;</h2>
<p>As we look toward 2026 and beyond, my prediction is that the current friction of manual verification will become unsustainable. The industry will respond with a new wave of tooling focused not on generation, but on autonomous validation—think AI agents dedicated solely to security auditing, or automated testing suites designed specifically to catch &#8220;LLM hallucinations.&#8221; We will move rapidly from the current &#8220;Verification Era&#8221; into the &#8220;Orchestration Era.&#8221; In this new reality, the most valuable developers won&#8217;t just be checking the AI&#8217;s work; they will be defining the high-level business logic and managing the interplay between multiple specialized AI agents, finally elevating the human role from site inspector to master planner.</p>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/future-of-software-development/">Future of Software Development: From Fast Builders to Master Verifiers</a> first appeared on <a rel="nofollow" href="https://www.macronimous.com/blog">Macronimous Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.macronimous.com/blog/future-of-software-development/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Upgrade Laravel Application: A Laravel 12 Migration Guide for Application Owners</title>
		<link>https://www.macronimous.com/blog/upgrade-laravel-application/</link>
					<comments>https://www.macronimous.com/blog/upgrade-laravel-application/#respond</comments>
		
		<dc:creator><![CDATA[Benny]]></dc:creator>
		<pubDate>Tue, 02 Dec 2025 11:26:54 +0000</pubDate>
				<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[Laravel Development]]></category>
		<category><![CDATA[PHP Development]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[Laravel]]></category>
		<category><![CDATA[platform migration]]></category>
		<guid isPermaLink="false">https://www.macronimous.com/blog/?p=5056</guid>

					<description><![CDATA[<p>Upgrade Laravel Application Stability can be deceptive in software development. If your Laravel application is running smoothly in production, the incentive to touch the codebase is usually low. However, the ecosystem around your application—specifically PHP versions, security patches, and Composer dependencies—is constantly evolving. Staying on Laravel 8, 9, or even 10 might feel &#8220;stable,&#8221; but [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/upgrade-laravel-application/">Upgrade Laravel Application: A Laravel 12 Migration Guide for Application Owners</a> first appeared on <a rel="nofollow" href="https://www.macronimous.com/blog">Macronimous Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><strong><a href="https://www.macronimous.com/blog/wp-content/uploads/2025/12/Upgrade-laravel.png"><img loading="lazy" decoding="async" width="1024" height="576" class="aligncenter size-large wp-image-5057" src="https://www.macronimous.com/blog/wp-content/uploads/2025/12/Upgrade-laravel-1024x576.png" alt="Upgrade Laravel Application" /></a>Upgrade Laravel Application</strong></p>
<p>Stability can be deceptive in software development. If your Laravel application is running smoothly in production, the incentive to touch the codebase is usually low. However, the ecosystem around your application—specifically PHP versions, security patches, and Composer dependencies—is constantly evolving.</p>
<p>Staying on Laravel 8, 9, or even 10 might feel &#8220;stable,&#8221; but it introduces silent risks. You aren&#8217;t just missing out on features; you are accumulating technical debt. With <a href="https://laravel.com/docs/12.x/installation" target="_blank" rel="noopener">Laravel 12</a> pushing the standard to PHP 8.2+, the gap between your current version and modern security standards is widening.</p>
<p>Here is a practical look at why upgrading to the latest stable version is a necessary maintenance step to keep your infrastructure healthy.</p>
<p><strong>The Lifecycle Reality: Why Versions Matter</strong></p>
<p>Laravel releases a major version annually to keep pace with backend technologies. Understanding the support lifecycle is critical for long-term planning.</p>
<p>Here is the current support status:</p>
<table class="styled-table">
<thead>
<tr>
<td><strong>Laravel Version</strong></td>
<td><strong>Release Year</strong></td>
<td><strong>Security Support Until</strong></td>
<td><strong>Status</strong></td>
</tr>
</thead>
<tbody>
<tr>
<td><strong>9 (LTS)</strong></td>
<td>2022</td>
<td>Feb 2025</td>
<td><strong>End of Life Imminent</strong></td>
</tr>
<tr>
<td><strong>10</strong></td>
<td>2023</td>
<td>Aug 2025</td>
<td>Active</td>
</tr>
<tr>
<td><strong>11</strong></td>
<td>2024</td>
<td>Aug 2026</td>
<td>Active</td>
</tr>
<tr>
<td><strong>12</strong></td>
<td>2025</td>
<td>Aug 2027 (Expected)</td>
<td><strong>Recommended</strong></td>
</tr>
</tbody>
</table>
<p><strong>The Risk:</strong> If your application runs on <strong>Laravel 8 or below</strong>, you are operating without security patches. If you are on <strong>Laravel 9</strong>, you have a very short window before official support ends.</p>
<p><strong>Key Technical Benefits of Upgrading</strong></p>
<ol>
<li><strong> Security and Compliance (The Non-Negotiable)</strong></li>
</ol>
<p>Legacy frameworks often rely on older hashing algorithms and session handling methods that modern security standards have surpassed.</p>
<ul>
<li><strong>The Impact:</strong> New releases patch specific vulnerabilities found in the framework core. Upgrading ensures your application meets current compliance requirements for data handling and payment processing.</li>
</ul>
<ol start="2">
<li><strong> Performance Optimization</strong></li>
</ol>
<p>Laravel continuously refactors its core to reduce overhead.</p>
<ul>
<li><strong>Routing &amp; Caching:</strong> Recent versions have significantly optimized the route registration and container resolution processes.</li>
<li><strong>PHP 8.2+ Support:</strong> Laravel 12 runs on PHP 8.2+. This version of PHP offers JIT compilation improvements and better memory management compared to PHP 7.4 or 8.0.</li>
<li><strong>Result:</strong> For high-traffic applications or API-heavy backends, this translates to lower latency and reduced server resource consumption.</li>
</ul>
<ol start="3">
<li><strong> Reducing Maintenance Costs (Technical Debt)</strong></li>
</ol>
<p>The longer you wait to upgrade, the harder it becomes. Skipping from Laravel 8 directly to 12 is a painful, complex migration that often requires rewriting large chunks of code due to &#8220;breaking changes&#8221; accumulated over four years.</p>
<ul>
<li><strong>The Strategy:</strong> Incremental upgrades are predictable and low-risk. Delayed upgrades often turn into expensive &#8220;rescue projects.&#8221;</li>
</ul>
<ol start="4">
<li><strong> Developer Experience &amp; Modern Tooling</strong></li>
</ol>
<p>Upgrading allows your development team to utilize modern architectural patterns, making the <a href="https://www.macronimous.com/blog/from-2014-to-2025-common-programming-mistakes-that-still-matter-and-5-new-ones-to-avoid/">codebase</a> easier to maintain.</p>
<ul>
<li><strong>Laravel 12 Features:</strong> Includes cleaner API structures, improved job queue handling, and native support for modern frontend stacks (<a href="https://www.macronimous.com/blog/boost-react-performance-with-server-components-and-server-actions/">React</a>/Vue).</li>
<li><strong>AuthKit:</strong> simplifies complex authentication flows like SSO and Passkeys, which are becoming standard user expectations.</li>
</ul>
<p><strong>When is an Upgrade Urgent?</strong></p>
<p>You should prioritize this migration if:</p>
<ul>
<li><strong>Hosting Compatibility:</strong> Your hosting provider is deprecating older PHP versions (many are dropping PHP 8.0 support).</li>
<li><strong>Dependency Hell:</strong> You cannot install new packages because they require a newer version of illuminate/support.</li>
<li><strong>New Feature Development:</strong> You are planning a sprint for new features. Building new code on top of a legacy framework is inefficient.</li>
</ul>
<p><strong>The Upgrade Strategy</strong></p>
<p>We don&#8217;t recommend &#8220;blind upgrades.&#8221; At <a href="https://www.macronimous.com/services/outsource-php-development/laravel-development-company/" target="_blank" rel="noopener"><strong>Macronimous</strong></a>, we treat upgrades as a structured engineering process:</p>
<ol>
<li><strong>Dependency Audit:</strong> We analyze c<em>omposer.json</em> to identify packages that have been abandoned or need replacement.</li>
<li><strong>Phased Migration:</strong> We step through versions sequentially (e.g., v9 ? v10 ? v11) to isolate breaking changes.</li>
<li><strong>Automated &amp; Manual Testing:</strong> We run your test suite (Unit/Feature tests) and perform manual regression testing on critical flows.</li>
<li><strong>Performance Benchmarking:</strong> We compare response times before and after deployment to ensure the upgrade delivered the expected speed gains.</li>
</ol>
<p><strong>Conclusion</strong></p>
<p data-path-to-node="32">Upgrading Laravel is not about chasing the &#8220;shiny new thing.&#8221; It is about infrastructure integrity. It ensures your application remains secure, fast, and compatible with the modern web.</p>
<p data-path-to-node="33">At the outset, it may look like too much work—especially when your current site is running fine. But trust me, it is worth it.</p>
<p data-path-to-node="34">If your application is running on a version older than Laravel 10, now is the time to plan your migration path.</p>
<p data-path-to-node="34"><b>Need a technical assessment of your current stack?</b> <a href="https://www.macronimous.com/contact-us/">Contact us</a> to discuss a migration plan that minimizes downtime.</p>
<p>&nbsp;</p>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/upgrade-laravel-application/">Upgrade Laravel Application: A Laravel 12 Migration Guide for Application Owners</a> first appeared on <a rel="nofollow" href="https://www.macronimous.com/blog">Macronimous Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.macronimous.com/blog/upgrade-laravel-application/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>From 2014 to 2025: Common Programming Mistakes That Still Matter — and 5 New Ones to Avoid</title>
		<link>https://www.macronimous.com/blog/from-2014-to-2025-common-programming-mistakes-that-still-matter-and-5-new-ones-to-avoid/</link>
					<comments>https://www.macronimous.com/blog/from-2014-to-2025-common-programming-mistakes-that-still-matter-and-5-new-ones-to-avoid/#respond</comments>
		
		<dc:creator><![CDATA[Benny]]></dc:creator>
		<pubDate>Thu, 30 Oct 2025 04:27:03 +0000</pubDate>
				<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[PHP Development]]></category>
		<category><![CDATA[PHP Programming]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[PHP best practices]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[Web development]]></category>
		<guid isPermaLink="false">https://www.macronimous.com/blog/?p=4895</guid>

					<description><![CDATA[<p>Back in 2014, we wrote about 10 programming taboos you should break immediately. At that time, topics like version control, commenting code, and not skipping testing were the hot issues for developers. Fast-forward to 2025 — many of those lessons still hold true. But the context has changed. Cloud-native development, DevOps culture, AI-assisted coding, and global [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/from-2014-to-2025-common-programming-mistakes-that-still-matter-and-5-new-ones-to-avoid/">From 2014 to 2025: Common Programming Mistakes That Still Matter — and 5 New Ones to Avoid</a> first appeared on <a rel="nofollow" href="https://www.macronimous.com/blog">Macronimous Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<a href="https://www.macronimous.com/blog/wp-content/uploads/2025/10/Programming-mistakes.png"><img loading="lazy" decoding="async" width="1024" height="576" class="aligncenter size-large wp-image-4990" src="https://www.macronimous.com/blog/wp-content/uploads/2025/10/Programming-mistakes-1024x576.png" alt="Programming Mistakes" /></a>
<p>Back in 2014, we wrote about <a href="https://www.macronimous.com/blog/10-programming-taboos-you-should-break-immediately/">10 programming taboos you should break immediately</a>. At that time, topics like version control, commenting code, and not skipping testing were the hot issues for developers.</p>
<p>Fast-forward to 2025 — many of those lessons still hold true. But the context has changed. Cloud-native development, DevOps culture, AI-assisted coding, and global security concerns have added new dimensions to what we consider “taboos.”</p>
<p>Let’s revisit the old list, see what still applies, and then look at the new taboos every developer should avoid today.</p>
<h2><strong>The Classic 10 (2014) — Still Relevant</strong></h2>
<p>Here’s a quick refresher of the original 10 taboos from 2014:</p>
<ol>
<li>Not honing non-technical skills — soft skills, empathy, communication.</li>
<li>Not being judicious about coding — reinventing the wheel, ignoring templates/libraries.</li>
<li>Not keeping code understandable — bad naming, no comments, confusing flow.</li>
<li>Not using proven tools/techniques — poor error handling, empty catch blocks.</li>
<li>Poor version control — missing commits, bad commit messages, no sync.</li>
<li>Not keeping oneself updated — lack of training, slow to adopt new trends.</li>
<li>Inadequate testing — ignoring unit, mock, and integration tests.</li>
<li>Security lapses — input validation, SQL injection, XSS, CSRF.</li>
<li>Poor client communication — silence until delivery, reactive updates.</li>
<li>Cutting corners under deadlines — sacrificing quality for speed.</li>
</ol>
<h3><strong>What Changed?</strong></h3>
<p>Still true: All 10 remain valid — they’re like “coding commandments.”<br />
Changed in emphasis:</p>
<ul>
<li>Version control ? From SVN/Mercurial to Git/GitHub/GitLab.</li>
<li>Testing ? Now expected as automated pipelines in CI/CD.</li>
<li>Security ? Threats are wider (APIs, cloud misconfigs, supply chain attacks).</li>
<li>Keeping updated ? Today this means DevOps, <a href="https://www.macronimous.com/blog/the-code-your-ai-wants-to-delete-is-load-bearing/">AI</a> tools, and cloud-native design.</li>
</ul>
<p>In other words: the principles haven’t aged — the tools and risks around them have.</p>
<h2><strong>The 5 New Programming Taboos of 2025</strong></h2>
<ol>
<li><strong> Ignoring Accessibility (the new “responsive design”)</strong></li>
</ol>
<p>In 2014, <a href="https://www.macronimous.com/blog/what-experts-say-about-responsive-web-design-and-why/">responsive design</a> was the buzzword. By 2025, accessibility is no longer optional. Over 1.3 billion people worldwide live with some form of disability (WHO). Accessibility lawsuits have risen steadily — in the U.S. alone, over 4,600 ADA website lawsuits were filed in 2023. Poor accessibility means you alienate real users and risk legal challenges.</p>
<p><strong>Taboo:</strong> Shipping a product that only “works on your machine” but leaves out users with screen readers, keyboard navigation, or color blindness.</p>
<ol start="2">
<li><strong> Skipping Dependency Security</strong></li>
</ol>
<p>Most modern apps are built on hundreds of open-source packages. A single vulnerability can compromise the whole system. The <a href="https://www.searchenginejournal.com/log4j-security-fail/429821/" target="_blank" rel="nofollow noopener">2021 Log4j</a> vulnerability exposed millions of apps worldwide. Studies show 80–90% of modern codebases are made up of third-party components. Attackers increasingly target supply chains (npm, PyPI, Composer) rather than your core code.</p>
<p><strong>Taboo:</strong> Not running automated security scans (<a href="https://www.google.com/aclk?sa=L&amp;ai=DChsSEwjgzbHmxcmQAxV0pWYCHb73OHoYACICCAEQABoCc20&amp;co=1&amp;ase=2&amp;gclid=Cj0KCQjw9obIBhCAARIsAGHm1mSxOy-IzSLkZkve24VODStRmOk992AF436Ug5iGav42cOJhQlffbGAaAnOTEALw_wcB&amp;cid=CAASrwHkaBY05CotDETTnSa2r8Y0XN5dCv-RlELCVCf9_XnUgrI6TjaQ-xRr1Qbuxs1Q5wl_ATn1B4Fm2ioM32TVLsHvkbpBc_q8lmF8sUrHQV-r0aYhNHqVXcM2ECsyZNDyjuok2b7VSawUqGNrhuCHkdypDX3MrEGXfAwuGRDVTHIDwA_ppVqEhRRHjb7Al8PFqNV_31mbngfSvsV3uRmAiutezeXvXlpEugG1SsB45iWk&amp;cce=2&amp;category=acrcp_v1_32&amp;sig=AOD64_34rfIEgeCJ04wy-KNsAuI7CWaIxA&amp;q&amp;nis=4&amp;adurl&amp;ved=2ahUKEwj2mqvmxcmQAxWFcGwGHe3kF8MQ0Qx6BAgbEAE" target="_blank" rel="noopener">Snyk</a>, <a href="https://docs.github.com/en/code-security/getting-started/dependabot-quickstart-guide" target="_blank" rel="nofollow noopener">Dependabot</a>, <a href="https://www.geeksforgeeks.org/node-js/what-is-npm-audit/" target="_blank" rel="nofollow noopener">npm audit</a>) or ignoring patch updates.</p>
<ol start="3">
<li><strong> Overlooking CI/CD and Automation</strong></li>
</ol>
<p>In 2014, “inadequate testing” meant skipping unit tests. Today, the taboo is larger: not automating the entire flow. Teams that adopt CI/CD pipelines deploy 200x more frequently with far fewer failures (DORA State of DevOps report). Manual builds, deployments, and tests are now considered wasteful and risky.</p>
<p><strong>Taboo:</strong> Relying on manual QA and deployment when tools like <a href="https://docs.openedx.org/en/latest/developers/references/developer_guide/testing/github-actions.html" target="_blank" rel="nofollow noopener">GitHub Actions</a>, <a href="https://docs.gitlab.com/ci/" target="_blank" rel="nofollow noopener">GitLab CI</a>, <a href="https://docs.gitlab.com/integration/jenkins/" target="_blank" rel="nofollow noopener">Jenkins</a>, or <a href="https://circleci.com/" target="_blank" rel="nofollow noopener">CircleCI</a> can handle it safely and repeatedly.</p>
<ol start="4">
<li><strong> Neglecting Observability</strong></li>
</ol>
<p>In the past, a few log files were enough. Not anymore. Today’s systems are distributed — microservices, cloud functions, APIs across regions. Without logs, metrics, and traces, debugging becomes a needle-in-haystack problem. Gartner reports that 70% of outages in cloud-native systems take longer to fix due to poor observability.</p>
<p><strong>Taboo:</strong> Shipping code without proper logging, monitoring, or alerting (using tools like <a href="https://opentelemetry.io/" target="_blank" rel="nofollow noopener">OpenTelemetry,</a> <a href="https://learn.microsoft.com/en-us/azure/partner-solutions/datadog/overview" target="_blank" rel="nofollow noopener">Datadog</a>, <a href="https://sentry.io/" target="_blank" rel="nofollow noopener">Sentry,</a> <a href="https://prometheus.io/" target="_blank" rel="nofollow noopener">Prometheus</a>).</p>
<ol start="5">
<li><strong> Blindly Trusting AI-Generated Code</strong></li>
</ol>
<p>In 2014, the closest thing we had to “AI help” was Stack Overflow. In 2025, AI assistants (<a href="https://github.com/features/copilot" target="_blank" rel="nofollow noopener">GitHub Copilot</a>, <a href="https://chatgpt.com/" target="_blank" rel="nofollow noopener">ChatGPT</a>, <a href="https://www.tabnine.com/" target="_blank" rel="nofollow noopener">Tabnine</a>) write large chunks of code. A Stanford study found that developers using AI assistants wrote code faster, but introduced 40% more<a href="https://www.macronimous.com/blog/wordpress-security-issues/"> security vulnerabilities</a> when unchecked. AI can hallucinate APIs, misuse libraries, or produce inefficient code.</p>
<p><strong>Taboo:</strong> Treating AI as autopilot. The right approach is using AI as a pair programmer — review everything, add tests, and validate against business requirements.</p>
<p><strong>Old vs New: How They Fit Together</strong></p>
<table class="styled-table">
<thead>
<tr>
<th><strong>2014 Taboo</strong></th>
<th><strong>2025 Reality</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>Poor client communication</td>
<td>Still true — but now clients expect dashboards, Agile ceremonies, async updates.</td>
</tr>
<tr>
<td>Inadequate testing</td>
<td>Expanded into “no CI/CD or test automation.”</td>
</tr>
<tr>
<td>Security lapses</td>
<td>Broader: supply-chain security, API protection, cloud misconfigs.</td>
</tr>
<tr>
<td>Not keeping updated</td>
<td>Now means staying current with DevOps, cloud, AI, accessibility.</td>
</tr>
<tr>
<td>Not honing soft skills</td>
<td>Even more critical with remote-first, cross-cultural teams.</td>
</tr>
</tbody>
</table>
<p>The old list covered the foundations. The new list highlights modern realities that didn’t exist (or weren’t mainstream) in 2014.</p>
<p><strong>Wrapping Up</strong></p>
<p>When we first published <a href="https://www.macronimous.com/blog/10-programming-taboos-you-should-break-immediately/">10 programming taboos you should break immediately</a>, they felt like reminders to programmers of the “basics.” Ten years later, they still do. But the field has matured, and so have the mistakes.</p>
<p>The new taboos — accessibility, dependency security, automation, observability, and AI misuse — reflect the world we build software in today: cloud-native, AI-driven, and global.</p>
<p>The lesson is clear: Good coding isn’t just about syntax. It’s about responsibility — to your team, your clients, and your users.</p>
<p>&nbsp;</p>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/from-2014-to-2025-common-programming-mistakes-that-still-matter-and-5-new-ones-to-avoid/">From 2014 to 2025: Common Programming Mistakes That Still Matter — and 5 New Ones to Avoid</a> first appeared on <a rel="nofollow" href="https://www.macronimous.com/blog">Macronimous Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.macronimous.com/blog/from-2014-to-2025-common-programming-mistakes-that-still-matter-and-5-new-ones-to-avoid/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>PHP MCP Server: A PHP Developer&#8217;s Guide to the Model Context Protocol</title>
		<link>https://www.macronimous.com/blog/mcp-for-php-development/</link>
					<comments>https://www.macronimous.com/blog/mcp-for-php-development/#respond</comments>
		
		<dc:creator><![CDATA[Benny]]></dc:creator>
		<pubDate>Thu, 14 Aug 2025 07:37:46 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[AI Programming]]></category>
		<category><![CDATA[Laraval Development]]></category>
		<category><![CDATA[PHP Development]]></category>
		<category><![CDATA[AI in web development]]></category>
		<category><![CDATA[AI web development]]></category>
		<category><![CDATA[MCP]]></category>
		<category><![CDATA[MCP for PHP development]]></category>
		<guid isPermaLink="false">https://www.macronimous.com/blog/?p=4813</guid>

					<description><![CDATA[<p>A PHP MCP server is a PHP application that exposes tools, resources, and prompts to AI clients through the Model Context Protocol (MCP). In 2026 you build one with the official mcp/sdk package or, in a Laravel app, with laravel/mcp. Since the 2026-07-28 revision made MCP stateless, every call is an ordinary HTTP request, which [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/mcp-for-php-development/">PHP MCP Server: A PHP Developer&#8217;s Guide to the Model Context Protocol</a> first appeared on <a rel="nofollow" href="https://www.macronimous.com/blog">Macronimous Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<a href="https://www.macronimous.com/blog/wp-content/uploads/2025/08/MCP-for-PHP-development.png"><img loading="lazy" decoding="async" width="2240" height="1260" src="https://www.macronimous.com/blog/wp-content/uploads/2025/08/MCP-for-PHP-development.png" alt="MCP for PHP development" class="aligncenter size-full wp-image-4876" /></a>
<div class="mac-direct-answer">
<p><strong>A PHP <a href="https://www.macronimous.com/blog/building-a-wordpress-mcp-server-when-the-spec-changed/">MCP</a> server</strong> is a PHP application that exposes tools, resources, and prompts to <a href="https://www.macronimous.com/blog/the-code-your-ai-wants-to-delete-is-load-bearing/">AI</a> clients through the Model Context Protocol (MCP). In 2026 you build one with the official <code>mcp/sdk</code> package or, in a Laravel app, with <code>laravel/mcp</code>. Since the 2026-07-28 revision made MCP stateless, every call is an ordinary HTTP request, which is how PHP has always worked.</p>
</div>
<div class="mac-toc">
<p class="mac-toc-title">In this post</p>
<ul>
<li><a href="#what-changed">What changed since the first version</a></li>
<li><a href="#what-it-exposes">What a PHP MCP server exposes</a></li>
<li><a href="#stateless-php">Why the stateless spec suits PHP</a></li>
<li><a href="#wire-format">What a tool call looks like on the wire</a></li>
<li><a href="#official-sdk">Build one in plain PHP with the official SDK</a></li>
<li><a href="#laravel-mcp">Build one in Laravel with laravel/mcp</a></li>
<li><a href="#mcp-vs-rest">MCP vs REST vs GraphQL</a></li>
<li><a href="#security">Security: what I&#8217;d lock down first</a></li>
<li><a href="#where-id-wait">Where I&#8217;d wait</a></li>
<li><a href="#faq">FAQ</a></li>
</ul>
</div>
<p><em>Update, October 2026:</em> I first published this post in August 2025. It aged badly, and fast. About three weeks after it went up, the PHP Foundation, Symfony, and Anthropic&#8217;s MCP team <a href="https://thephp.foundation/blog/2025/09/05/php-mcp-sdk/" target="_blank" rel="noopener">announced an official PHP SDK</a>, which made both packages I&#8217;d recommended the wrong place to start. Then in July 2026 the protocol itself changed shape. So I&#8217;ve thrown out the old version and written this one from scratch. (The URL is the same. Almost nothing else is.)</p>
<p>If you write PHP for a living and somebody has asked you to &#8220;make the app work with AI agents,&#8221; this is what I&#8217;d tell you over coffee.</p>
<h2 id="what-changed">What changed since the first version</h2>
<p>Four things, and I&#8217;ll go through them in the order they hurt.</p>
<ul>
<li><strong>There&#8217;s an official SDK now.</strong> It&#8217;s <a href="https://github.com/modelcontextprotocol/php-sdk" target="_blank" rel="noopener"><code>mcp/sdk</code></a>, it grew out of Kyrian Obikwelu&#8217;s PHP-MCP project and the Symfony AI work, and the Symfony team leads maintenance. It covers servers <em>and</em> clients. It&#8217;s also still pre-1.0, and the README says &#8220;experimental&#8221; in plain words, so pin your version.</li>
<li><strong>Laravel ships its own package.</strong> <a href="https://laravel.com/docs/mcp" target="_blank" rel="noopener"><code>laravel/mcp</code></a> is first-party, documented alongside the framework, and comes with Artisan generators, a test API, and an MCP client.</li>
<li><strong>The protocol went stateless.</strong> The <a href="https://modelcontextprotocol.io/specification/2026-07-28" target="_blank" rel="noopener">2026-07-28 revision</a> removed the opening handshake and the protocol-level session. More on this below, because for PHP it&#8217;s the big one.</li>
<li><strong>Authorization grew up.</strong> OAuth 2.1 is the mechanism the spec documents. A bearer token still works with plenty of clients, but &#8220;use an API token&#8221; (which is all I said last time) isn&#8217;t the whole answer anymore.</li>
</ul>
<p>And one correction I owe you. The JSON example in the old post called a method named <code>tool</code>. There&#8217;s no such method. It&#8217;s <code>tools/call</code>, and it was <code>tools/call</code> back then too. Sorry about that.</p>
<h2 id="what-it-exposes">What a PHP MCP server exposes</h2>
<p>This part hasn&#8217;t changed, so I&#8217;ll keep it short. A server offers three kinds of things to an AI client.</p>
<p><strong>Tools</strong> are functions the model can call: create a project, send an invoice, look up an order. <strong>Resources</strong> are read-only data the client can pull in as context, addressed by a URI. <strong>Prompts</strong> are reusable templates the server hands to the client.</p>
<p>Start with tools. In the servers we&#8217;ve built, tools did nearly all the useful work, and resources came a distant second. I&#8217;d leave prompts until a real user asks for one.</p>
<h2 id="stateless-php">Why the stateless spec suits PHP</h2>
<p>Until this summer, MCP over HTTP was a conversation. The client opened with an <code>initialize</code> handshake, the server handed back a session ID, and every later request had to carry that ID so the server could remember who it was talking to.</p>
<p>That&#8217;s fine in Node or Python, where one long-lived process sits in memory holding the session. It&#8217;s a nuisance in PHP, because PHP-FPM on an ordinary host gives you a fresh process for each request that remembers nothing, which meant you needed a session store (files on one server, Redis on several), and then you needed the load balancer to cooperate, and then somebody&#8217;s shared hosting plan killed the long-running stream the server wanted to keep open, and at that point a perfectly sane developer would ask why a remote procedure call needed all this furniture.</p>
<p>The 2026-07-28 revision removes the furniture. There&#8217;s no handshake and no protocol session. Each request carries its own protocol version and client details, any worker on any machine can answer it, and list results come with cache hints. Cloudflare, AWS, and the MCP maintainers all describe it the same way: MCP now scales like any other HTTP API.</p>
<div class="mac-key-point">
<p>PHP got teased for twenty years for forgetting everything between requests. The protocol has now adopted that as its design.</p>
</div>
<p>What if your server really does need to remember something, like a cart or a half-finished import? The spec&#8217;s guidance is to return a handle from one tool and accept it as an argument on the next. In other words, a primary key. We&#8217;ve been doing that since PHP 3.</p>
<p>There&#8217;s a cost, and you should hear it from me before you hear it from a client. The new revision isn&#8217;t backward compatible. A server that only speaks 2026-07-28 may not work with an older client, and the reverse. So for a while you&#8217;ll be supporting both eras, and that&#8217;s a good reason to use an SDK instead of hand-rolling the JSON. (We hand-rolled once. I wrote up what happened in <a href="https://www.macronimous.com/blog/building-a-wordpress-mcp-server-when-the-spec-changed/">building a WordPress MCP server while the spec changed</a>.)</p>
<h2 id="wire-format">What a tool call looks like on the wire</h2>
<p>MCP messages are JSON-RPC 2.0, a small remote procedure call format where every message names a method and carries an ID. Here&#8217;s a client asking a server to run a tool.</p>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": {
    "name": "create_project",
    "arguments": {
      "project_name": "New Website Launch",
      "due_date": "2026-12-31"
    },
    "_meta": {
      "io.modelcontextprotocol/protocolVersion": "2026-07-28"
    }
  }
}</pre><p>&nbsp;</p>
<p>I&#8217;ve trimmed the <code>_meta</code> block. The spec requires client info and client capabilities in there too, and your SDK fills them in. On HTTP, the client also sends <code>MCP-Protocol-Version</code>, <code>Mcp-Method</code>, and <code>Mcp-Name</code> headers, so a load balancer or firewall can route the call without opening the body. If you&#8217;ve ever fought a web application firewall over a JSON payload (I have, on our own host), you&#8217;ll like that.</p>
<p>The server answers like this.</p>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">{
  "jsonrpc": "2.0",
  "id": 2,
  "result": {
    "resultType": "complete",
    "content": [
      { "type": "text", "text": "Created project 42: New Website Launch" }
    ],
    "structuredContent": { "project_id": 42, "name": "New Website Launch" },
    "isError": false
  }
}</pre><p>&nbsp;</p>
<p>Two details matter. <code>structuredContent</code> is the machine-readable result, and the text block is the fallback for clients that only read text. And when your business logic fails, say the due date is in the past, you return a normal result with <code>isError</code> set to <code>true</code> and a message the model can act on. Save real JSON-RPC errors for broken requests and unknown tools.</p>
<h2 id="official-sdk">Build one in plain PHP with the official SDK</h2>
<p>This works in any PHP project: plain PHP, CodeIgniter, Slim, a legacy app with no framework at all. The steps below build a local server that talks over STDIO (standard input and output, the way a desktop AI client starts a server as a child process).</p>
<p><strong>Goal.</strong> A PHP file exposes one tool named <code>create_project</code>, and MCP Inspector can call it.</p>
<p><strong>Before you start.</strong> You need Composer and Node.js installed. Check the PHP version the SDK requires on its Packagist page before you install.</p>
<p><strong>Step 1: Install the SDK.</strong> Run this command in an empty project folder. Composer prints the installed version when it finishes.</p>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">composer require mcp/sdk</pre><p>&nbsp;</p>
<p><strong>Step 2: Create the server file.</strong> Save this code as <code>server.php</code> in the same folder. The tool body is a stub, so replace it with a call to your own service class later.</p>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">&lt;?php

require __DIR__ . '/vendor/autoload.php';

use Mcp\Server;
use Mcp\Server\Transport\StdioTransport;

class ProjectTools
{
    /**
     * Create a project and return its ID.
     */
    public function createProject(string $projectName, string $dueDate): array
    {
        // Call your existing service class here.
        return ['project_id' =&gt; 42, 'name' =&gt; $projectName, 'due_date' =&gt; $dueDate];
    }
}

$server = Server::builder()
    -&gt;setServerInfo('Project Server', '1.0.0')
    -&gt;addTool([ProjectTools::class, 'createProject'], 'create_project')
    -&gt;build();

$server-&gt;run(new StdioTransport());</pre><p>&nbsp;</p>
<p><strong>Step 3: Open the server in MCP Inspector.</strong> MCP Inspector is the official browser tool for testing a server by hand. Replace the path with the full path to your <code>server.php</code>.</p>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">npx @modelcontextprotocol/inspector php /Users/YOU/project-server/server.php</pre><p>&nbsp;</p>
<p><strong>Check.</strong> The Inspector&#8217;s Tools tab lists <code>create_project</code> with two string inputs. You run it, and the result shows <code>project_id</code> 42.</p>
<p><strong>If it fails.</strong> The usual cause is stray output. On STDIO, anything your script prints (a warning, a debug <code>echo</code>, a byte order mark) lands in the protocol stream and breaks it. Send logs to a file or to standard error.</p>
<p><strong>Undo.</strong> Delete the project folder. Nothing else on your machine changed.</p>
<p>For a remote server you swap the transport for the SDK&#8217;s <code>StreamableHttpTransport</code>, which takes a PSR-7 request (the standard PHP interface for an HTTP message) and returns a response. The <a href="https://github.com/modelcontextprotocol/php-sdk/blob/main/docs/transports.md" target="_blank" rel="noopener">transports guide</a> has the wiring. Read the protocol versions page while you&#8217;re there. As far as I can tell from the repository, support for the stateless revision has been landing release by release, so check what your installed version speaks before you promise a client anything.</p>
<h2 id="laravel-mcp">Build one in Laravel with laravel/mcp</h2>
<p>If the app is Laravel, don&#8217;t use the plain SDK. Use the first-party package. You get the container, validation, policies, and middleware you already know, and the tool class ends up looking like a small controller.</p>
<p><strong>Goal.</strong> Your Laravel app serves an authenticated MCP endpoint at <code>/mcp/projects</code> with one tool that creates a project.</p>
<p><strong>Before you start.</strong> The package needs PHP 8.2 or newer and Laravel 11, 12, or 13. The steps assume Sanctum (Laravel&#8217;s token authentication package) is already installed, and that you have a <code>ProjectService</code> class and a <code>Project</code> policy. Swap in your own names.</p>
<p><strong>Step 1: Install the package.</strong></p>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">composer require laravel/mcp</pre><p>&nbsp;</p>
<p><strong>Step 2: Publish the routes file.</strong> This command creates <code>routes/ai.php</code>, where MCP servers are registered.</p>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">php artisan vendor:publish --tag=ai-routes</pre><p>&nbsp;</p>
<p><strong>Step 3: Generate the server class.</strong> The file appears in <code>app/Mcp/Servers</code>.</p>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">php artisan make:mcp-server ProjectServer</pre><p>&nbsp;</p>
<p><strong>Step 4: Generate the tool class.</strong> The file appears in <code>app/Mcp/Tools</code>.</p>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">php artisan make:mcp-tool CreateProjectTool</pre><p>&nbsp;</p>
<p><strong>Step 5: Write the tool.</strong> Replace the generated tool with this code. Notice the order: authorize, validate, then call the service.</p>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">&lt;?php

namespace App\Mcp\Tools;

use App\Models\Project;
use App\Services\ProjectService;
use Illuminate\Contracts\JsonSchema\JsonSchema;
use Laravel\Mcp\Request;
use Laravel\Mcp\Response;
use Laravel\Mcp\Server\Attributes\Description;
use Laravel\Mcp\Server\Tool;

#[Description('Creates a project for the signed-in user. Needs a name and a due date.')]
class CreateProjectTool extends Tool
{
    public function handle(Request $request, ProjectService $projects): Response
    {
        if (! $request-&gt;user()-&gt;can('create', Project::class)) {
            return Response::error('Permission denied.');
        }

        $validated = $request-&gt;validate([
            'project_name' =&gt; 'required|string|max:120',
            'due_date' =&gt; 'required|date|after:today',
        ]);

        $project = $projects-&gt;create($request-&gt;user(), $validated);

        return Response::structured([
            'project_id' =&gt; $project-&gt;id,
            'name' =&gt; $project-&gt;name,
        ]);
    }

    public function schema(JsonSchema $schema): array
    {
        return [
            'project_name' =&gt; $schema-&gt;string()
                -&gt;description('The project name.')
                -&gt;required(),
            'due_date' =&gt; $schema-&gt;string()
                -&gt;description('The due date as YYYY-MM-DD.')
                -&gt;required(),
        ];
    }
}</pre><p>&nbsp;</p>
<p><strong>Step 6: Register the tool on the server.</strong> Open <code>app/Mcp/Servers/ProjectServer.php</code> and set the <code>$tools</code> property.</p>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">protected array $tools = [
    \App\Mcp\Tools\CreateProjectTool::class,
];</pre><p>&nbsp;</p>
<p><strong>Step 7: Register the route.</strong> Put this code in <code>routes/ai.php</code>. The <code>throttle:mcp</code> middleware expects a rate limiter named <code>mcp</code>, so define one in your <code>AppServiceProvider</code> or remove that entry.</p>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">&lt;?php

use App\Mcp\Servers\ProjectServer;
use Laravel\Mcp\Facades\Mcp;

Mcp::web('/mcp/projects', ProjectServer::class)
    -&gt;middleware(['auth:sanctum', 'throttle:mcp']);</pre><p>&nbsp;</p>
<p><strong>Step 8: Open the server in MCP Inspector.</strong> Add your Sanctum token as an <code>Authorization: Bearer</code> header when the Inspector asks for connection settings.</p>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">php artisan mcp:inspector mcp/projects</pre><p>&nbsp;</p>
<p><strong>Check.</strong> The Inspector lists <code>create-project</code> (Laravel derives the name from the class). You call it with a past date, and the tool returns your validation message instead of creating anything.</p>
<p><strong>If it fails.</strong> A 401 response means the token header is missing or the token is wrong. An empty tool list means Step 6 was skipped.</p>
<p><strong>Undo.</strong> Remove the route from <code>routes/ai.php</code>. The endpoint stops existing on the next request.</p>
<p>One thing I&#8217;d do before any of this reaches production: write the validation messages for a machine reader. When validation fails, the model reads your error text and tries again, so &#8220;The due date must be a future date in YYYY-MM-DD format&#8221; gets you a correct retry and &#8220;Invalid input&#8221; gets you a loop. (Laravel&#8217;s type handling has its own traps here. We wrote about one in <a href="https://www.macronimous.com/blog/laravel-data-type-casting-int-cast-as-str/">integers arriving as strings</a>.)</p>
<h2 id="mcp-vs-rest">MCP vs REST vs GraphQL</h2>
<p>I get asked whether MCP replaces the REST API. No. They have different callers.</p>
<table class="styled-table">
<thead>
<tr>
<th>Question</th>
<th>REST</th>
<th>GraphQL</th>
<th>MCP</th>
</tr>
</thead>
<tbody>
<tr>
<td>Who calls it?</td>
<td>Your frontend or a partner&#8217;s code</td>
<td>Your frontend</td>
<td>An AI model, through a client app</td>
</tr>
<tr>
<td>Who decides what to call?</td>
<td>A developer, at build time</td>
<td>A developer, at build time</td>
<td>The model, at run time</td>
</tr>
<tr>
<td>How does the caller learn the API?</td>
<td>Docs or an OpenAPI file</td>
<td>Schema introspection</td>
<td><code>tools/list</code>, with descriptions written for a model</td>
</tr>
<tr>
<td>Message format</td>
<td>HTTP verbs and URLs</td>
<td>A query language over HTTP</td>
<td>JSON-RPC 2.0 over STDIO or HTTP</td>
</tr>
<tr>
<td>State</td>
<td>Stateless</td>
<td>Stateless</td>
<td>Stateless since 2026-07-28</td>
</tr>
<tr>
<td>Typical endpoint count</td>
<td>Many</td>
<td>One</td>
<td>One per server</td>
</tr>
</tbody>
</table>
<p>The row that matters is the second one. With REST, a programmer read your docs and decided which endpoint to hit. With MCP, a model reads your tool descriptions and decides on the spot. So the description is part of the interface, and a vague one is a bug.</p>
<p>Don&#8217;t write the logic twice, though. Your MCP tool and your REST controller should call the same service class. If your controllers are fat and the logic lives in them, fix that first. It&#8217;s the same advice I&#8217;d give for <a href="https://www.macronimous.com/blog/mastering-microservices-in-php-a-comprehensive-guide-for-php-developers/">splitting a PHP app into services</a>, and it pays off here for the same reason.</p>
<h2 id="security">Security: what I&#8217;d lock down first</h2>
<p>An MCP tool is a function on your production app that a language model can run. You are giving a caller that doesn&#8217;t understand consequences a button. You are trusting its client to ask a human first. You are assuming nobody slipped instructions into the text it just read. Treat every argument the way you&#8217;d treat a form field from a stranger.</p>
<p>The spec lists four things a server <em>must</em> do: validate inputs, enforce access control, rate limit, and sanitize outputs. Here&#8217;s how that turns into a pre-launch list.</p>
<ul class="mac-checklist">
<li>Every web MCP route sits behind authentication middleware. No public endpoints, not even for a demo.</li>
<li>Each tool checks what <em>this user</em> may do, with a policy or gate, inside the tool. Being logged in isn&#8217;t permission.</li>
<li>Each tool validates its arguments with real rules, not just the JSON schema.</li>
<li>The route has a rate limiter. Models retry, and they retry quickly.</li>
<li>Read-only tools are marked read-only, and destructive ones are marked destructive, so clients can ask for confirmation.</li>
<li>Nothing destructive ships in version one. No delete tools, no bulk updates.</li>
<li>Every tool call is logged with the user, the tool name, and the arguments.</li>
<li>Tool output is trimmed to what the model needs. No password hashes, no internal IDs you wouldn&#8217;t put in an API response.</li>
</ul>
<p>On authentication: Laravel&#8217;s own docs recommend OAuth through Passport, since that&#8217;s what the spec documents and what the widest range of clients support. They also say that if you&#8217;re already on Sanctum, stay there until a client forces the issue. I agree with that. Don&#8217;t bolt on an OAuth server for an internal tool three people use.</p>
<p>And keep a person in the loop for anything that writes. We run an MCP server on one of our own sites that lets an AI assistant edit pages. Every edit lands as a draft, and a human publishes it. That one rule has saved us more than once. It&#8217;s the same thinking behind <a href="https://www.macronimous.com/blog/controlled-ai-coding/">controlled AI coding</a>, and behind my standing worry that <a href="https://www.macronimous.com/blog/the-code-your-ai-wants-to-delete-is-load-bearing/">the code an AI wants to delete is load-bearing</a>.</p>
<h2 id="where-id-wait">Where I&#8217;d wait</h2>
<p>I&#8217;d build an internal MCP server today. I&#8217;d be slower about a public, customer-facing one, for two reasons.</p>
<p>Both PHP packages are pre-1.0. APIs will move. The examples in this post matched the documentation on the day I checked them (October 9, 2026), and I&#8217;d bet at least one is out of date within a year. Pin versions, and read the changelog before you run <code>composer update</code>.</p>
<p>The protocol also just had its biggest revision since launch. The maintainers added a formal deprecation policy alongside it, which is a good sign, but I&#8217;d let clients and SDKs settle for a few months before signing a contract that names a spec version.</p>
<p>If you&#8217;re not on Laravel: Symfony has <code>symfony/mcp-bundle</code>, Drupal has an <code>mcp_server</code> module, and API Platform and CakePHP have integrations built on the same official SDK. For <a href="https://www.macronimous.com/blog/wordpress-7-0-ai-the-token-cost-reality-for-site-owners/">WordPress</a>, read the post I linked earlier. That&#8217;s about all I know that&#8217;s worth passing on. If you&#8217;ve shipped a PHP MCP server and something here is wrong, tell me in the comments and I&#8217;ll fix it with credit.</p>
<h2 id="faq">FAQ</h2>
<div id="mcp-php-faq">
<div class="faq-item">
<h3>Do I need Laravel to build a PHP MCP server?</h3>
<p>No. The official <code>mcp/sdk</code> package is framework-agnostic and runs in plain PHP, CodeIgniter, Symfony, or a legacy codebase. Laravel developers should use <code>laravel/mcp</code> because it plugs into validation, policies, and middleware they already have.</p>
</div>
<div class="faq-item">
<h3>Can a PHP MCP server run on shared hosting?</h3>
<p>A server that follows the stateless 2026-07-28 revision handles each call as a normal HTTP request, so it fits standard PHP hosting far better than the older session-based design did. Check that your host allows the PHP version the package needs, and that your installed SDK version supports the stateless revision.</p>
</div>
<div class="faq-item">
<h3>Does MCP replace my REST API?</h3>
<p>No. REST serves code written by developers. MCP serves AI models that choose tools at run time. Most apps will keep both, with MCP tools and REST controllers calling the same service classes.</p>
</div>
<div class="faq-item">
<h3>Which MCP spec version should a new PHP server target?</h3>
<p>Target 2026-07-28 for new work, and keep support for the previous revision (2025-11-25) while your clients catch up, because the two are not backward compatible. An SDK that speaks both is the easiest way to do that.</p>
</div>
<div class="faq-item">
<h3>How do I test a PHP MCP server?</h3>
<p>Use MCP Inspector to call tools by hand. In Laravel, run <code>php artisan mcp:inspector</code> and write unit tests with the package&#8217;s test API. For the plain SDK, start the Inspector with <code>npx @modelcontextprotocol/inspector</code> and point it at your server file.</p>
</div>
</div>
<div class="mac-cta-box">
<h3>Need a PHP or Laravel App Made Ready for AI Agents?</h3>
<p>We&#8217;ve been writing PHP since 2002, and we build MCP servers for our own sites. If you want tools exposed safely on an existing app, we can scope it with you.</p>
<p><a href="https://www.macronimous.com/services/custom-web-development/" class="mac-cta-button">Talk to Our PHP Team</a>
</div>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/mcp-for-php-development/">PHP MCP Server: A PHP Developer&#8217;s Guide to the Model Context Protocol</a> first appeared on <a rel="nofollow" href="https://www.macronimous.com/blog">Macronimous Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.macronimous.com/blog/mcp-for-php-development/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Google Gemini CLI for Laraval development: Your New AI Co-Pilot in PHP programming</title>
		<link>https://www.macronimous.com/blog/google-gemini-cli-for-laraval-development/</link>
					<comments>https://www.macronimous.com/blog/google-gemini-cli-for-laraval-development/#respond</comments>
		
		<dc:creator><![CDATA[Benny]]></dc:creator>
		<pubDate>Mon, 07 Jul 2025 05:58:02 +0000</pubDate>
				<category><![CDATA[web programming]]></category>
		<category><![CDATA[AI Programming]]></category>
		<category><![CDATA[Laraval Development]]></category>
		<category><![CDATA[AI programming]]></category>
		<category><![CDATA[Laravel]]></category>
		<guid isPermaLink="false">https://www.macronimous.com/blog/?p=4796</guid>

					<description><![CDATA[<p>This is an exciting time for developers, and for a tech-focused people like us at Macronimous.com, diving into new tools like Gemini CLI for Laraval development is definitely a natural fit. Here&#8217;s a detailed blog post for Laravel developers on how Gemini CLI can revolutionize their workflow. Let&#8217;s break down what Gemini CLI is, why [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/google-gemini-cli-for-laraval-development/">Google Gemini CLI for Laraval development: Your New AI Co-Pilot in PHP programming</a> first appeared on <a rel="nofollow" href="https://www.macronimous.com/blog">Macronimous Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<a href="https://www.macronimous.com/blog/wp-content/uploads/2025/06/Gemini-CLI-for-Laravel-Developers.png"><img loading="lazy" decoding="async" width="1024" height="576" class="aligncenter size-large wp-image-4798" src="https://www.macronimous.com/blog/wp-content/uploads/2025/06/Gemini-CLI-for-Laravel-Developers-1024x576.png" alt="Gemini CLI for Laravel Developers" /></a>
<p>This is an exciting time for developers, and for a tech-focused people like us at <a href="https://www.macronimous.com/">Macronimous.com</a>, diving into new tools like Gemini CLI for <a href="https://www.macronimous.com/blog/php-frameworks-we-like-laravel/">Laraval development</a> is definitely a natural fit. Here&#8217;s a detailed blog post for Laravel developers on how Gemini CLI can revolutionize their workflow.</p>
<p>Let&#8217;s break down what Gemini CLI is, why it matters for Laravel developers, what you might miss if you don&#8217;t explore it, and how to get started.</p>
<h2><strong>What is Google Gemini CLI?</strong></h2>
<p>At its core, the <strong><a href="https://blog.google/technology/developers/introducing-gemini-cli-open-source-ai-agent/" target="_blank" rel="nofollow noopener">Gemini CLI</a> is an open-source <a href="https://www.macronimous.com/blog/the-code-your-ai-wants-to-delete-is-load-bearing/">AI</a> agent that allows you to interact with Google&#8217;s Gemini models directly from your terminal.</strong> Think of your command line as an AI-powered workspace. It&#8217;s designed to understand natural language prompts and leverage the advanced capabilities of <a href="https://aistudio.google.com/welcome?utm_source=google&amp;utm_medium=cpc&amp;utm_campaign=FY25-global-DR-gsem-BKWS-1710442&amp;utm_content=text-ad-none-any-DEV_c-CRE_750056871585-ADGP_Hybrid%20%7C%20BKWS%20-%20EXA%20%7C%20Txt-Products-Gemini%202.5-KWID_43700081931154840-kwd-2325346028141&amp;utm_term=KW_gemini%202.5-ST_gemini%202.5&amp;gad_source=1&amp;gad_campaignid=21896279268&amp;gbraid=0AAAAACn9t66ZVUWrAb0_ipz6jBfq4S40z&amp;gclid=Cj0KCQjw1JjDBhDjARIsABlM2StCbDM8CW_MbUxKq586FiixcNDZrWZuhH2jF-D2LQmApcZGOGTcVNcaAl1DEALw_wcB&amp;gclsrc=aw.ds" target="_blank" rel="nofollow noopener">Gemini 2.5 Pro</a> (which boasts an impressive 1 million token context window in the free tier) to perform a wide range of tasks.</p>
<p>Key capabilities include:</p>
<ul>
<li><strong>Code Understanding and Generation:</strong> Explain complex code snippets, draft new code, generate unit tests, suggest refactorings, and even help with migrating code.</li>
<li><strong>Debugging and Troubleshooting:</strong> Analyze error messages, pinpoint root causes, and suggest effective solutions for bugs.</li>
<li><strong>File and Project Management:</strong> Use natural language to navigate, summarize, and even modify files within your project structure.</li>
<li><strong>Command Execution:</strong> Translate plain English instructions into executable shell commands.</li>
<li><strong>Content Generation:</strong> Beyond code, it can assist with general<a href="https://www.macronimous.com/blog/ai-driven-unique-content/"> content creation</a>, problem-solving, and research, grounding prompts with real-time Google Search results.</li>
<li><strong>Extensibility:</strong> Being open-source <a href="https://www.apache.org/licenses/LICENSE-2.0" target="_blank" rel="nofollow noopener">(Apache 2.0 license</a>), it supports <a href="https://modelcontextprotocol.io/introduction" target="_blank" rel="nofollow noopener">Model Context Protocol</a> (<a href="https://www.macronimous.com/blog/building-a-wordpress-mcp-server-when-the-spec-changed/">MCP</a>) servers, allowing for custom tool integrations and extending its functionality.</li>
</ul>
<p>Essentially, Gemini CLI aims to be a versatile assistant that streamlines your development workflow, making you more productive without leaving the familiar environment of your terminal.</p>
<h3><strong>Is it Required for Laravel Developers to Learn and Use Gemini CLI?</strong></h3>
<p>&#8220;Required&#8221; is a strong word in software development, as many paths lead to a successful outcome. However, for <a href="https://www.macronimous.com/blog/simplify-laravel-development-with-gitpod-a-seamless-workflow-for-developers/">Laravel developers</a> aiming for peak efficiency and modern development practices, <strong>Gemini CLI is becoming increasingly valuable and highly recommended, though not strictly mandatory.</strong></p>
<p>Here&#8217;s why:</p>
<ol>
<li><strong>Complexity of Modern Laravel:</strong> Laravel applications, especially larger ones, can involve intricate logic, multiple packages, API integrations, and complex database interactions. Navigating and understanding these can be time-consuming.</li>
<li><strong>Increased Productivity:</strong> AI tools are no longer a luxury; they are becoming productivity multipliers. Gemini CLI can automate repetitive tasks, provide instant answers, and generate boilerplate code, freeing up developers to focus on more complex, creative problem-solving.</li>
<li><strong>Staying Competitive:</strong> As AI integration becomes more common, developers who can effectively leverage these tools will have a significant edge in terms of speed, quality, and adaptability.</li>
</ol>
<p>While you <em>can</em> develop Laravel applications perfectly well without it, embracing such tools pushes you towards a more efficient and less error-prone future.</p>
<h3><strong>What Would Laravel Developers Miss if They Don&#8217;t Use Gemini CLI?</strong></h3>
<p>Choosing to forgo Gemini CLI means missing out on several significant advantages:</p>
<ul>
<li><strong>Rapid Prototyping and Boilerplate Generation:</strong> Imagine instantly generating a Laravel Livewire component with basic<a href="https://www.geeksforgeeks.org/websites-apps/crud-full-form/" target="_blank" rel="nofollow noopener"> CRUD operations</a>, or a database migration script for a new feature, just by describing it in natural language. Without Gemini CLI, these are manual tasks.</li>
<li><strong>Accelerated Debugging:</strong> Instead of meticulously tracing stack traces, you could paste an error and get intelligent suggestions, potential fixes, and even context-aware code modifications. This drastically cuts down debugging time.</li>
<li><strong>Deep Codebase Understanding:</strong> For large or legacy Laravel projects, understanding how different services, controllers, models, and views interact can be daunting. Gemini CLI, with its large context window, can analyze your entire codebase and provide summaries, architectural overviews, or explain specific <a href="https://dev.to/boma/understanding-design-patterns-with-laravel-5dci" target="_blank" rel="nofollow noopener">Laravel patterns</a> used.</li>
<li><strong>Optimized Code &amp; Best Practices:</strong> You might miss opportunities for AI-driven code reviews that suggest <a href="https://www.macronimous.com/blog/web-performance-optimization-by-cleaning-up-unnecessary-javascript/">performance improvements</a>, adherence to Laravel conventions, or security enhancements.</li>
<li><strong>Reduced Context Switching:</strong> Staying in your terminal for AI assistance, rather than switching to a browser or other applications, maintains your flow state and improves focus.</li>
<li><strong>Enhanced Learning:</strong> For junior developers, or when learning new Laravel features or packages, Gemini CLI can act as an interactive tutor, explaining concepts, providing examples, and answering questions in real-time.</li>
<li><strong>Automated Documentation:</strong> Generating doc blocks for your Laravel classes, methods, or even entire modules can be automated, ensuring your codebase remains well-documented.</li>
</ul>
<p>In essence, you&#8217;d be missing out on a powerful assistant that can significantly reduce cognitive load and development cycles.</p>
<h3><strong>Why Gemini CLI is Not Necessary for Some Developers</strong></h3>
<p>Despite its immense benefits, Gemini CLI might not be a game-changer for everyone, or at least not immediately:</p>
<ul>
<li><strong>Smaller Projects or Solo Developers (Initial Stages):</strong> For very small, simple Laravel projects or developers who prefer a strictly manual approach, the initial setup and learning curve might seem like overkill.</li>
<li><strong>Highly Specialized Workflows:</strong> Developers with deeply ingrained, highly optimized, and unique manual workflows might find adopting a new AI tool disruptive, especially if their existing setup is already extremely efficient for their specific niche.</li>
<li><strong>Reliance on Specific IDE Features:</strong> Modern IDEs like PhpStorm already offer powerful code completion, refactoring, and debugging tools. Developers who heavily rely on these integrated features might not feel the immediate need for a CLI-based AI.</li>
<li><strong>Bandwidth/Internet Dependency:</strong> While the free tier is generous, heavy reliance on any cloud-based AI tool means you&#8217;re dependent on an internet connection and Google&#8217;s service availability.</li>
<li><strong>Privacy Concerns (for some):</strong> While Google has robust privacy policies, some developers or organizations might have strict internal policies against sending proprietary code to external AI services, even if the data handling is secure.</li>
<li><strong>&#8220;Human in the Loop&#8221; Preference:</strong> Some developers simply prefer to understand and write every line of code themselves, meticulously, and might view AI generation as a shortcut that reduces their hands-on understanding.</li>
</ul>
<p>For these developers, the traditional Laravel development workflow remains perfectly viable. However, the capabilities offered by Gemini CLI are rapidly becoming a standard expectation for developer productivity.</p>
<h3><strong>How to Start Using Gemini CLI for Laravel Development</strong></h3>
<p>If you&#8217;re a Laravel developer ready to harness the power of Gemini CLI, getting started is straightforward.</p>
<ol>
<li><strong> Prerequisites:</strong></li>
</ol>
<ul>
<li><strong>Node.js (Version 18 or higher):</strong> Gemini CLI runs on Node.js. Ensure you have a recent version installed. You can check with <em>node -v.</em></li>
<li><strong>Google Account:</strong> You&#8217;ll need a personal Google account for authentication. This grants you free-tier access with generous quotas (60 requests/minute and 1,000 requests/day for Gemini 2.5 Pro). For higher limits or specific models, you can use a Google AI Studio API key.</li>
</ul>
<ol start="2">
<li><strong> Installation:</strong></li>
</ol>
<p>Open your terminal and choose one of the following installation methods:</p>
<ul>
<li><strong>Run Directly (npx):</strong> This is great for quick tests or if you don&#8217;t want a global installation.</li>
</ul>
<p>Bash</p><pre class="urvanov-syntax-highlighter-plain-tag">npx https://github.com/google-gemini/gemini-cli</pre><p></p>
<ul>
<li><strong>Global Installation (Recommended for regular use):</strong> This installs gemini as a command accessible anywhere.</li>
</ul>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">npm install -g @google/gemini-cli</pre><p></p>
<ol start="3">
<li><strong> First Run and Authentication:</strong></li>
</ol>
<p>After installation, simply type gemini in your terminal:</p><pre class="urvanov-syntax-highlighter-plain-tag">gemini</pre><p>On the first run, you&#8217;ll be prompted to:</p>
<ul>
<li><strong>Choose a color theme:</strong> Select your preferred look.</li>
<li><strong>Authenticate:</strong> Select &#8220;Login with Google&#8221; and follow the browser prompts to sign in with your Google account. This securely links your terminal to Gemini&#8217;s AI capabilities.</li>
</ul>
<ol start="4">
<li><strong> Start Prompting!</strong></li>
</ol>
<p>Once authenticated, you&#8217;ll see the gemini &gt; prompt. Now you can start interacting!</p>
<p><strong>Examples for Laravel Developers:</strong></p>
<ul>
<li><strong>Explain Laravel Code:</strong></li>
</ul>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">gemini &gt; Explain this Laravel controller method: @app/Http/Controllers/UserController.php:store</pre><p>(Use @ to reference files/folders. Gemini CLI will often auto-complete paths).</p>
<ul>
<li><strong>Generate a Model &amp; Migration:</strong></li>
</ul>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">gemini &gt; Write a Laravel migration for a `products` table with columns: name (string, unique), description (text, nullable), price (decimal), stock (integer, default 0). Also, create a Product model with fillable properties.</pre><p></p>
<ul>
<li><strong>Debug a PHP Error:</strong></li>
</ul>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">gemini &gt; I'm getting a `Target class [App\Services\PaymentService] does not exist.` error in my Laravel application. Here's my controller: @app/Http/Controllers/OrderController.php. What's wrong?</pre><p></p>
<ul>
<li><strong>Generate a Blade Component:</strong></li>
</ul>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">gemini &gt; Create a simple Blade component for displaying a success alert message. It should accept a `$message` prop.</pre><p></p>
<ul>
<li><strong>Refactor Code:</strong></li>
</ul>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">gemini &gt; Refactor this PHP code to use a more modern Laravel approach: @app/Helpers/OldHelper.php</pre><p></p>
<ul>
<li><strong>Summarize a Project Folder:</strong></li>
</ul>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">gemini &gt; Give me a summary of the `app/Models` directory and the relationships between the models.</pre><p>&nbsp;</p>
<h3><strong>Tips for Effective Usage:</strong></h3>
<ul>
<li><strong>Be Specific:</strong> The more context and detail you provide in your prompt, the better the output.</li>
<li><strong>Use </strong><strong>@</strong><strong> for Context:</strong> Leverage the @ symbol to include specific files, directories, or even parts of files in your prompt&#8217;s context.</li>
<li><strong>Review and Refine:</strong> AI-generated code is a starting point, not always a final solution. Always review, test, and refine the output to fit your exact needs and project standards.</li>
<li><strong>Explore Commands:</strong> Type /help within the Gemini CLI to see a list of available commands and shortcuts.</li>
</ul>
<h4><strong>Conclusion</strong></h4>
<p>Google Gemini CLI is a powerful addition to the developer ecosystem, offering Laravel developers an intelligent co-pilot directly in their terminal. While not strictly &#8220;required,&#8221; embracing such AI-powered tools can significantly boost productivity, enhance code quality, and make the development process more enjoyable. For a <a href="https://www.macronimous.com/services/web-development/">web</a> and <a href="https://www.macronimous.com/services/mobile-development/">mobile development</a> business like Macronimous.com, integrating tools like Gemini CLI can translate directly into faster delivery, higher quality, and a more competitive edge in the market.</p>
<p>Start experimenting today, and unlock a new dimension of efficiency in your Laravel development journey!</p>
<p>&nbsp;</p>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/google-gemini-cli-for-laraval-development/">Google Gemini CLI for Laraval development: Your New AI Co-Pilot in PHP programming</a> first appeared on <a rel="nofollow" href="https://www.macronimous.com/blog">Macronimous Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.macronimous.com/blog/google-gemini-cli-for-laraval-development/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>FrankenPHP for Modern PHP Development &#8211; Now with the support of The PHP Foundation</title>
		<link>https://www.macronimous.com/blog/frankenphp-for-modern-php-development/</link>
					<comments>https://www.macronimous.com/blog/frankenphp-for-modern-php-development/#respond</comments>
		
		<dc:creator><![CDATA[Benny]]></dc:creator>
		<pubDate>Thu, 22 May 2025 07:09:42 +0000</pubDate>
				<category><![CDATA[PHP Programming]]></category>
		<category><![CDATA[PHP Development]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">https://www.macronimous.com/blog/?p=4751</guid>

					<description><![CDATA[<p>FrankenPHP Officially Supported by The PHP Foundation: What It Means for Modern PHP Development At Macronimous, we&#8217;ve been crafting robust web applications with PHP for over two decades. Our PHP teams are constantly exploring new horizons, embracing advancements like sophisticated frameworks such as Laravel and dynamic front-ends powered by modern JavaScript frameworks. We&#8217;re always seeking [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/frankenphp-for-modern-php-development/">FrankenPHP for Modern PHP Development &#8211; Now with the support of The PHP Foundation</a> first appeared on <a rel="nofollow" href="https://www.macronimous.com/blog">Macronimous Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<a href="https://www.macronimous.com/blog/wp-content/uploads/2025/05/FrankenPHP-for-Modern-PHP-Development.png"><img loading="lazy" decoding="async" width="1024" height="576" class="aligncenter size-large wp-image-4759" src="https://www.macronimous.com/blog/wp-content/uploads/2025/05/FrankenPHP-for-Modern-PHP-Development-1024x576.png" alt="FrankenPHP for Modern PHP Development" /></a>
<p><strong>FrankenPHP Officially Supported by The PHP Foundation: What It Means for Modern PHP Development</strong></p>
<p data-sourcepos="3:1-3:399">At Macronimous, we&#8217;ve been crafting robust web applications with PHP for over two decades. Our <a href="https://www.macronimous.com/services/outsource-php-development/">PHP teams</a> are constantly exploring new horizons, embracing advancements like sophisticated frameworks such as Laravel and dynamic front-ends powered by modern JavaScript frameworks. We&#8217;re always seeking ways to enhance our deliverables, making our applications faster, more efficient, and a joy to build.</p>
<p data-sourcepos="5:1-5:326">That&#8217;s why we&#8217;re particularly excited about the latest news in the PHP world, a development that promises to significantly impact the future of PHP development. If you&#8217;re a PHP learner eager to build high-performance applications and streamline your development process, pay close attention! This update is especially for you.</p>
<p>Exciting news just dropped in the PHP world! The innovative <a href="https://thephp.foundation/blog/2025/05/15/frankenphp/" target="_blank" rel="nofollow noopener">FrankenPHP</a> project has officially received support from The PHP Foundation, with its source code now moving to the official PHP project’s GitHub organization. This isn&#8217;t just a technical footnote; it represents a significant advancement that promises to substantially improve how we build and deploy PHP applications.</p>
<p>If you&#8217;re a <a href="https://www.macronimous.com/blog/advanced-php-coding-techniques/">PHP developer</a>, whether you&#8217;re hearing about FrankenPHP for the first time or wondering how this collaboration impacts your daily work, you&#8217;ve come to the right place. Let&#8217;s dive into what FrankenPHP is, why it matters, and how this official endorsement will supercharge our development community.</p>
<h3><strong>What Exactly <em>Is</em> FrankenPHP?</strong></h3>
<p>At its core, FrankenPHP is a modern, high-performance application server for PHP, built atop the powerful<a href="https://caddyserver.com/" target="_blank" rel="nofollow noopener"> Caddy web server</a> and primarily written in<a href="https://www.geeksforgeeks.org/go-programming-language-introduction/" target="_blank" rel="nofollow noopener"> Go</a>.</p>
<p>Forget the traditional Nginx + PHP-FPM or Apache + mod_php setups for a moment. FrankenPHP takes a different approach: it embeds the official PHP interpreter directly within the Caddy server. This tight integration is the secret sauce behind its capabilities.</p>
<p>Here&#8217;s a quick rundown of its powerful features:</p>
<ul>
<li><strong>Blazing Fast Performance:</strong> This is a standout feature. FrankenPHP&#8217;s &#8220;worker mode&#8221; keeps your PHP application booted in memory across multiple requests. No more re-initializing your entire framework for every single page load! This can lead to <strong>significant speed improvements</strong> – think 3.5x faster in some benchmarks, and up to 80% reduction in response times for specific scenarios.</li>
<li><strong>Modern Web Standards Out-of-the-Box:</strong> Thanks to Caddy, FrankenPHP inherently supports cutting-edge web protocols like<a href="https://http2.github.io/" target="_blank" rel="nofollow noopener"> </a><strong><a href="https://http2.github.io/" target="_blank" rel="nofollow noopener">HTTP/2</a> and <a href="https://www.geeksforgeeks.org/what-is-http-3-how-it-is-different-from-http-2/" target="_blank" rel="noopener">HTTP/3</a></strong> for faster communication, and even <a href="https://blogs.windows.com/msedgedev/2021/06/01/available-for-preview-automatic-https-helps-keep-your-browsing-more-secure/" target="_blank" rel="nofollow noopener"><strong>automatic HTTPS</strong></a> via Let&#8217;s Encrypt or ZeroSSL. Yes, automatic SSL for free! It also offers &#8220;<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/103" target="_blank" rel="nofollow noopener">103 Early Hints</a>&#8221; for quicker perceived page loads.</li>
<li><strong>Real-Time Capabilities:</strong> Ever wanted to easily add real-time features to your PHP app without a separate WebSocket server? FrankenPHP includes native support for the <a href="https://mercure.rocks/docs/mercure" target="_blank" rel="nofollow noopener"><strong>Mercure protocol</strong></a>, enabling real-time updates and push notifications directly from your <a href="https://www.macronimous.com/blog/advanced-php-coding-techniques/">PHP code.</a></li>
<li><strong>Remarkably Simpler Deployment:</strong> This is a highly desirable feature for many. FrankenPHP can compile your entire PHP application – interpreter, web server, extensions, and your code – into a <strong>single, standalone executable binary</strong> or a straightforward <strong>Docker image</strong>. Deploying becomes as simple as copying one file or running one container!</li>
<li><strong>Extensible and Compatible:</strong> While written in Go, it&#8217;s designed to be compatible with most existing PHP extensions. You can even extend your PHP apps with Go, C, and C++ if you need to!</li>
</ul>
<h3><strong>So, What Does This Mean for <em>You</em>, the PHP Developer?</strong></h3>
<p>FrankenPHP isn&#8217;t just a fancy new piece of tech; it directly impacts your daily development and deployment workflow:</p>
<ol>
<li><strong>Goodbye Performance Bottlenecks:</strong> Imagine your <a href="https://www.macronimous.com/blog/simplify-laravel-development-with-gitpod-a-seamless-workflow-for-developers/">Laravel</a> or <a href="https://www.macronimous.com/blog/frameworks-we-like-symfony-and-why/">Symfony</a> application responding almost instantaneously because it&#8217;s already &#8220;warm&#8221; in memory. This means a <a href="https://www.macronimous.com/blog/ux-design-for-experiences/">snappier user experience</a> for your applications and higher throughput for your servers.</li>
<li><strong>Deployment Has Become Simpler:</strong> The era of wrestling with complex web server configurations and PHP-FPM pools could be behind us. Building a single executable or Docker image that just <em>runs</em>simplifie<a href="https://github.com/resources/articles/devops/ci-cd" target="_blank" rel="nofollow noopener">s CI/CD pipelines</a> immensely, making deployments faster and less error-prone.</li>
<li><strong>Modern Features Without the Headache:</strong> Want HTTP/3 or automatic SSL? FrankenPHP handles it. Need real-time updates? <a href="https://github.com/wooky/php-mercure" target="_blank" rel="nofollow noopener">Mercure</a> is built-in. You can focus on your application&#8217;s logic, not infrastructure configuration.</li>
<li><strong>Enhanced Developer Experience (DX):</strong> Faster local development due to the worker mode means quicker feedback loops. And for command-line tools or self-contained microservices, a single binary simplifies distribution and execution.</li>
<li><strong>Potential Cost Savings:</strong> More efficient execution means your applications can handle more traffic with fewer resources, potentially leading to lower hosting bills.</li>
</ol>
<h3><strong>How Does Official PHP Foundation Support Elevate the Entire Community?</strong></h3>
<p>This collaboration is a massive win for the broader PHP ecosystem:</p>
<ol>
<li><strong>Trust and Mainstream Adoption:</strong> When The PHP Foundation officially backs a project, it signals reliability and future commitment. Companies and developers will feel more confident investing time and resources into adopting FrankenPHP, knowing it&#8217;s part of the language&#8217;s official roadmap.</li>
<li><strong>Long-Term Stability and Evolution:</strong> With Foundation staff actively contributing, FrankenPHP is guaranteed consistent maintenance and development. This ensures it stays compatible with future PHP versions and continues to evolve with the needs of modern <a href="https://www.macronimous.com/blog/web-development-with-web-components/">web development</a>. No more worries about a promising project fizzling out!</li>
<li><strong>Enhanced Reliability and Compatibility:</strong> Official integration means rigorous testing and alignment with core PHP advancements. This translates to fewer bugs, better performance, and seamless compatibility with the latest language features.</li>
<li><strong>Increased Visibility and Learning:</strong> Being under the PHP project&#8217;s umbrella will significantly boost FrankenPHP&#8217;s profile. More developers will discover its benefits, accelerating its adoption and driving innovation across the community.</li>
<li><strong>Fostering Community Contributions:</strong> Moving the codebase to the official PHP GitHub organization makes it easier for the wider community to get involved, contribute code, report issues, and suggest features. This collaborative environment will only make FrankenPHP stronger.</li>
<li><strong>Modernizing the PHP Stack:</strong> FrankenPHP pushes the boundaries of how PHP applications are served. Its success will encourage the adoption of more efficient deployment strategies and advanced web features, solidifying PHP&#8217;s position as a cutting-edge language for <a href="https://www.macronimous.com/services/outsource-php-development/">modern web development</a>.</li>
</ol>
<h3><strong>The Future is Bright for PHP</strong></h3>
<p>The integration of FrankenPHP into The PHP Foundation marks a very important moment for PHP. It&#8217;s not just about a new tool; it&#8217;s about a renewed commitment to performance, simplicity, and modern capabilities within the PHP ecosystem.</p>
<p>If you haven&#8217;t already, now is the perfect time to explore FrankenPHP. Whether you&#8217;re building a new project or looking to optimize an existing one, this powerful application server, now with the official backing of The PHP Foundation, is poised to become an indispensable part of your modern PHP development toolkit.</p>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/frankenphp-for-modern-php-development/">FrankenPHP for Modern PHP Development &#8211; Now with the support of The PHP Foundation</a> first appeared on <a rel="nofollow" href="https://www.macronimous.com/blog">Macronimous Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.macronimous.com/blog/frankenphp-for-modern-php-development/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
