<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/vendor/feed/atom.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
                        <id>https://phptoptens.com/authors/steve-mcdougall/feed</id>
                                <link href="https://phptoptens.com/authors/steve-mcdougall/feed" rel="self"></link>
                                <title><![CDATA[Artisan Weekly — Author Feed]]></title>
                    
                                <subtitle>Featured links for a given author across Artisan Weekly editions.</subtitle>
                                                    <updated>2026-10-22T15:51:01+01:00</updated>
                        <entry>
            <title><![CDATA[Most of Your API Has Already Been Designed]]></title>
            <link rel="alternate" href="https://www.juststeveking.com/articles/most-of-your-api-has-already-been-designed/" />
            <id>https://www.juststeveking.com/articles/most-of-your-api-has-already-been-designed/</id>
            <author>
                <name><![CDATA[Steve McDougall]]></name>
                <email><![CDATA[hello@example.com]]></email>

            </author>
            <summary type="html">
                <![CDATA[A comprehensive guide to leveraging published HTTP standards in Laravel API design, introducing api-toolbox - a package that implements RFC-backed features like Problem Details, idempotency, and deprecation handling rather than building custom solutions from scratch.]]>
            </summary>
                                    <updated>2026-10-22T15:51:01+01:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Why Is This Hard To Change?]]></title>
            <link rel="alternate" href="https://juststeveking.com/series/hard-to-change/" />
            <id>https://juststeveking.com/series/hard-to-change/</id>
            <author>
                <name><![CDATA[Steve McDougall]]></name>
                <email><![CDATA[hello@example.com]]></email>

            </author>
            <summary type="html">
                <![CDATA[A comprehensive series exploring common architectural challenges in Laravel codebases, from coupling and test suite performance to model responsibilities and code organisation. This practical guide helps developers identify and address the real issues behind difficult-to-change code.]]>
            </summary>
                                    <updated>2026-08-27T10:26:15+01:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Building an order fulfilment workflow in Laravel]]></title>
            <link rel="alternate" href="https://www.juststeveking.com/articles/building-an-order-fulfilment-workflow/" />
            <id>https://www.juststeveking.com/articles/building-an-order-fulfilment-workflow/</id>
            <author>
                <name><![CDATA[Steve McDougall]]></name>
                <email><![CDATA[hello@example.com]]></email>

            </author>
            <summary type="html">
                <![CDATA[In this latest article from Steve he walks us through implementing a workflow engine to handle order fulfilment. Using state management, webhooks and manual approvals, so if you want to find out more about workflow engines read on to see a practical example in Laravel.]]>
            </summary>
                                    <updated>2026-07-30T04:34:32+01:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Building Bulletproof Laravel APIs using Schema-First Contract Validation]]></title>
            <link rel="alternate" href="https://juststeveking.com/articles/bulletproof-laravel-apis-schema-first-contract-validation/" />
            <id>https://juststeveking.com/articles/bulletproof-laravel-apis-schema-first-contract-validation/</id>
            <author>
                <name><![CDATA[Steve McDougall]]></name>
                <email><![CDATA[hello@example.com]]></email>

            </author>
            <summary type="html">
                <![CDATA[A comprehensive guide to implementing schema-first API design in Laravel, demonstrating how JSON Schema contracts can prevent common pitfalls like undocumented endpoints and mass assignment vulnerabilities by validating both incoming requests and outgoing responses against a single source of truth.]]>
            </summary>
                                    <updated>2026-07-23T15:25:41+01:00</updated>
        </entry>
            <entry>
            <title><![CDATA[apiguide.dev | Authoritative HTTP & API Reference]]></title>
            <link rel="alternate" href="https://apiguide.dev/" />
            <id>https://apiguide.dev/</id>
            <author>
                <name><![CDATA[Steve McDougall]]></name>
                <email><![CDATA[hello@example.com]]></email>

            </author>
            <summary type="html">
                <![CDATA[A comprehensive reference directory for API developers covering HTTP status codes, headers, error schemas, and standardised Problem+JSON patterns. Includes practical guides for common scenarios like rate limiting, concurrency control, and validation failures.]]>
            </summary>
                                    <updated>2026-07-09T15:56:07+01:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Fibers Plus the Polling API: What Async PHP Actually Looks Like Now]]></title>
            <link rel="alternate" href="https://www.juststeveking.com/articles/async-php/" />
            <id>https://www.juststeveking.com/articles/async-php/</id>
            <author>
                <name><![CDATA[Steve McDougall]]></name>
                <email><![CDATA[hello@example.com]]></email>

            </author>
            <summary type="html">
                <![CDATA[Steve McDougall explores PHP's new Polling API and how it combines with Fibers to provide native asynchronous capabilities, demonstrating through practical examples how to build a minimal scheduler and explaining why this matters for the future of async PHP.]]>
            </summary>
                                    <updated>2026-07-01T13:12:08+01:00</updated>
        </entry>
            <entry>
            <title><![CDATA[The Polling API Is the Most Underrated RFC PHP Has Shipped in Years]]></title>
            <link rel="alternate" href="https://www.juststeveking.com/articles/php-8-6-polling-api-rfc/" />
            <id>https://www.juststeveking.com/articles/php-8-6-polling-api-rfc/</id>
            <author>
                <name><![CDATA[Steve McDougall]]></name>
                <email><![CDATA[hello@example.com]]></email>

            </author>
            <summary type="html">
                <![CDATA[An in-depth look at PHP 8.6's Polling API RFC, explaining how it provides native access to high-performance I/O multiplexing mechanisms like epoll and kqueue, finally bringing PHP's async capabilities in line with modern runtimes like Node.js and Go.]]>
            </summary>
                                    <updated>2026-06-25T17:24:14+01:00</updated>
        </entry>
            <entry>
            <title><![CDATA[API Tips and Tricks from My Book]]></title>
            <link rel="alternate" href="https://www.juststeveking.com/articles/api-tips-and-tricks-from-my-book/" />
            <id>https://www.juststeveking.com/articles/api-tips-and-tricks-from-my-book/</id>
            <author>
                <name><![CDATA[Steve McDougall]]></name>
                <email><![CDATA[hello@example.com]]></email>

            </author>
            <summary type="html">
                <![CDATA[Steve shares key insights from his new book 'API Artisan: A guide to building APIs in Laravel', covering essential patterns for building Laravel APIs that developers actually want to use. Learn about measuring the right metrics, designing contracts before code, and understanding what truly constitutes a breaking change.]]>
            </summary>
                                    <updated>2026-06-11T06:47:07+01:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Testing Actions, Not Mocks]]></title>
            <link rel="alternate" href="https://www.juststeveking.com/articles/testing-actions-not-mocks/" />
            <id>https://www.juststeveking.com/articles/testing-actions-not-mocks/</id>
            <author>
                <name><![CDATA[Steve McDougall]]></name>
                <email><![CDATA[hello@example.com]]></email>

            </author>
            <summary type="html">
                <![CDATA[Steve McDougall explains why testing Laravel Action classes against real databases is more effective than mocking. He demonstrates how mock-heavy tests can pass whilst features break, and shares his approach to writing meaningful tests that verify actual behaviour rather than just method calls.]]>
            </summary>
                                    <updated>2026-06-10T12:58:17+01:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Server-Side Rate Limiting in Laravel with Fingerprint.dev]]></title>
            <link rel="alternate" href="https://www.juststeveking.com/articles/server-side-rate-limiting-with-laravel-and-fingerprint-dev/" />
            <id>https://www.juststeveking.com/articles/server-side-rate-limiting-with-laravel-and-fingerprint-dev/</id>
            <author>
                <name><![CDATA[Steve McDougall]]></name>
                <email><![CDATA[hello@example.com]]></email>

            </author>
            <summary type="html">
                <![CDATA[An in-depth tutorial on building a more robust rate limiting system for Laravel applications using Fingerprint.dev to identify visitors by device rather than IP address, solving common issues with shared IPs, VPN rotation, and CGNAT that plague traditional IP-based rate limiting.]]>
            </summary>
                                    <updated>2026-06-04T15:32:58+01:00</updated>
        </entry>
            <entry>
            <title><![CDATA[The Reason I Love Tempest for APIs]]></title>
            <link rel="alternate" href="https://www.juststeveking.com/articles/the-reason-i-love-tempest-for-apis/" />
            <id>https://www.juststeveking.com/articles/the-reason-i-love-tempest-for-apis/</id>
            <author>
                <name><![CDATA[Steve McDougall]]></name>
                <email><![CDATA[hello@example.com]]></email>

            </author>
            <summary type="html">
                <![CDATA[Steve McDougall explores why Tempest simplifies API development by eliminating boilerplate code, using typed properties with validation attributes directly on request classes, and keeping routes as attributes alongside controller methods for a more declarative, focused approach.]]>
            </summary>
                                    <updated>2026-05-26T15:31:36+01:00</updated>
        </entry>
            <entry>
            <title><![CDATA[The PSR Standards You Are Probably Ignoring]]></title>
            <link rel="alternate" href="https://www.juststeveking.com/articles/the-psr-standards-you-are-probably-ignoring/" />
            <id>https://www.juststeveking.com/articles/the-psr-standards-you-are-probably-ignoring/</id>
            <author>
                <name><![CDATA[Steve McDougall]]></name>
                <email><![CDATA[hello@example.com]]></email>

            </author>
            <summary type="html">
                <![CDATA[Steve McDougall explores the often-overlooked PSR standards (PSR-7, PSR-14, PSR-15, PSR-17, PSR-18) that provide a complete HTTP-aware PHP model independent of any framework. Learn how these standards enable you to write truly portable PHP code that works across different frameworks and libraries.]]>
            </summary>
                                    <updated>2026-05-12T08:52:41+01:00</updated>
        </entry>
            <entry>
            <title><![CDATA[The Laravel Request Lifecycle, Step by Step]]></title>
            <link rel="alternate" href="https://certificates.dev/blog/the-laravel-request-lifecycle-step-by-step" />
            <id>https://certificates.dev/blog/the-laravel-request-lifecycle-step-by-step</id>
            <author>
                <name><![CDATA[Steve McDougall]]></name>
                <email><![CDATA[hello@example.com]]></email>

            </author>
            <summary type="html">
                <![CDATA[A deep dive into Laravel's HTTP request lifecycle, tracing every step from when a request hits public/index.php to when the response reaches the browser. Perfect for developers who want to understand how Laravel's container, service providers, and controllers work together behind the scenes.]]>
            </summary>
                                    <updated>2026-05-14T15:19:30+01:00</updated>
        </entry>
            <entry>
            <title><![CDATA[The PHP Community Pulse]]></title>
            <link rel="alternate" href="https://phponline.dev/" />
            <id>https://phponline.dev/</id>
            <author>
                <name><![CDATA[Steve McDougall]]></name>
                <email><![CDATA[hello@example.com]]></email>

            </author>
            <summary type="html">
                <![CDATA[A comprehensive PHP community hub that tracks language development, RFCs, and ecosystem health while curating content from top creators and podcasts. Perfect for staying up-to-date with PHP 8.5 development, Laravel news, and the broader PHP community pulse.]]>
            </summary>
                                    <updated>2026-03-23T15:33:43+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Building production ready APIs with kit]]></title>
            <link rel="alternate" href="https://www.juststeveking.com/articles/building-production-ready-apis-with-kit/" />
            <id>https://www.juststeveking.com/articles/building-production-ready-apis-with-kit/</id>
            <author>
                <name><![CDATA[Steve McDougall]]></name>
                <email><![CDATA[hello@example.com]]></email>

            </author>
            <summary type="html">
                <![CDATA[Steve McDougall introduces Kit, an opinionated Laravel starter package designed to solve common API development problems like inconsistent responses, security issues, and versioning challenges. The comprehensive tutorial covers setting up Kit with PHP 8.5 and Laravel 12, focusing on token-based authentication and production-ready API architecture.]]>
            </summary>
                                    <updated>2026-03-13T16:26:15+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[The Object Design Style Guide for PHP 8.5 - Discipline without friction]]></title>
            <link rel="alternate" href="https://sevalla.com/blog/php-object-design-style-guide/" />
            <id>https://sevalla.com/blog/php-object-design-style-guide/</id>
            <author>
                <name><![CDATA[Steve McDougall]]></name>
                <email><![CDATA[hello@example.com]]></email>

            </author>
            <summary type="html">
                <![CDATA[Steve McDougall explores how PHP 8.5's new asymmetric visibility features make Matthias Noback's Object Design Style Guide principles much easier to implement. The article demonstrates how modern PHP syntax eliminates the ceremony previously required for proper encapsulation and object design patterns.]]>
            </summary>
                                    <updated>2026-02-18T14:39:45+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Relay: Building a Fiber-Native HTTP Layer for Modern PHP]]></title>
            <link rel="alternate" href="https://sevalla.com/blog/relay-fiber-native-http-for-modern-php/" />
            <id>https://sevalla.com/blog/relay-fiber-native-http-for-modern-php/</id>
            <author>
                <name><![CDATA[Steve McDougall]]></name>
                <email><![CDATA[hello@example.com]]></email>

            </author>
            <summary type="html">
                <![CDATA[Steve McDougall introduces Relay, a modern HTTP transport layer for PHP 8.5+ that leverages Fibers for native concurrency and treats HTTP responses as immutable signals rather than exceptions. The library offers a clean, functional API that makes concurrent HTTP requests look synchronous while eliminating the need for try-catch blocks around expected HTTP responses.]]>
            </summary>
                                    <updated>2026-02-08T08:23:35+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Recalibrated]]></title>
            <link rel="alternate" href="https://juststeveking.com/articles/recalibrated/" />
            <id>https://juststeveking.com/articles/recalibrated/</id>
            <author>
                <name><![CDATA[Steve McDougall]]></name>
                <email><![CDATA[hello@example.com]]></email>

            </author>
            <summary type="html">
                <![CDATA[Steve McDougall shares a deeply personal story about his military service as a Route Clearance specialist in Afghanistan, drawing powerful parallels between high-stakes bomb disposal work and software development. A moving reflection on finding human connection in conflict zones and the lasting impact of service.]]>
            </summary>
                                    <updated>2026-02-20T10:13:12+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Building a Claude Code skill]]></title>
            <link rel="alternate" href="https://sevalla.com/blog/building-claude-code-skill/" />
            <id>https://sevalla.com/blog/building-claude-code-skill/</id>
            <author>
                <name><![CDATA[Steve McDougall]]></name>
                <email><![CDATA[hello@example.com]]></email>

            </author>
            <summary type="html">
                <![CDATA[A comprehensive guide to creating portable instruction manuals for Claude AI that teach domain-specific approaches, with a detailed walkthrough of building a production-grade Laravel API skill. Learn how to structure skills using progressive disclosure, make opinionated architectural decisions, and create reusable templates that others can contribute to and improve.]]>
            </summary>
                                    <updated>2026-02-05T07:00:53+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Kubernetes for Laravel developers]]></title>
            <link rel="alternate" href="https://sevalla.com/blog/kubernetes-laravel-developers/" />
            <id>https://sevalla.com/blog/kubernetes-laravel-developers/</id>
            <author>
                <name><![CDATA[Steve McDougall]]></name>
                <email><![CDATA[hello@example.com]]></email>

            </author>
            <summary type="html">
                <![CDATA[Have you ever been told about a new technology, or how you should use x or y to do z and thought man that sounds complicated? This is what Kubernetes has felt like for me. In this comprehensive guide Steve helps demystifies Kubernetes. He explains the core concepts like Pods, Deployments, and Services without overwhelming jargon. If you want to know more about Kubernetes then give this post a read.]]>
            </summary>
                                    <updated>2026-02-06T08:40:02+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Laravel API Course]]></title>
            <link rel="alternate" href="https://t.ly/gV3kG" />
            <id>https://t.ly/gV3kG</id>
            <author>
                <name><![CDATA[Steve McDougall]]></name>
                <email><![CDATA[hello@example.com]]></email>

            </author>
            <summary type="html">
                <![CDATA[we have Steve McDougall and the team at Treblle with their 100% totally free Laravel API Course. Go check it out if you want to know how to build a great API in Laravel]]>
            </summary>
                                    <updated>2026-01-22T11:33:56+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[The Definitive Guide to Webhooks in Laravel]]></title>
            <link rel="alternate" href="https://t.ly/uH1EX" />
            <id>https://t.ly/uH1EX</id>
            <author>
                <name><![CDATA[Steve McDougall]]></name>
                <email><![CDATA[hello@example.com]]></email>

            </author>
            <summary type="html">
                <![CDATA[The Definitive Guide to Webhooks in Laravel]]>
            </summary>
                                    <updated>2026-01-15T07:46:33+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Taking part in the Peerlist December Hackathon]]></title>
            <link rel="alternate" href="https://t.ly/OFHae" />
            <id>https://t.ly/OFHae</id>
            <author>
                <name><![CDATA[Steve McDougall]]></name>
                <email><![CDATA[hello@example.com]]></email>

            </author>
            <summary type="html">
                <![CDATA[Taking part in the Peerlist December Hackathon]]>
            </summary>
                                    <updated>2026-01-15T07:46:33+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Deploying Laravel on Sevella]]></title>
            <link rel="alternate" href="https://t.ly/8NhQY" />
            <id>https://t.ly/8NhQY</id>
            <author>
                <name><![CDATA[Steve McDougall]]></name>
                <email><![CDATA[hello@example.com]]></email>

            </author>
            <summary type="html">
                <![CDATA[Deploying Laravel on Sevella]]>
            </summary>
                                    <updated>2026-01-15T07:46:33+00:00</updated>
        </entry>
            <entry>
            <title><![CDATA[Lets' Build: API KIt]]></title>
            <link rel="alternate" href="https://t.ly/Q-kvE" />
            <id>https://t.ly/Q-kvE</id>
            <author>
                <name><![CDATA[Steve McDougall]]></name>
                <email><![CDATA[hello@example.com]]></email>

            </author>
            <summary type="html">
                <![CDATA[Lets' Build: API KIt]]>
            </summary>
                                    <updated>2026-01-13T22:57:38+00:00</updated>
        </entry>
    </feed>
