<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Mike Birhanu</title>
    <description>The latest articles on Forem by Mike Birhanu (@codewithmikee).</description>
    <link>https://forem.com/codewithmikee</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3174339%2F60f1dd17-bf2c-4b48-87b0-a55e2eb8b944.png</url>
      <title>Forem: Mike Birhanu</title>
      <link>https://forem.com/codewithmikee</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/codewithmikee"/>
    <language>en</language>
    <item>
      <title>🌍 Stop Timezone Chaos in Your Business App: A Laravel Developer’s Guide To Setup User TimeZone Based Carbon Usage</title>
      <dc:creator>Mike Birhanu</dc:creator>
      <pubDate>Sun, 18 May 2025 20:09:32 +0000</pubDate>
      <link>https://forem.com/codewithmikee/stop-timezone-chaos-in-your-business-app-a-laravel-developers-guide-to-setup-user-timezone-c2g</link>
      <guid>https://forem.com/codewithmikee/stop-timezone-chaos-in-your-business-app-a-laravel-developers-guide-to-setup-user-timezone-c2g</guid>
      <description>&lt;p&gt;Timezones are more than just a technical nuisance — they're a real threat to global businesses. Missed meetings, broken calendar exports, and daylight saving errors can cost you clients, trust, and time.&lt;/p&gt;

&lt;p&gt;In this post, I’ll show you how I built a &lt;strong&gt;timezone conversion tool in Laravel&lt;/strong&gt; that makes handling multiple timezones easy — even when your users span from Tokyo to Toronto.&lt;/p&gt;

&lt;p&gt;Let’s dive in.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 The Problem Every Global Business Faces
&lt;/h2&gt;

&lt;p&gt;Imagine this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A user in &lt;strong&gt;Tokyo&lt;/strong&gt; schedules a meeting at &lt;strong&gt;2 PM local time&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
But someone in &lt;strong&gt;New York&lt;/strong&gt; shows up at &lt;strong&gt;1 AM&lt;/strong&gt; because the app didn’t convert it right. 💀&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or worse:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Calendar exports show incorrect times&lt;/li&gt;
&lt;li&gt;Daylight Saving Time changes break everything twice a year&lt;/li&gt;
&lt;li&gt;Manual conversions lead to bugs, missed events, and angry customers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sound familiar? You're not alone.&lt;/p&gt;

&lt;p&gt;That’s why I built a simple but powerful &lt;strong&gt;Laravel timezone handler package&lt;/strong&gt; — designed to solve these problems once and for all.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔧 Step 1: Get Started Fast With My Base Code
&lt;/h2&gt;

&lt;p&gt;Why reinvent the wheel?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/codewithmikee/laravel-timezone-handler
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This repo includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A pre-built &lt;code&gt;UserTimeZoneHandler&lt;/code&gt; class&lt;/li&gt;
&lt;li&gt;Working demo UI (&lt;code&gt;/timezone-converter&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Unit tests (for DST and edge cases)&lt;/li&gt;
&lt;li&gt;Ready-to-use methods for both static and instance-based conversions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can start using it in minutes — no need to write everything from scratch.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ Step 2: Use Magic Methods That Just Work
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Convert Anywhere → UTC (Static Usage)
&lt;/h3&gt;

&lt;p&gt;Perfect for background jobs or APIs where you don’t have a logged-in user:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$utcTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;UserTimeZoneHandler&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;toUtc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'2023-01-01 14:00'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Asia/Tokyo'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Instance Mode for Logged-In Users
&lt;/h3&gt;

&lt;p&gt;For apps with user-specific timezones:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$handler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;UserTimeZoneHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$localTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$handler&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;toUserTimeZone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$event&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;start_time&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now every conversion respects the user’s current location — no matter where they are.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚠️ Step 3: Don’t Make My Carbon Mistake
&lt;/h2&gt;

&lt;p&gt;I wasted hours debugging a failing test until I realized:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Laravel extends Carbon differently!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Always use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Support\Carbon&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Not &lt;code&gt;Carbon\Carbon&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It’s an easy fix — but one that saves you from weird date parsing bugs later.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ Step 4: Customize It for Your Product
&lt;/h2&gt;

&lt;p&gt;Need to support Zoom, Google Calendar, or your own custom export format?&lt;/p&gt;

&lt;p&gt;Just add a new formatter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="s1"&gt;'zoom'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$utcTime&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Ymd\THis\Z'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Want to convert working hours between two offices?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$converted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;UserTimeZoneHandler&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;convertTimeRanges&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nv"&gt;$businessHours&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'America/Chicago'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'Europe/Paris'&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes it perfect for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scheduling tools&lt;/li&gt;
&lt;li&gt;Remote team planners&lt;/li&gt;
&lt;li&gt;Booking systems&lt;/li&gt;
&lt;li&gt;Customer-facing dashboards&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚀 Step 5: Launch &amp;amp; Test Instantly
&lt;/h2&gt;

&lt;p&gt;Run the server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan serve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then visit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:8000/timezone-converter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Try converting dates across different timezones and see how it handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DST changes&lt;/li&gt;
&lt;li&gt;Custom formats&lt;/li&gt;
&lt;li&gt;Multiple inputs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You’ll be amazed how smoothly it works.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Why This Matters for Your Business
&lt;/h2&gt;

&lt;p&gt;This isn’t just a developer tool — it’s a &lt;strong&gt;business enabler&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;By handling timezones correctly, you ensure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fewer customer complaints about scheduling&lt;/li&gt;
&lt;li&gt;Accurate calendar integrations&lt;/li&gt;
&lt;li&gt;Better international UX&lt;/li&gt;
&lt;li&gt;Reduced support tickets during DST changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And best of all?&lt;/p&gt;

&lt;p&gt;It’s &lt;strong&gt;open-source&lt;/strong&gt;, so you can clone it, tweak it, and make it your own — without bloating your app with heavy libraries.&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 Ready to Try It?
&lt;/h2&gt;

&lt;p&gt;👉 Clone the repo today:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/codewithmikee/laravel-timezone-handler" rel="noopener noreferrer"&gt;GitHub - codewithmikee/laravel-timezone-handler&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Drop a ⭐ if it helped you avoid timezone chaos — and let me know how you’re using it in your app!&lt;/p&gt;




&lt;h2&gt;
  
  
  📣 Got Questions?
&lt;/h2&gt;

&lt;p&gt;Leave a comment below or reach out — happy to help!&lt;/p&gt;

&lt;h1&gt;
  
  
  Laravel #PHP #Timezones #SaaS #DevOps #WebDevelopment #OpenSource #BusinessTools #Productivity
&lt;/h1&gt;

</description>
      <category>laravel</category>
      <category>carbon</category>
      <category>php</category>
      <category>datetime</category>
    </item>
    <item>
      <title>Timezones Got You Down? Build a Laravel Converter That Just Works</title>
      <dc:creator>Mike Birhanu</dc:creator>
      <pubDate>Sat, 17 May 2025 20:14:59 +0000</pubDate>
      <link>https://forem.com/codewithmikee/timezones-got-you-down-build-a-laravel-converter-that-just-works-4bo1</link>
      <guid>https://forem.com/codewithmikee/timezones-got-you-down-build-a-laravel-converter-that-just-works-4bo1</guid>
      <description>&lt;h4&gt;
  
  
  &lt;strong&gt;The Problem We All Face&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;⏰ Your user in Tokyo picks 2 PM → New York sees 1 AM 💀&lt;br&gt;&lt;br&gt;
📅 Calendar exports show wrong times&lt;br&gt;&lt;br&gt;
🌍 DST changes break everything  &lt;/p&gt;

&lt;p&gt;Here’s how I built a converter that handles all this – &lt;em&gt;and how you can clone it.&lt;/em&gt;  &lt;/p&gt;


&lt;h4&gt;
  
  
  &lt;strong&gt;Step 1: Steal My Base Code&lt;/strong&gt;
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/codewithmikee/laravel-timezone-handler  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Why start from scratch? This includes:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pre-built service class
&lt;/li&gt;
&lt;li&gt;Working demo UI
&lt;/li&gt;
&lt;li&gt;Passing tests (mostly 😉)
&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;
  
  
  &lt;strong&gt;Step 2: The Magic Methods&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Convert Anywhere → UTC&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Static call (no user context)  &lt;/span&gt;
&lt;span class="nv"&gt;$utcTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;UserTimeZoneHandler&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;toUtc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;  
    &lt;span class="s1"&gt;'2023-01-01 14:00'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   
    &lt;span class="s1"&gt;'Asia/Tokyo'&lt;/span&gt;  
&lt;span class="p"&gt;);&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;User-Friendly Instance Mode&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// In controller  &lt;/span&gt;
&lt;span class="nv"&gt;$handler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;UserTimeZoneHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  

&lt;span class="c1"&gt;// All conversions use the user’s zone  &lt;/span&gt;
&lt;span class="nv"&gt;$localTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$handler&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;toUserTimeZone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$event&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;start_time&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  &lt;strong&gt;Step 3: Avoid My Carbon Mistake&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;I wasted hours on this failed test:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;testGoogleFormatting&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="nv"&gt;$time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Carbon&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;...&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Fails!  &lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Why?&lt;/em&gt; Laravel extends Carbon. &lt;strong&gt;Always use:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Support\Carbon&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Not Carbon\Carbon!  &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  &lt;strong&gt;Step 4: Add Your Secret Sauce&lt;/strong&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;New Calendar Provider?&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Add to formatForProvider()  &lt;/span&gt;
&lt;span class="s1"&gt;'zoom'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$utcTime&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Ymd\THis\Z'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Custom Time Ranges&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$converted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;UserTimeZoneHandler&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;convertTimeRanges&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;  
    &lt;span class="nv"&gt;$businessHours&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  
    &lt;span class="s1"&gt;'America/Chicago'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  
    &lt;span class="s1"&gt;'Europe/Paris'&lt;/span&gt;  
&lt;span class="p"&gt;);&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  &lt;strong&gt;Step 5: Launch Your Demo&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan serve  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Visit &lt;code&gt;http://localhost:8000/timezone-converter&lt;/code&gt; to see:&lt;br&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fcodewithmikee%2Flaravel-timezone-handler%2Fraw%2Fmain%2Fdemo-screenshot.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fcodewithmikee%2Flaravel-timezone-handler%2Fraw%2Fmain%2Fdemo-screenshot.png" alt="Demo UI" width="800" height="400"&gt;&lt;/a&gt;  &lt;/p&gt;




&lt;h4&gt;
  
  
  &lt;strong&gt;Why This Works&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;✅ Handles 597 timezones (including weird ones like &lt;code&gt;Australia/Lord_Howe&lt;/code&gt;)
&lt;/li&gt;
&lt;li&gt;✅ Tests cover DST/edge cases
&lt;/li&gt;
&lt;li&gt;✅ No hidden dependencies
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Clone &amp;amp; Customize&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/codewithmikee/laravel-timezone-handler" rel="noopener noreferrer"&gt;github.com/codewithmikee/laravel-timezone-handler&lt;/a&gt;  &lt;/p&gt;

</description>
      <category>laravel</category>
      <category>carbon</category>
      <category>timezone</category>
      <category>php</category>
    </item>
    <item>
      <title>Build Your Own Laravel API Boilerplate (with Sanctum, Traits &amp; Automation)</title>
      <dc:creator>Mike Birhanu</dc:creator>
      <pubDate>Sat, 17 May 2025 18:41:41 +0000</pubDate>
      <link>https://forem.com/codewithmikee/build-your-own-laravel-api-boilerplate-with-sanctum-traits-automation-529h</link>
      <guid>https://forem.com/codewithmikee/build-your-own-laravel-api-boilerplate-with-sanctum-traits-automation-529h</guid>
      <description>&lt;p&gt;&lt;strong&gt;A step-by-step guide to creating a scalable, maintainable Laravel API starter—using real code, real repos, and real-world patterns.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Why This Guide?&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Consistent API responses&lt;/strong&gt; (no more frontend confusion)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reusable traits&lt;/strong&gt; (DRY, testable code)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extendable base controllers&lt;/strong&gt; (easy to scale)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built-in authentication&lt;/strong&gt; (Sanctum)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automated scaffolding&lt;/strong&gt; (Artisan commands)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Repo links for every step&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1️⃣ &lt;strong&gt;Project Setup: Start Clean&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;a) Create a new Laravel project:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer create-project laravel/laravel my-api
&lt;span class="nb"&gt;cd &lt;/span&gt;my-api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://laravel.com/docs/installation" rel="noopener noreferrer"&gt;Laravel Installation Docs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;b) Add Sanctum for API auth:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer require laravel/sanctum
php artisan vendor:publish &lt;span class="nt"&gt;--provider&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Laravel&lt;/span&gt;&lt;span class="se"&gt;\S&lt;/span&gt;&lt;span class="s2"&gt;anctum&lt;/span&gt;&lt;span class="se"&gt;\S&lt;/span&gt;&lt;span class="s2"&gt;anctumServiceProvider"&lt;/span&gt;
php artisan migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://laravel.com/docs/sanctum" rel="noopener noreferrer"&gt;Sanctum Docs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;c) Set up your API routes:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Edit &lt;code&gt;routes/api.php&lt;/code&gt; and use the &lt;code&gt;auth:sanctum&lt;/code&gt; middleware for protected endpoints:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'auth:sanctum'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/user'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Request&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;user&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2️⃣ &lt;strong&gt;Traits: The Secret to DRY, Consistent APIs&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  a) &lt;strong&gt;HandlesApiResponse&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Standardize every response—success or error.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/codewithmikee/laravel-backend-starter-template/blob/main/app/Concerns/HandlesApiResponse.php" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/Concerns/HandlesApiResponse.php&lt;/span&gt;
&lt;span class="kd"&gt;trait&lt;/span&gt; &lt;span class="nc"&gt;HandlesApiResponse&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;respondSuccess&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;response&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
            &lt;span class="s1"&gt;'success'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'data'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'message'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'errors'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;respondError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;422&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$errors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;response&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
            &lt;span class="s1"&gt;'success'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'data'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'message'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'errors'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$errors&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nv"&gt;$code&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  b) &lt;strong&gt;HandlesValidation&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Centralize validation logic.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/codewithmikee/laravel-backend-starter-template/blob/main/app/Concerns/HandlesValidation.php" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/Concerns/HandlesValidation.php&lt;/span&gt;
&lt;span class="kd"&gt;trait&lt;/span&gt; &lt;span class="nc"&gt;HandlesValidation&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;validateRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Request&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$rules&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$rules&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Usage Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserController&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;BaseApiController&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Request&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;validateRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'email'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'required|email|unique:users'&lt;/span&gt;
        &lt;span class="p"&gt;]);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;respondSuccess&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s1"&gt;'User created'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3️⃣ &lt;strong&gt;Base Controllers: Your API's Foundation&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  a) &lt;strong&gt;BaseApiController&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Centralize traits and error handling.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/codewithmikee/laravel-backend-starter-template/blob/main/app/Http/Controllers/Api/BaseControllers/BaseApiController.php" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BaseApiController&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Controller&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;HandlesApiResponse&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;HandlesValidation&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;handleRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;callable&lt;/span&gt; &lt;span class="nv"&gt;$action&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$successMessage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;$result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$action&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;respondSuccess&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$successMessage&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Throwable&lt;/span&gt; &lt;span class="nv"&gt;$e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;respondError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$e&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getMessage&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  b) &lt;strong&gt;ProtectedApiController&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Auto-protect endpoints with Sanctum.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/codewithmikee/laravel-backend-starter-template/blob/main/app/Http/Controllers/Api/BaseControllers/ProtectedApiController.php" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProtectedApiController&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;BaseApiController&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'auth:sanctum'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Usage Example:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/codewithmikee/laravel-api-boilerplate/blob/main/app/Http/Controllers/Api/ProfileController.php" rel="noopener noreferrer"&gt;ProfileController Example&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProfileController&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;ProtectedApiController&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;respondSuccess&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;user&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="s1"&gt;'Profile loaded'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4️⃣ &lt;strong&gt;Automate with Artisan: No More Boilerplate&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Create a custom command to scaffold controllers, requests, and resources:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan make:api-resource Post
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/codewithmikee/laravel-backend-starter-template/blob/main/app/Console/Commands/MakeApiResource.php" rel="noopener noreferrer"&gt;See Implementation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This generates:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;PostController&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PostResource&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;StorePostRequest&lt;/code&gt; / &lt;code&gt;UpdatePostRequest&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PostPolicy&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5️⃣ &lt;strong&gt;Response Standards: Make Frontend Happy&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Success:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"John"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"User loaded"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"errors"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Error:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Validation failed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"errors"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Invalid email"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6️⃣ &lt;strong&gt;Your Next Steps&lt;/strong&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Clone the &lt;a href="https://github.com/codewithmikee/laravel-backend-starter-template" rel="noopener noreferrer"&gt;boilerplate&lt;/a&gt; or &lt;a href="https://github.com/codewithmikee/laravel-api-boilerplate" rel="noopener noreferrer"&gt;this variant&lt;/a&gt;.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;php artisan serve&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Build your first endpoint in minutes.&lt;/li&gt;
&lt;li&gt;Try the challenge: Add a &lt;code&gt;DELETE /posts/{id}&lt;/code&gt; endpoint with ownership checks (&lt;a href="https://github.com/codewithmikee/laravel-api-boilerplate/blob/main/app/Http/Controllers/Api/PostController.php" rel="noopener noreferrer"&gt;solution here&lt;/a&gt;).&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Why This Works&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No more spaghetti code&lt;/strong&gt;: Traits and base controllers keep things DRY and testable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend-friendly&lt;/strong&gt;: Predictable, consistent responses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Easy to extend&lt;/strong&gt;: Add features without rewriting core logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Battle-tested&lt;/strong&gt;: Used in real projects (&lt;a href="https://github.com/codewithmikee/laravel-backend-starter-template" rel="noopener noreferrer"&gt;see repo stars &amp;amp; issues&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;References &amp;amp; Further Reading&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/codewithmikee/laravel-backend-starter-template" rel="noopener noreferrer"&gt;codewithmikee/laravel-backend-starter-template&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/codewithmikee/laravel-api-boilerplate" rel="noopener noreferrer"&gt;codewithmikee/laravel-api-boilerplate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://laravel.com/docs" rel="noopener noreferrer"&gt;Laravel Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://laravel.com/docs/sanctum" rel="noopener noreferrer"&gt;Sanctum Docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Ready to build? Fork, clone, and make it yours!&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Questions? Open an issue on the repo or reach out to the community.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>sanctum</category>
      <category>showdev</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
