<?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/"
	>

<channel>
	<title>Laravel Tutorial | ServerAvatar</title>
	<atom:link href="https://serveravatar.com/tag/laravel-tutorial/feed/" rel="self" type="application/rss+xml" />
	<link>https://serveravatar.com</link>
	<description>The first, Fully Hybrid Cloud Hosting Solution.</description>
	<lastBuildDate>Wed, 08 Apr 2026 17:21:31 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://serveravatar.com/wp-content/uploads/2025/02/cropped-favicon-32x32.png</url>
	<title>Laravel Tutorial | ServerAvatar</title>
	<link>https://serveravatar.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Complete Guide to Using Controllers and Middleware in Laravel</title>
		<link>https://serveravatar.com/controllers-middleware-laravel/</link>
		
		<dc:creator><![CDATA[Meghna Meghwani]]></dc:creator>
		<pubDate>Wed, 08 Apr 2026 17:20:57 +0000</pubDate>
				<category><![CDATA[Application Deployments]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[Guide]]></category>
		<category><![CDATA[Laravel]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Others]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Controllers in Laravel]]></category>
		<category><![CDATA[laravel]]></category>
		<category><![CDATA[Laravel basics]]></category>
		<category><![CDATA[Laravel Controllers]]></category>
		<category><![CDATA[Laravel Guide]]></category>
		<category><![CDATA[Laravel Middleware]]></category>
		<category><![CDATA[Laravel Tutorial]]></category>
		<category><![CDATA[Middleware in Laravel]]></category>
		<guid isPermaLink="false">https://serveravatar.com/?p=31212</guid>

					<description><![CDATA[<p>Have you ever wondered how modern web applications manage requests so smoothly? When you click a button, submit a form, or access a page, there’s a lot happening behind the scenes. Controllers and Middleware in Laravel play a crucial role in making this process clean, organized, and secure. These powerful tools help handle application logic [&#8230;]</p>
<p>The post <a href="https://serveravatar.com/controllers-middleware-laravel/">Complete Guide to Using Controllers and Middleware in Laravel</a> first appeared on <a href="https://serveravatar.com">ServerAvatar</a>.</p>]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-image size-large"><a href="https://serveravatar.com/?ref=blog" target="_blank" rel=" noreferrer noopener"><img fetchpriority="high" decoding="async" width="1024" height="127" src="https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-1024x127.png" alt="Blog banner - ServerAvatar" class="wp-image-28182" srcset="https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-1024x127.png 1024w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-300x37.png 300w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-768x95.png 768w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-1536x190.png 1536w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-2048x253.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p><br>Have you ever wondered how modern web applications manage requests so smoothly? When you click a button, submit a form, or access a page, there’s a lot happening behind the scenes. Controllers and Middleware in Laravel play a crucial role in making this process clean, organized, and secure. These powerful tools help handle application logic efficiently while ensuring that every request is properly validated and processed.</p>



<p>Think of your Laravel application like a restaurant. Controllers are the chefs preparing your food (handling logic), while middleware acts like the security guard or waiter, ensuring only the right requests get through and everything flows properly.</p>



<p>In this guide, I will break down everything in a simple, beginner-friendly way. No complicated jargon, just clear explanations, practical examples, and useful tips.</p>



<h2 class="wp-block-heading">What is Laravel?</h2>



<p>Laravel is a popular PHP framework used to build web applications quickly and efficiently. It provides a clean structure and ready-made tools so developers don’t have to reinvent the wheel every time.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" width="688" height="203" src="https://serveravatar.com/wp-content/uploads/2026/04/image-54.png" alt="Laravel - Controllers and Middleware in Laravel" class="wp-image-31213" srcset="https://serveravatar.com/wp-content/uploads/2026/04/image-54.png 688w, https://serveravatar.com/wp-content/uploads/2026/04/image-54-300x89.png 300w" sizes="(max-width: 688px) 100vw, 688px" /></figure>
</div>


<p>If you’re building a website or app, Laravel helps you stay organized and write cleaner code.</p>



<h3 class="wp-block-heading">Understanding MVC Architecture</h3>



<p>Laravel is built on the MVC (Model-View-Controller) pattern, which helps organize your code into clear sections. This structure separates data handling, user interface, and application logic, making your project easier to manage. Instead of mixing everything together, MVC ensures each part has a specific responsibility. This not only improves clarity but also makes debugging and scaling your application much easier.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" width="737" height="272" src="https://serveravatar.com/wp-content/uploads/2026/04/image-55.png" alt="MVC Architecture - Controllers and Middleware in Laravel" class="wp-image-31214" srcset="https://serveravatar.com/wp-content/uploads/2026/04/image-55.png 737w, https://serveravatar.com/wp-content/uploads/2026/04/image-55-300x111.png 300w" sizes="(max-width: 737px) 100vw, 737px" /></figure>
</div>


<ul class="wp-block-list">
<li><strong>Model:</strong>&nbsp;Handles all database-related operations and data management.&nbsp;</li>



<li><strong>View:</strong>&nbsp;Displays the data to users through the interface.&nbsp;</li>



<li><strong>Controller:</strong>&nbsp;Acts as a bridge, processing requests and returning responses.</li>
</ul>



<p>Controllers sit right in the middle, acting like a bridge between your data and what users see.</p>



<h2 class="wp-block-heading">What are Controllers in Laravel?</h2>



<p>Controllers in Laravel are responsible for handling the core logic of your application. Instead of writing all logic inside routes, controllers allow you to group related functionality in one place. This keeps your code structured and easy to understand as your application grows. Controllers also make it easier to reuse code and maintain consistency across your project.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="737" height="259" src="https://serveravatar.com/wp-content/uploads/2026/04/image-56.png" alt="controllers - Controllers and Middleware in Laravel" class="wp-image-31215" srcset="https://serveravatar.com/wp-content/uploads/2026/04/image-56.png 737w, https://serveravatar.com/wp-content/uploads/2026/04/image-56-300x105.png 300w" sizes="auto, (max-width: 737px) 100vw, 737px" /></figure>
</div>


<p><strong>This improves:</strong></p>



<ul class="wp-block-list">
<li><strong>Code readability:</strong>&nbsp;Keeps your code clean and easy to follow.&nbsp;</li>



<li><strong>Maintainability:</strong>&nbsp;Makes it easier to update and manage your application.&nbsp;</li>



<li><strong>Scalability:</strong>&nbsp;Allows your application to grow without becoming messy.&nbsp;</li>
</ul>



<p><strong>For example:</strong></p>



<ul class="wp-block-list">
<li><strong>Handling form submissions:</strong>&nbsp;Processes user input from forms.&nbsp;</li>



<li><strong>Fetching data from the database:</strong>&nbsp;Retrieves records when needed.&nbsp;</li>



<li><strong>Returning views or responses:</strong>&nbsp;Sends data back to the user interface.</li>
</ul>



<p>In simple terms, controllers are like the brain of your application.</p>



<h3 class="wp-block-heading">Types of Controllers</h3>



<p>Laravel provides different types of controllers to suit different use cases. Each type is designed to handle specific tasks, helping you write more structured and reusable code. Choosing the right controller type can save time and reduce complexity in your application.</p>



<p><strong>1. Basic Controllers</strong><br>Used for simple tasks where you define custom methods based on your needs.</p>



<p><strong>2. Resource Controllers</strong><br>Designed for handling CRUD operations in a structured and standardized way.</p>



<ul class="wp-block-list">
<li><strong>Create:</strong>&nbsp;Adds new records to the database.&nbsp;</li>



<li><strong>Read:</strong>&nbsp;Retrieves and displays data.&nbsp;</li>



<li><strong>Update:</strong>&nbsp;Modifies existing records.&nbsp;</li>



<li><strong>Delete:</strong>&nbsp;Removes records from the database.&nbsp;</li>
</ul>



<p><strong>3. Single Action Controllers<br></strong>Used when a controller is focused on performing one specific task only. Each type helps you organize your code depending on the complexity of your application.</p>



<h3 class="wp-block-heading">Creating a Controller</h3>



<p>Creating a controller in Laravel is quick and straightforward using the Artisan command-line tool.&nbsp;</p>



<p>With a single command, Laravel generates a ready-to-use controller file in the correct directory. This saves time and ensures consistency in your project structure. Once created, you can start adding your application logic inside it.</p>



<p>Run the below command:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>php artisan make:controller UserController</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">php</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">artisan</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">make:controller</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">UserController</span></span></code></pre></div>



<p>This creates a file inside:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>app/Http/Controllers/UserController.php</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">app/Http/Controllers/UserController.php</span></span></code></pre></div>



<p>Now you’re ready to start writing your logic.</p>



<h3 class="wp-block-heading">Resource Controllers Explained</h3>



<p>Resource controllers are built specifically to handle CRUD operations efficiently. Instead of writing separate methods manually, Laravel automatically generates them for you. This not only speeds up development but also keeps your code consistent across projects.&nbsp;</p>



<p>You can create one using below command:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>php artisan make:controller BookController --resource</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">php</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">artisan</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">make:controller</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">BookController</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">--resource</span></span></code></pre></div>



<p>You can even generate all related routes with a single line of code, making your workflow much smoother.</p>



<ul class="wp-block-list">
<li><strong>index():</strong>&nbsp;Displays a list of all records.&nbsp;</li>



<li><strong>create():</strong>&nbsp;Shows a form to create new data.&nbsp;</li>



<li><strong>store():</strong>&nbsp;Saves new data into the database.&nbsp;</li>



<li><strong>show():</strong>&nbsp;Displays a single record.&nbsp;</li>



<li><strong>edit():</strong>&nbsp;Shows a form to edit existing data.&nbsp;</li>



<li><strong>update():</strong>&nbsp;Updates the selected record.&nbsp;</li>



<li><strong>destroy():</strong>&nbsp;Deletes a record from the database.</li>
</ul>



<p>Laravel can also auto-generate routes using:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Route::resource('books', BookController::class);</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">Route::resource(</span><span style="color: #DCDCAA">&#39;books&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">BookController::class</span><span style="color: #D4D4D4">);</span></span></code></pre></div>



<p>This single line creates multiple routes automatically.</p>



<h3 class="wp-block-heading">Controller-Model Binding</h3>



<p>Controller-model binding is a powerful feature in Laravel that automatically connects route parameters to database records. Instead of writing manual queries, Laravel fetches the correct data for you. This reduces code repetition and improves efficiency. It also makes your code cleaner and easier to read, especially in larger applications.</p>



<p>Instead of writing extra queries:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public function show($id) {
    $book = Book::where('id', $id)->get();
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">public</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">function</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">show</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$id</span><span style="color: #D4D4D4">) </span><span style="color: #CE9178">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$book</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">=</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">Book::where</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">&#39;id&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$id</span><span style="color: #D4D4D4">)-&gt;</span><span style="color: #CE9178">get</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p>You can simply write:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public function show(Book $book) {
    return view('book', compact('book'));
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">public</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">function</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">show</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">Book</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$book</span><span style="color: #D4D4D4">) </span><span style="color: #CE9178">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">view</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">&#39;book&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">compact</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">&#39;book&#39;</span><span style="color: #D4D4D4">));</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p>Laravel automatically fetches the data for you, reducing code and improving efficiency.&nbsp;</p>



<h3 class="wp-block-heading">Controller Methods and Routing</h3>



<p>Controllers and routes work together to handle user requests efficiently. You define a route and link it to a specific controller method that performs the required action. This approach keeps your routes simple while moving the logic into controllers. As a result, your application becomes more organized and easier to maintain.</p>



<p>Example:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Route::get('/users', &#91;UserController::class, 'index'&#93;);</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">Route::get(</span><span style="color: #DCDCAA">&#39;/users&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> &#91;UserController::class, </span><span style="color: #CE9178">&#39;index&#39;&#93;</span><span style="color: #D4D4D4">);</span></span></code></pre></div>



<p>Here:</p>



<ul class="wp-block-list">
<li><strong>/users:</strong>&nbsp;Represents the URL endpoint accessed by users.&nbsp;</li>



<li><strong>index:</strong>&nbsp;Refers to the method inside the controller that handles the request.</li>
</ul>



<p>This keeps your routes clean and your logic organized.</p>



<h3 class="wp-block-heading">Passing Data from Controller to View</h3>



<p>Controllers often pass data to views so it can be displayed to users. This allows dynamic content to appear on your web pages based on logic or database results. Laravel makes this process simple using built-in helper functions. It ensures smooth communication between backend logic and frontend display.</p>



<p>Example:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public function index() {
    $users = &#91;'John', 'Jane', 'Doe'&#93;;
    return view('users', compact('users'));
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">public</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">function</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">index</span><span style="color: #D4D4D4">() </span><span style="color: #CE9178">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$users</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">=</span><span style="color: #D4D4D4"> &#91;</span><span style="color: #CE9178">&#39;John&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;Jane&#39;,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;Doe&#39;&#93;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">view</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">&#39;users&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">compact</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">&#39;users&#39;</span><span style="color: #D4D4D4">));</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p>Now your view can display this data easily.</p>



<h2 class="wp-block-heading">What is Middleware in Laravel?</h2>



<p>Middleware acts as a layer between the incoming request and your application. It checks whether a request should proceed further or be blocked. This is useful for handling authentication, permissions, and request validation. In simple terms, middleware ensures that only valid requests reach your controllers.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="683" height="238" src="https://serveravatar.com/wp-content/uploads/2026/04/image-57.png" alt="Middleware - Controllers and Middleware in Laravel" class="wp-image-31216" srcset="https://serveravatar.com/wp-content/uploads/2026/04/image-57.png 683w, https://serveravatar.com/wp-content/uploads/2026/04/image-57-300x105.png 300w" sizes="auto, (max-width: 683px) 100vw, 683px" /></figure>
</div>


<ul class="wp-block-list">
<li><strong>Checks requests before controller:</strong>&nbsp;Ensures conditions are met before processing.&nbsp;</li>



<li><strong>Allows or blocks access:</strong>&nbsp;Controls whether a user can proceed.&nbsp;</li>



<li><strong>Modifies requests:</strong>&nbsp;Can change request data before passing it forward.&nbsp;</li>



<li><strong>Handles authentication:</strong>&nbsp;Verifies if the user is logged in.&nbsp;</li>



<li><strong>Logs activity:</strong>&nbsp;Tracks requests for monitoring or debugging.&nbsp;</li>
</ul>



<p><strong>For example:</strong></p>



<ul class="wp-block-list">
<li><strong>Authentication:</strong>&nbsp;Confirms whether a user is logged in.&nbsp;</li>



<li><strong>Authorization:</strong>&nbsp;It checks permission to access a resource for user.&nbsp;</li>
</ul>



<h3 class="wp-block-heading">How Middleware Works</h3>



<p>Middleware follows a simple flow that ensures every request is validated before processing. It acts as a checkpoint system that either allows the request to move forward or stops it. This helps maintain security and proper access control in your application.</p>



<ul class="wp-block-list">
<li><strong>User sends a request:</strong>&nbsp;A request is initiated by the user.&nbsp;</li>



<li><strong>Middleware checks it:</strong>&nbsp;The request is validated against rules.&nbsp;</li>



<li><strong>If valid:</strong>&nbsp;The request is passed to the controller.&nbsp;</li>



<li><strong>If not:</strong>&nbsp;The request is blocked or redirected.&nbsp;</li>
</ul>



<p><strong>Laravel includes built-in middleware like:</strong></p>



<ul class="wp-block-list">
<li><strong>auth:</strong>&nbsp;Verifies user authentication.&nbsp;</li>



<li><strong>throttle:</strong>&nbsp;Limits the number of requests to prevent abuse.</li>
</ul>



<h3 class="wp-block-heading">Types of Middleware</h3>



<p>Laravel provides different types of middleware to handle various scenarios. Each type is designed for a specific level of control, whether it’s global or route-specific. Using the right type ensures efficient request handling.</p>



<p><strong>1. Global Middleware<br></strong>Runs automatically on every request in the application.</p>



<p><strong>2. Route Middleware<br></strong>Applied only to specific routes where needed.</p>



<p><strong>3. Group Middleware<br></strong>Used to apply middleware to a group of routes at once.</p>



<p>Each type helps control access in different ways.</p>



<h3 class="wp-block-heading">Creating Middleware</h3>



<p>Creating middleware in Laravel is simple using the Artisan command. Laravel generates a dedicated file where you can define your custom logic. This allows you to control how requests are handled before reaching controllers. It’s especially useful for implementing rules like age checks, authentication, or logging.</p>



<p>You can create middleware using:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>php artisan make:middleware CheckAge</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">php</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">artisan</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">make:middleware</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">CheckAge</span></span></code></pre></div>



<p>This creates a file in:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>app/Http/Middleware/CheckAge.php</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">app/Http/Middleware/CheckAge.php</span></span></code></pre></div>



<p>Inside, you define the logic:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public function handle($request, Closure $next) {
    if ($request->age &lt; 18) {
        return redirect('home');
    }
    return $next($request);
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">public</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">function</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">handle</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">, Closure </span><span style="color: #9CDCFE">$next</span><span style="color: #D4D4D4">) </span><span style="color: #CE9178">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">-&gt;age &lt; 18) {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">redirect</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">&#39;home&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$next</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h3 class="wp-block-heading">Registering Middleware</h3>



<p>After creating middleware, you need to register it so Laravel can recognize and use it. This is done in the Kernel file, where all middleware are defined. Registration allows you to assign a short name (alias) to your middleware. This makes it easier to apply it across routes and controllers.</p>



<p>Go to:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>app/Http/Kernel.php</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">app/Http/Kernel.php</span></span></code></pre></div>



<p>Add your middleware:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>protected $routeMiddleware = &#91;
    'checkAge' => \App\Http\Middleware\CheckAge::class,
&#93;;</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">protected</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$routeMiddleware</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">=</span><span style="color: #D4D4D4"> &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">&#39;checkAge&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #D7BA7D">\A</span><span style="color: #CE9178">pp</span><span style="color: #D7BA7D">\H</span><span style="color: #CE9178">ttp</span><span style="color: #D7BA7D">\M</span><span style="color: #CE9178">iddleware</span><span style="color: #D7BA7D">\C</span><span style="color: #CE9178">heckAge::class,</span></span>
<span class="line"><span style="color: #D4D4D4">&#93;;</span></span></code></pre></div>



<h3 class="wp-block-heading">Applying Middleware to Routes</h3>



<p>Once middleware is registered, you can apply it to specific routes or controllers. This ensures only authorized requests can access certain parts of your application. Laravel provides flexible ways to apply middleware depending on your needs. This helps maintain both security and control over your application flow.</p>



<p>To apply middleware to routes:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Route::get('/profile', function () {
    //
})->middleware('checkAge');</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">Route::get(</span><span style="color: #DCDCAA">&#39;/profile&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">function</span><span style="color: #D4D4D4"> () {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">//</span></span>
<span class="line"><span style="color: #D4D4D4">})-&gt;middleware(&#39;checkAge&#39;);</span></span></code></pre></div>



<p>Or to a controller:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public function __construct() {
    $this->middleware('checkAge');
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">public</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">function</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">__construct</span><span style="color: #D4D4D4">() </span><span style="color: #CE9178">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$this</span><span style="color: #D4D4D4">-&gt;middleware(</span><span style="color: #DCDCAA">&#39;checkAge&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h3 class="wp-block-heading">Middleware in Controllers</h3>



<p>Middleware can also be applied directly inside controllers using constructors. This ensures that all methods within the controller follow the same rules. It’s a clean and efficient way to secure multiple routes at once. Laravel also supports inline middleware, which is useful for small and quick tasks.</p>



<h2 class="wp-block-heading">Middleware vs Controllers</h2>



<p>Middleware and controllers serve different but complementary roles in Laravel. Middleware acts as a filter that checks requests before they are processed. Controllers, on the other hand, handle the actual business logic and return responses. Together, they create a structured and secure workflow.</p>



<p>Let’s clear the confusion:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center"><strong>Feature</strong></td><td class="has-text-align-center" data-align="center"><strong>Controller</strong></td><td class="has-text-align-center" data-align="center"><strong>Middleware</strong></td></tr><tr><td class="has-text-align-center" data-align="center"><strong>Purpose</strong></td><td class="has-text-align-center" data-align="center">Handles logic</td><td class="has-text-align-center" data-align="center">Filters requests</td></tr><tr><td class="has-text-align-center" data-align="center"><strong>Role</strong></td><td class="has-text-align-center" data-align="center">Processes data</td><td class="has-text-align-center" data-align="center">Controls access</td></tr><tr><td class="has-text-align-center" data-align="center"><strong>Timing</strong></td><td class="has-text-align-center" data-align="center">After request</td><td class="has-text-align-center" data-align="center">Before/after request</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">Best Practices</h2>



<p>Following best practices helps you write clean, efficient, and scalable Laravel applications. Keeping your code organized ensures long-term maintainability and better performance.</p>



<ul class="wp-block-list">
<li><strong>Keep controllers clean:</strong>&nbsp;Avoid adding too much logic in one place.&nbsp;</li>



<li><strong>Use middleware for security checks:</strong>&nbsp;Handle validation and access control separately.&nbsp;</li>



<li><strong>Follow naming conventions:</strong>&nbsp;Maintain consistency across your project.&nbsp;</li>



<li><strong>Use resource controllers:</strong>&nbsp;Simplify CRUD operations with standard methods.&nbsp;</li>



<li><strong>Avoid duplicating code:</strong>&nbsp;Reuse logic wherever possible.</li>
</ul>



<p>Clean code is easier to maintain and scale.</p>



<h2 class="wp-block-heading">Common Mistakes to Avoid</h2>



<p>Avoiding common mistakes can save you time and prevent issues as your application grows. Poor structure and misuse of features can make your code difficult to manage. Staying mindful of these pitfalls helps maintain a clean and efficient codebase.</p>



<ul class="wp-block-list">
<li><strong>Putting too much logic in routes:</strong>&nbsp;Makes your code messy and hard to manage.&nbsp;</li>



<li><strong>Overloading controllers:</strong>&nbsp;Reduces readability and maintainability.&nbsp;</li>



<li><strong>Misusing middleware:</strong>&nbsp;Can lead to unnecessary complexity.&nbsp;</li>



<li><strong>Not organizing files properly:</strong>&nbsp;Makes navigation and debugging difficult.</li>
</ul>



<p>Avoid these, and your Laravel app will stay smooth and manageable.</p>



<figure class="wp-block-image size-large"><a href="https://serveravatar.com/?ref=blog" target="_blank" rel=" noreferrer noopener"><img loading="lazy" decoding="async" width="1024" height="127" src="https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-1024x127.png" alt="Blog banner - ServerAvatar" class="wp-image-28184" srcset="https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-1024x127.png 1024w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-300x37.png 300w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-768x95.png 768w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-1536x190.png 1536w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-2048x254.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<h2 class="wp-block-heading">Deploying Laravel Applications Made Easy with ServerAvatar</h2>



<p>While understanding controllers and middleware is essential for building a Laravel application, managing and deploying that application on a live server is equally important. This is where ServerAvatar simplifies the entire process.</p>



<p>Once your Laravel application is ready, ServerAvatar makes it easy to deploy and manage it without worrying about server setup.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="1024" height="473" src="https://serveravatar.com/wp-content/uploads/2026/04/image-58.png" alt="ServerAvatar Dashboard - Controllers and Middleware in Laravel" class="wp-image-31217" srcset="https://serveravatar.com/wp-content/uploads/2026/04/image-58.png 1024w, https://serveravatar.com/wp-content/uploads/2026/04/image-58-300x139.png 300w, https://serveravatar.com/wp-content/uploads/2026/04/image-58-768x355.png 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p><a href="https://serveravatar.com/" target="_blank" rel="noreferrer noopener">ServerAvatar</a>&nbsp;is a powerful server and application deployment and management platform that allows developers to deploy and manage Laravel applications without dealing with complex server configurations. Instead of manually setting up your environment, you can launch and manage your Laravel projects with just a few clicks.</p>



<p>With ServerAvatar, you can:</p>



<ul class="wp-block-list">
<li>Deploy Laravel, PHP, and Node.js–based applications quickly without manual setup&nbsp;</li>



<li>Manage servers, applications, databases, security features, server services, and configurations from a single dashboard&nbsp;</li>



<li>Monitor logs and performance to debug issues efficiently&nbsp;</li>



<li>Use staging environments to test changes before going live&nbsp;</li>
</ul>



<p>This means you can focus more on writing clean controllers and middleware while ServerAvatar handles the server-side complexity.</p>



<h2 class="wp-block-heading">Conclusion</h2>



<p>Understanding how controllers and middleware work in Laravel gives you a strong foundation for building well-structured and secure web applications. Controllers help you organize your application logic, while middleware ensures that every request is properly validated before it reaches your core functionality. When used together, they create a clean and efficient workflow that improves both performance and maintainability. As your application grows, having the right tools for deployment also becomes essential, and platforms like ServerAvatar make it easier to manage, deploy, and scale your Laravel projects without dealing with complex server configurations.</p>



<h2 class="wp-block-heading">FAQs</h2>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question">1. What is the role of a controller in Laravel?</h3><div class="aioseo-faq-block-answer">
<p>A controller in Laravel handles the application logic by processing user requests, interacting with models, and returning responses such as views or data.</p>
</div></div>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question">2. What is middleware in Laravel?</h3><div class="aioseo-faq-block-answer">
<p>Middleware acts as a filter between the request and the application, checking conditions like authentication, permissions, or request validity before allowing access.</p>
</div></div>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question">3. What is the difference between controllers and middleware?</h3><div class="aioseo-faq-block-answer">
<p>Controllers manage the business logic of your application, while middleware handles request validation and filtering before the request reaches the controller.</p>
</div></div>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question">4. When should I use middleware in Laravel?</h3><div class="aioseo-faq-block-answer">
<p>You should use middleware when you need to control access, validate requests, handle authentication, or apply rules before processing a request.</p>
</div></div>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question">5. What are resource controllers in Laravel?</h3><div class="aioseo-faq-block-answer">
<p>Resource controllers provide a structured way to handle CRUD operations using predefined methods like index, create, store, show, update, and destroy.</p>
</div></div><p>The post <a href="https://serveravatar.com/controllers-middleware-laravel/">Complete Guide to Using Controllers and Middleware in Laravel</a> first appeared on <a href="https://serveravatar.com">ServerAvatar</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Laravel Validation Rules: How to Create and Use Them</title>
		<link>https://serveravatar.com/laravel-validation/</link>
		
		<dc:creator><![CDATA[Meghna Meghwani]]></dc:creator>
		<pubDate>Thu, 12 Mar 2026 06:31:19 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Guide]]></category>
		<category><![CDATA[Laravel]]></category>
		<category><![CDATA[Others]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[laravel]]></category>
		<category><![CDATA[Laravel Form Validation]]></category>
		<category><![CDATA[Laravel Guide]]></category>
		<category><![CDATA[Laravel Input Validation]]></category>
		<category><![CDATA[Laravel Tutorial]]></category>
		<category><![CDATA[Laravel Validation]]></category>
		<category><![CDATA[Laravel Validation Rules]]></category>
		<guid isPermaLink="false">https://serveravatar.com/?p=30854</guid>

					<description><![CDATA[<p>Handling user input is a common part of building web applications. When users submit data through forms, APIs, or other interfaces, the application must ensure that the information meets specific requirements before processing it. This is where Laravel Validation becomes essential, as it helps verify that submitted data follows the expected rules before it is [&#8230;]</p>
<p>The post <a href="https://serveravatar.com/laravel-validation/">Laravel Validation Rules: How to Create and Use Them</a> first appeared on <a href="https://serveravatar.com">ServerAvatar</a>.</p>]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-image size-large"><a href="https://serveravatar.com/?ref=blog" target="_blank" rel=" noreferrer noopener"><img loading="lazy" decoding="async" width="1024" height="127" src="https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-1024x127.png" alt="Blog banner - ServerAvatar" class="wp-image-28182" srcset="https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-1024x127.png 1024w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-300x37.png 300w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-768x95.png 768w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-1536x190.png 1536w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-2048x253.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Handling user input is a common part of building web applications. When users submit data through forms, APIs, or other interfaces, the application must ensure that the information meets specific requirements before processing it. This is where Laravel Validation becomes essential, as it helps verify that submitted data follows the expected rules before it is accepted by the system. If invalid data enters the system, it can lead to application errors, inconsistent records, or unexpected behavior.</p>



<p>This is where Laravel Validation Rules play an important role. Validation rules allow developers to define the conditions that input data must satisfy before it is accepted by the application.</p>



<p>Laravel provides a powerful and flexible validation system that makes it easy to enforce these rules. With only a few lines of code, developers can ensure that submitted data follows the expected format, length, or structure.</p>



<p>In this guide, we will explore Laravel Validation Rules, how they work, how to create them, and how to use them effectively in Laravel applications.</p>



<h2 class="wp-block-heading">Understanding Laravel Validation Rules</h2>



<p>Laravel Validation Rules define the conditions that input data must meet before the application processes it. These rules ensure that the submitted data follows the expected format and structure.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="684" height="261" src="https://serveravatar.com/wp-content/uploads/2026/03/image-95.png" alt="Laravel Validation rules" class="wp-image-30855" srcset="https://serveravatar.com/wp-content/uploads/2026/03/image-95.png 684w, https://serveravatar.com/wp-content/uploads/2026/03/image-95-300x114.png 300w" sizes="auto, (max-width: 684px) 100vw, 684px" /></figure>
</div>


<p>Laravel provides many built-in rules that can validate:</p>



<ul class="wp-block-list">
<li><strong>Required fields:&nbsp;</strong>Ensures that a specific field must be present in the request and cannot be left empty.</li>



<li><strong>Email format:&nbsp;</strong>Checks whether the entered value follows the correct structure of an email address.</li>



<li><strong>Numeric values:&nbsp;</strong>Verifies that the input contains only numbers and is treated as a numeric value.</li>



<li><strong>Minimum or maximum length:&nbsp;</strong>Defines the allowed range for the length or value of the input data.</li>



<li><strong>Unique database values:</strong>&nbsp;Confirms that the submitted value does not already exist in a specified database table.</li>
</ul>



<p>Developers can apply multiple validation rules to a single field to enforce strict data requirements.</p>



<p>Example:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>'name' => 'required|string|max:255'</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #CE9178">&#39;name&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;required|string|max:255&#39;</span></span></code></pre></div>



<p>This rule means:</p>



<ul class="wp-block-list">
<li>The field must be present</li>



<li>The value must be a string</li>



<li>The value must not exceed 255 characters</li>
</ul>



<p>Laravel automatically evaluates these rules when the request is processed.</p>



<h3 class="wp-block-heading">Why Validation Is Important in Laravel Applications</h3>



<p>Validation is a critical part of application development because it ensures that only valid data is accepted by the system.</p>



<p>Laravel includes a robust validation system that helps developers verify incoming data before it is processed or stored. By defining validation rules, developers can ensure that inputs follow specific requirements such as format, length, or structure.</p>



<p>Without proper validation, applications may encounter issues such as:</p>



<ul class="wp-block-list">
<li><strong>Application errors:&nbsp;</strong>Incorrect data types or missing fields can cause logic failures in the application.</li>



<li><strong>Database inconsistencies:&nbsp;</strong>Invalid data stored in the database can affect queries and system functionality.</li>



<li><strong>Security risks:&nbsp;</strong>Unvalidated input may expose the application to malicious or unexpected data.</li>



<li><strong>Unreliable system behavior:&nbsp;</strong>Applications depend on predictable data formats, and validation ensures consistency.</li>
</ul>



<p>By applying Laravel Validation Rules, developers maintain data quality and system reliability.</p>



<h3 class="wp-block-heading">How Laravel Validation Works</h3>



<p>Laravel validation typically follows a straightforward workflow.</p>



<ul class="wp-block-list">
<li>A request containing input data is sent to the application</li>



<li>Validation rules are applied to the request data</li>



<li>Laravel checks whether the data satisfies the defined rules</li>



<li>If validation fails, the application returns error messages</li>



<li>If validation passes, the request proceeds to the next step</li>
</ul>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="684" height="157" src="https://serveravatar.com/wp-content/uploads/2026/03/image-96.png" alt="Laravel Validation working" class="wp-image-30856" srcset="https://serveravatar.com/wp-content/uploads/2026/03/image-96.png 684w, https://serveravatar.com/wp-content/uploads/2026/03/image-96-300x69.png 300w" sizes="auto, (max-width: 684px) 100vw, 684px" /></figure>
</div>


<p>Laravel provides multiple methods for validating data, including:</p>



<ul class="wp-block-list">
<li><strong>Controller validation:&nbsp;</strong>Allows validation rules to be defined directly inside controller methods before processing the request.</li>



<li><strong>Validator facade:&nbsp;</strong>Provides a flexible way to create validation instances and manually handle validation results.</li>



<li><strong>Form request validation:&nbsp;</strong>Uses dedicated request classes to organize and manage validation rules separately from controllers.</li>



<li><strong>Custom validation rules:&nbsp;</strong>Allows developers to create their own validation logic when built-in rules do not meet specific requirements.</li>
</ul>



<p>Each method allows developers to apply validation depending on the complexity of the application.</p>



<h2 class="wp-block-heading">Basic Laravel Validation Rules</h2>



<p>When building applications with Laravel, verifying user input is an essential development step. Laravel simplifies this process by providing a flexible validation system that allows developers to define rules for incoming data.</p>



<p>These validation rules ensure that submitted values match the expected format or conditions before the application processes them. Developers can apply these rules directly in controllers, use dedicated Form Request classes, or define custom rule objects for more complex scenarios.</p>



<p>Each approach allows validation logic to be implemented efficiently while keeping application code clean and structured. Laravel’s validation system supports a wide variety of rules designed to handle common input validation requirements. Some commonly used rules include:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center"><strong>Rule</strong></td><td class="has-text-align-center" data-align="center"><strong>Description</strong></td></tr><tr><td class="has-text-align-center" data-align="center"><strong>required</strong></td><td class="has-text-align-center" data-align="center">Ensures the field exists in the request data</td></tr><tr><td class="has-text-align-center" data-align="center"><strong>numeric</strong></td><td class="has-text-align-center" data-align="center">Validates that the value is a number</td></tr><tr><td class="has-text-align-center" data-align="center"><strong>email</strong></td><td class="has-text-align-center" data-align="center">Checks whether the value follows a valid email format</td></tr><tr><td class="has-text-align-center" data-align="center"><strong>alpha</strong></td><td class="has-text-align-center" data-align="center">Allows only alphabetic characters</td></tr><tr><td class="has-text-align-center" data-align="center"><strong>min</strong></td><td class="has-text-align-center" data-align="center">Defines the minimum value or minimum length</td></tr><tr><td class="has-text-align-center" data-align="center"><strong>max</strong></td><td class="has-text-align-center" data-align="center">Defines the maximum allowed value or length</td></tr><tr><td class="has-text-align-center" data-align="center"><strong>unique</strong></td><td class="has-text-align-center" data-align="center">Ensures that the value does not already exist in a database table</td></tr><tr><td class="has-text-align-center" data-align="center"><strong>confirmed</strong></td><td class="has-text-align-center" data-align="center">Requires a matching confirmation field for validation</td></tr></tbody></table></figure>



<p><strong>1) required:&nbsp;</strong>Ensures the field exists and is not empty.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>'username' => 'required'</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #CE9178">&#39;username&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;required&#39;</span></span></code></pre></div>



<p><strong>2) email:&nbsp;</strong>Validates that the value follows the correct email format.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>'email' => 'required|email'</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #CE9178">&#39;email&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;required|email&#39;</span></span></code></pre></div>



<p><strong>3) min:&nbsp;</strong>Defines the minimum length or numeric value.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>'password' => 'required|min:8'</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #CE9178">&#39;password&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;required|min:8&#39;</span></span></code></pre></div>



<p><strong>4) max:&nbsp;</strong>Specifies the maximum allowed length.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>'title' => 'required|max:100'</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #CE9178">&#39;title&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;required|max:100&#39;</span></span></code></pre></div>



<p><strong>5) numeric:&nbsp;</strong>Ensures that the value contains only numbers.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>'age' => 'required|numeric'</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #CE9178">&#39;age&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;required|numeric&#39;</span></span></code></pre></div>



<p>Multiple rules can be combined using the pipe (|) separator.</p>



<h3 class="wp-block-heading">Implementing Validation in Controllers</h3>



<p><strong>What Are Controllers in Laravel?</strong></p>



<p>In Laravel, controllers are classes that handle the logic of incoming requests. They act as a middle layer between your application’s routes and the business logic, helping you organize code in a clean and reusable way. Instead of placing all logic in routes, controllers let you keep your application structured.</p>



<p>For example, a UserController could manage user registration, login, and profile updates—all in a single, organized place.</p>



<p><strong>Implementing Validation:</strong></p>



<p>Laravel allows validation directly inside controller methods. This approach is simple and commonly used in smaller applications.</p>



<p>Example:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public function store(Request $request)
{
    $request->validate(&#91;
        'name' => 'required|max:255',
        'email' => 'required|email',
        'password' => 'required|min:8'
    &#93;);

    // Process request
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">store</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">Request</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">validate</span><span style="color: #D4D4D4">(&#91;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;name&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;required|max:255&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;email&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;required|email&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;password&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;required|min:8&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">    &#93;);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">// Process request</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p>If validation fails:</p>



<ul class="wp-block-list">
<li>Laravel automatically redirects the request</li>



<li>Error messages are returned to the session</li>



<li>The user can correct the input and resubmit the request</li>
</ul>



<p>This built-in mechanism simplifies input validation significantly.</p>



<h3 class="wp-block-heading">Implementing Validation Using the Validator Facade</h3>



<p>Another method for validation is using Laravel&#8217;s Validator facade.</p>



<p>In Laravel, a facade is a class that provides a simple, static interface to a service in the framework’s service container. The Validator<strong>&nbsp;</strong>facade gives you access to Laravel’s powerful validation functionality without directly relying on controller methods.</p>



<p>Using the Validator facade allows developers to:</p>



<ul class="wp-block-list">
<li>Validate data anywhere in the application, not just in controllers</li>



<li>Handle validation manually, giving more flexibility over redirects and error messages</li>



<li>Apply complex or conditional validation logic</li>
</ul>



<p>Here’s an example of how to use the Validator facade to validate a request:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>use Illuminate\Support\Facades\Validator;

$validator = Validator::make($request->all(), &#91;
    'title' => 'required|max:255',
    'content' => 'required'
&#93;);</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">use</span><span style="color: #D4D4D4"> Illuminate\Support\Facades\</span><span style="color: #4EC9B0">Validator</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #9CDCFE">$validator</span><span style="color: #D4D4D4"> = </span><span style="color: #4EC9B0">Validator</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">make</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">all</span><span style="color: #D4D4D4">(), &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&#39;title&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;required|max:255&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&#39;content&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;required&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">&#93;);</span></span></code></pre></div>



<p>After creating the validator instance, developers can check if validation fails.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>if ($validator->fails()) {
    return redirect()->back()->withErrors($validator);
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$validator</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">fails</span><span style="color: #D4D4D4">()) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">redirect</span><span style="color: #D4D4D4">()-&gt;</span><span style="color: #DCDCAA">back</span><span style="color: #D4D4D4">()-&gt;</span><span style="color: #DCDCAA">withErrors</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$validator</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p>The Validator facade provides greater control over how validation errors are handled.</p>



<h3 class="wp-block-heading">Frequently Used Laravel Validation Rules</h3>



<p>Laravel includes many validation rules designed for specific scenarios. Some commonly used rules include:</p>



<p><strong>1) unique:&nbsp;</strong>Ensures the value does not already exist in a database table.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>'email' => 'unique:users'</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #CE9178">&#39;email&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;unique:users&#39;</span></span></code></pre></div>



<p><strong>2) confirmed:&nbsp;</strong>Validates that two fields contain the same value.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>'password' => 'confirmed'</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #CE9178">&#39;password&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;confirmed&#39;</span></span></code></pre></div>



<p>This rule expects a corresponding field:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>password_confirmation</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">password_confirmation</span></span></code></pre></div>



<p><strong>3) date: </strong>Ensures the input is a valid date.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>'start_date' => 'date'</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #CE9178">&#39;start_date&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;date&#39;</span></span></code></pre></div>



<p><strong>4) url:</strong> Ensures the value is a properly formatted URL.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>'website' => 'url'</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #CE9178">&#39;website&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;url&#39;</span></span></code></pre></div>



<p>These rules help maintain data accuracy within Laravel applications.</p>



<h2 class="wp-block-heading">Creating Custom Validation Rules</h2>



<p>Built-in validation rules handle many common cases, but some applications require additional validation logic.</p>



<p>Laravel allows developers to create&nbsp;<strong>custom validation rules</strong>&nbsp;using the Artisan command:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>php artisan make:rule CustomRule</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">php</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">artisan</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">make:rule</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">CustomRule</span></span></code></pre></div>



<p>This command generates a rule class where custom validation logic can be defined.</p>



<p>Example structure:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public function passes($attribute, $value)
{
    return strlen($value) > 5;
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">passes</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$attribute</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">$value</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">strlen</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$value</span><span style="color: #D4D4D4">) &gt; </span><span style="color: #B5CEA8">5</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p>Custom rules make it possible to implement validation requirements specific to an application.</p>



<h2 class="wp-block-heading">Form Request Validation in Laravel</h2>



<p>As Laravel applications grow, placing validation rules directly in controllers can make the code difficult to maintain. To solve this, Laravel provides Form Request Validation, which allows validation logic to be stored in dedicated classes.</p>



<p>Form Request classes help centralize validation rules for specific HTTP requests. Instead of repeating validation logic across multiple controllers, developers can define the rules once in a request class and reuse them wherever needed.</p>



<p>Laravel provides Form Request Validation to organize validation rules into dedicated request classes.</p>



<h3 class="wp-block-heading">Generating and Implementing Form Request Classes</h3>



<p>Laravel makes it simple to create Form Request classes using the Artisan command-line tool.</p>



<p><strong>Step 1: Generate a Form Request Class</strong></p>



<p>Run the following command:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>php artisan make:request MyFormRequest</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">php</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">artisan</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">make:request</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">MyFormRequest</span></span></code></pre></div>



<p>This command creates a new request class inside the&nbsp;<strong>App\Http\Requests</strong>&nbsp;directory.</p>



<p>Inside the generated class, Laravel provides a&nbsp;<strong>rules()</strong>&nbsp;method where validation rules can be defined.</p>



<p><strong>Example:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public function rules()
{
    return &#91;
        'name' => 'required|string|max:255',
        'email' => 'required|email|unique:users'
    &#93;;
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">rules</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;name&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;required|string|max:255&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;email&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;required|email|unique:users&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">    &#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p><strong>Step 2: Use the Form Request in a Controller</strong></p>



<p>Once the request class is created, it can be used directly in a controller method.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>use App\Http\Requests\MyFormRequest;

public function store(MyFormRequest $request)
{
    // Validation has already been applied
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">use</span><span style="color: #D4D4D4"> App\Http\Requests\</span><span style="color: #4EC9B0">MyFormRequest</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">store</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">MyFormRequest</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">// Validation has already been applied</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p>Laravel automatically validates the request before the controller logic executes.</p>



<h3 class="wp-block-heading">Authorizing Requests in Form Request Classes</h3>



<p>Form Request classes also include an&nbsp;authorization mechanism&nbsp;that allows developers to determine whether a request should proceed.</p>



<p>This logic is defined inside the&nbsp;<strong>authorize()</strong>&nbsp;method.</p>



<p><strong>Example:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public function authorize()
{
    return true;
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">authorize</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p>If the method returns false, Laravel automatically blocks the request and returns a 403 Forbidden response.</p>



<p>This feature allows validation and authorization checks to be handled within the same request class.</p>



<h2 class="wp-block-heading">Handling Validation Error Messages</h2>



<p>Laravel automatically generates validation error messages when rules fail.</p>



<p>These errors can be accessed in Blade templates.</p>



<p><strong>Example:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>@error('email')
    &lt;div>{{ $message }}&lt;/div>
@enderror</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">@error</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;email&#39;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span><span style="color: #DCDCAA">{{</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$message</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">}}</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #569CD6">@enderror</span></span></code></pre></div>



<p><strong>To display all errors:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>@if ($errors->any())
    &lt;ul>
        @foreach ($errors->all() as $error)
            &lt;li>{{ $error }}&lt;/li>
        @endforeach
    &lt;/ul>
@endif</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">@if </span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$errors</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">any</span><span style="color: #D4D4D4">())</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">ul</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">@foreach </span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$errors</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">all</span><span style="color: #D4D4D4">() as </span><span style="color: #9CDCFE">$error</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">li</span><span style="color: #808080">&gt;</span><span style="color: #DCDCAA">{{</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$error</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">}}</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">li</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">@endforeach</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">ul</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #569CD6">@endif</span></span></code></pre></div>



<p>Laravel also allows developers to define&nbsp;custom error messages&nbsp;for better clarity.</p>



<h3 class="wp-block-heading">Customizing Validation Error Messages</h3>



<p>Laravel automatically generates validation error messages when a rule fails. However, developers may want to define custom messages for better clarity.</p>



<p>Form Request classes allow customization through the&nbsp;<strong>messages()</strong>&nbsp;method.</p>



<p><strong>Example:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public function messages()
{
    return &#91;
        'name.required' => 'The name field cannot be empty.',
        'email.unique' => 'This email address already exists.'
    &#93;;
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">messages</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;name.required&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;The name field cannot be empty.&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;email.unique&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;This email address already exists.&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">    &#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p>Custom messages help ensure that validation feedback remains clear and consistent.</p>



<h2 class="wp-block-heading">Handling Validation Failure and Redirect Behavior</h2>



<p>When validation fails in a Form Request, Laravel automatically redirects the request back to the previous page.</p>



<p>During this process:</p>



<ul class="wp-block-list">
<li>Validation errors are stored in the session</li>



<li>The previous input is preserved</li>



<li>Error messages become available in the view layer</li>
</ul>



<p>This automatic behavior simplifies error handling and allows the application to provide clear feedback without additional logic.</p>



<h2 class="wp-block-heading">Validating Files in Laravel</h2>



<p>Laravel provides specific validation rules for file uploads.</p>



<p>Example:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>'file' => 'required|mimes:pdf,docx|max:2048'</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #CE9178">&#39;file&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;required|mimes:pdf,docx|max:2048&#39;</span></span></code></pre></div>



<p>This rule checks:</p>



<ul class="wp-block-list">
<li>A file must be present</li>



<li>Only specific file formats are allowed</li>



<li>File size must not exceed the defined limit</li>
</ul>



<p>File validation helps maintain application stability and ensures uploaded content follows defined constraints.</p>



<h2 class="wp-block-heading">Conditional Validation Rules</h2>



<p>Laravel supports conditional validation rules that apply only when certain conditions are met.</p>



<p>Example:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>'discount_code' => 'required_if:status,active'</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #CE9178">&#39;discount_code&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;required_if:status,active&#39;</span></span></code></pre></div>



<p>This means the field becomes required only if a specific condition is true.</p>



<p>Other useful conditional rules include:</p>



<ul class="wp-block-list">
<li>required_with</li>



<li>required_without</li>



<li>sometimes</li>
</ul>



<p>These rules allow developers to create flexible validation logic.</p>



<h2 class="wp-block-heading">Best Practices for Laravel Validation</h2>



<p>To implement validation effectively, developers should follow several best practices.</p>



<ul class="wp-block-list">
<li><strong>Use Form Request classes:&nbsp;</strong>They keep validation logic separate from controllers.</li>



<li><strong>Apply validation early:&nbsp;</strong>Always validate input before processing data.</li>



<li><strong>Use built-in validation rules:&nbsp;</strong>Laravel provides many reliable rules that cover most validation needs.</li>



<li><strong>Maintain clear validation structure:&nbsp;</strong>Organized validation logic improves maintainability and readability.</li>
</ul>



<p>Following these practices helps maintain clean and stable Laravel applications.</p>



<figure class="wp-block-image size-large"><a href="https://serveravatar.com/?ref=blog" target="_blank" rel=" noreferrer noopener"><img loading="lazy" decoding="async" width="1024" height="127" src="https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-1024x127.png" alt="Blog banner - ServerAvatar" class="wp-image-28184" srcset="https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-1024x127.png 1024w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-300x37.png 300w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-768x95.png 768w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-1536x190.png 1536w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-2048x254.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<h2 class="wp-block-heading">Common Validation Mistakes</h2>



<p>Several mistakes can affect the reliability of validation systems.</p>



<ul class="wp-block-list">
<li><strong>Skipping validation:&nbsp;</strong>Processing unvalidated input can lead to unpredictable behavior.</li>



<li><strong>Using overly complex rules:&nbsp;</strong>Validation logic should remain simple and clear.</li>



<li><strong>Ignoring validation errors:&nbsp;</strong>Applications should properly handle and display validation errors.</li>



<li><strong>Mixing validation with business logic:&nbsp;</strong>Keeping validation separate improves code clarity and maintainability.</li>
</ul>



<p>Avoiding these mistakes helps maintain consistent validation behavior.</p>



<h2 class="wp-block-heading">Conclusion</h2>



<p>Laravel provides a structured and efficient way to validate incoming data through its built-in validation system. By defining validation rules, developers can ensure that submitted data follows the required format, structure, and constraints before it is processed by the application. Whether validation is implemented directly in controllers, through the Validator facade, or by using Form Request classes, Laravel offers flexible options that help keep code organized and maintainable. Features such as custom validation rules, conditional validation, and customizable error messages further enhance the ability to handle complex validation scenarios. By understanding and properly applying Laravel Validation Rules, developers can maintain clean data, improve application reliability, and build more stable and maintainable Laravel applications.</p>



<h2 class="wp-block-heading">FAQs</h2>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question">1. What are Laravel Validation Rules?</h3><div class="aioseo-faq-block-answer">
<p>Laravel Validation Rules are predefined or custom conditions that verify whether input data meets specific requirements before it is processed by the application.</p>
</div></div>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question">2. Where can validation rules be defined in Laravel?</h3><div class="aioseo-faq-block-answer">
<p>Validation rules can be defined inside controllers, through the Validator facade, within Form Request classes, or by creating custom validation rule objects.</p>
</div></div>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question">3. What is the purpose of Form Request Validation in Laravel?</h3><div class="aioseo-faq-block-answer">
<p>Form Request Validation helps organize validation logic in separate request classes, making controllers cleaner and the codebase easier to maintain.</p>
</div></div>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question">4. Can developers create custom validation rules in Laravel?</h3><div class="aioseo-faq-block-answer">
<p>Laravel allows developers to generate custom validation rule classes using the Artisan command and implement specific validation logic when built-in rules are not sufficient.</p>
</div></div>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question">5. What happens when validation fails in Laravel?</h3><div class="aioseo-faq-block-answer">
<p>When validation fails, Laravel automatically redirects the request back to the previous page and provides error messages that can be displayed in the application’s views.</p>
</div></div><p>The post <a href="https://serveravatar.com/laravel-validation/">Laravel Validation Rules: How to Create and Use Them</a> first appeared on <a href="https://serveravatar.com">ServerAvatar</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Build MCP Server Laravel: AI Integration Made Simple</title>
		<link>https://serveravatar.com/build-mcp-server-laravel/</link>
		
		<dc:creator><![CDATA[Suresh Ramani]]></dc:creator>
		<pubDate>Tue, 09 Sep 2025 12:04:43 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Laravel]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[AI Integration]]></category>
		<category><![CDATA[laravel]]></category>
		<category><![CDATA[Laravel Tutorial]]></category>
		<category><![CDATA[MCP Server]]></category>
		<guid isPermaLink="false">https://serveravatar.com/?p=27946</guid>

					<description><![CDATA[<p>Imagine talking to your computer and having it not just listen, but&#160;truly&#160;understand and do what you ask &#8211; like running reports, sending emails, or even analyzing your business data in real time. Sounds futuristic? Not anymore! Thanks to MCP servers powered by Laravel, AI can seamlessly integrate with your apps and make this science fiction [&#8230;]</p>
<p>The post <a href="https://serveravatar.com/build-mcp-server-laravel/">Build MCP Server Laravel: AI Integration Made Simple</a> first appeared on <a href="https://serveravatar.com">ServerAvatar</a>.</p>]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-image size-large"><a href="https://serveravatar.com?ref=blog" target="_blank" rel=" noreferrer noopener"><img loading="lazy" decoding="async" width="1024" height="127" src="https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-1024x127.png" alt="Blog banner - ServerAvatar" class="wp-image-28182" srcset="https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-1024x127.png 1024w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-300x37.png 300w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-768x95.png 768w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-1536x190.png 1536w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-2048x253.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Imagine talking to your computer and having it not just listen, but&nbsp;<em>truly</em>&nbsp;understand and do what you ask &#8211; like running reports, sending emails, or even analyzing your business data in real time. Sounds futuristic? Not anymore! Thanks to MCP servers powered by Laravel, AI can seamlessly integrate with your apps and make this science fiction a daily reality. If you’ve ever Googled “how do I connect AI to my website?” or wondered what goes on behind the scenes when Alexa controls your smart home, MCP server is the bridge you’ve been looking for.</p>



<p>In this guide, we’ll walk you through how to build an MCP server using Laravel, explain its benefits, and show you &#8211; step by step &#8211; how easy it is to bring intelligent automation to your own projects. Ready to unlock next-level AI for the general public? Let’s dive in!</p>



<p>Imagine an interpreter that stands between you and a foreign language speaker. It listens to your request, translates it, and delivers a response you’ll understand. That’s what an MCP server does &#8211; only, instead of languages, it translates AI instructions into actions your Laravel application can perform.</p>



<p>MCP stands for&nbsp;<em>Model Context Protocol</em>. It’s a universal standard that lets smart assistants like Claude, ChatGPT, or other AI models talk directly to your backend &#8211; fetching info, running tasks, and more &#8211; all securely and in real time. Instead of custom integrations for every app, MCP creates a single bridge anyone can use.</p>



<p>The&nbsp;<strong><a href="https://modelcontextprotocol.io/">Model Context Protocol</a></strong>&nbsp;was introduced by Anthropic as an open standard that enables developers to build secure, two-way connections between their data sources and AI-powered tools. Think of it like a USB-C port for AI applications &#8211; providing a standardized way to connect AI models to different data sources and tools.</p>



<figure class="wp-block-video"><video height="1024" style="aspect-ratio: 1608 / 1024;" width="1608" controls src="https://serveravatar.com/wp-content/uploads/2025/09/mcp-server-laravel-video.mp4"></video></figure>



<h2 class="wp-block-heading" id="why-choose-laravel-for-mcp-integration"><strong>Why Choose Laravel for MCP Integration?</strong></h2>



<p>Laravel, known for its elegance and simplicity, makes building powerful web backends a breeze. Pairing Laravel with an MCP server is like turning a reliable sedan into a smart car &#8211; giving your backend the ability to communicate with the cutting-edge intelligence of AI.</p>



<p>What makes Laravel shine for MCP servers?</p>



<ul class="wp-block-list">
<li><strong>Simplicity:</strong>&nbsp;Clear, readable code even beginners can understand.</li>



<li><strong>Security:</strong>&nbsp;Built-in protection, ensuring only permitted actions are exposed.</li>



<li><strong>Extensibility:</strong>&nbsp;Easy to add more features and connect with other services.</li>
</ul>



<p>You don’t need to be a rocket scientist to build an MCP server if you have Laravel in your toolkit. Just a bit of curiosity and imagination! While Laravel offers excellent PHP-based solutions, developers interested in exploring alternative approaches can also check out how to&nbsp;<strong><a href="https://serveravatar.com/create-mcp-server-nodejs/">create MCP server in Node.js</a></strong>&nbsp;for JavaScript-based implementations.</p>



<h2 class="wp-block-heading" id="getting-set-up-the-laravel-mcp-foundation"><strong>Getting Set Up: The Laravel MCP Foundation</strong></h2>



<p>Starting with MCP on Laravel is as easy as installing any package. You’ll need:</p>



<ul class="wp-block-list">
<li>Laravel (latest version recommended)</li>



<li>Composer (to manage dependencies)</li>



<li>PHP 8.1+ (for maximum compatibility)</li>
</ul>



<p><strong>Quick Setup Steps:</strong></p>



<ol class="wp-block-list">
<li>Create your new Laravel project:</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>composer create-project laravel/laravel mcp-server
cd mcp-server</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">composer</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">create-project</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">laravel/laravel</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">mcp-server</span></span>
<span class="line"><span style="color: #DCDCAA">cd</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">mcp-server</span></span></code></pre></div>



<ol start="2" class="wp-block-list">
<li>Add the MCP package:</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>composer require php-mcp/laravel:^3.0 -W</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">composer</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">require</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">php-mcp/laravel:^3.0</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-W</span></span></code></pre></div>



<ol start="3" class="wp-block-list">
<li>Publish the MCP configuration:</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>php artisan vendor:publish --provider="PhpMcp\\Laravel\\McpServiceProvider"</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">php</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">artisan</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">vendor:publish</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">--provider=</span><span style="color: #CE9178">&quot;PhpMcp</span><span style="color: #D7BA7D">\\</span><span style="color: #CE9178">Laravel</span><span style="color: #D7BA7D">\\</span><span style="color: #CE9178">McpServiceProvider&quot;</span></span></code></pre></div>



<p>And that’s it! You’re ready to start building.</p>



<h2 class="wp-block-heading" id="how-mcp-servers-work-real-world-analogy"><strong>How MCP Servers Work: Real-World Analogy</strong></h2>



<p>Let’s use an analogy &#8211; a&nbsp;<em>universal remote for your home</em>. You have dozens of devices, each speaking their own “digital language”. The universal remote needs to understand your button presses (requests) and tell the right device (app tool) what to do, whether it’s turning on the TV or dimming the lights.</p>



<p>MCP servers work just like that remote: they interpret incoming AI requests and direct them to the right tools or resources in your Laravel application. No more learning 20 languages; everything connects through one channel.</p>



<h2 class="wp-block-heading" id="key-benefits-of-mcp-servers"><strong>Key Benefits of MCP Servers</strong></h2>



<p>Why are developers and businesses jumping on the MCP bandwagon? Here’s why:</p>



<ul class="wp-block-list">
<li><strong>One integration to rule them all:</strong>&nbsp;Connect AI models and apps with a single protocol–no more juggling different APIs.</li>



<li><strong>Security-first design:</strong>&nbsp;Expose only what you want; keep the rest locked down.</li>



<li><strong>Efficiency &amp; speed:</strong>&nbsp;Real-time data processing and response.</li>



<li><strong>Cross-platform magic:</strong>&nbsp;Works with multiple AI platforms, not just one specific brand.</li>



<li><strong>Reduced complexity:</strong>&nbsp;Unified plugin model, easy maintenance.</li>
</ul>



<p>Think of MCP as the operating system for intelligent interactions &#8211; it just works, and works well!</p>



<h2 class="wp-block-heading" id="installing-mcp-server-in-laravel"><strong>Installing MCP Server in Laravel</strong></h2>



<p>After setup, the next step is to activate MCP features in your Laravel project. MCP servers usually support multiple “transport layers” &#8211; ways of communicating with AI clients. The most popular ones are:</p>



<ul class="wp-block-list">
<li><strong>Streamable HTTP:</strong>&nbsp;Recommended for secure real-time communication.</li>



<li><strong>Server-Sent Events (SSE):</strong> Legacy support for continuous connections.</li>
</ul>



<h2 class="wp-block-heading" id="core-components-of-an-mcp-server"><strong>Core Components of an MCP Server</strong></h2>



<p>Every MCP server has a few key parts, just like a well-organized kitchen:</p>



<ul class="wp-block-list">
<li><strong>Tools:</strong>&nbsp;Executable functions (like recipes) you want the AI to use.</li>



<li><strong>Resources:</strong>&nbsp;Static data or files (think pantry items).</li>



<li><strong>Resource Templates:</strong>&nbsp;Dynamic versions of resources, for flexible requests.</li>



<li><strong>Prompts:</strong>&nbsp;Message templates for the AI to start conversations or tasks.</li>
</ul>



<p>Laravel makes it super easy to define these using either manual registration or PHP attributes. You simply “register” what you want available to the outside world.</p>



<h2 class="wp-block-heading" id="creating-mcp-tools-in-laravel"><strong>Creating MCP Tools in Laravel</strong></h2>



<p>Want the AI to add numbers or send an email? Register these as&nbsp;<em>tools</em>&nbsp;in your MCP server. Create <code>mcp.php</code> file inside <code>routes</code> folder:</p>



<p><strong>Example: Add Numbers Tool</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Mcp::tool(function(float $a, float $b): float {
   return $a + $b;
})
->name('add_numbers')
->description('Add two numbers together');</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #4EC9B0">Mcp</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">tool</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">function</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">float</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$a</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">float</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$b</span><span style="color: #D4D4D4">): </span><span style="color: #569CD6">float</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$a</span><span style="color: #D4D4D4"> + </span><span style="color: #9CDCFE">$b</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">})</span></span>
<span class="line"><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">name</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;add_numbers&#39;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">description</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Add two numbers together&#39;</span><span style="color: #D4D4D4">);</span></span></code></pre></div>



<p><strong>Example: Send Email Tool</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Mcp::tool(EmailService::class)
   ->description('Send emails to users');</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #4EC9B0">Mcp</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">tool</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">EmailService</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">class</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">   -&gt;</span><span style="color: #DCDCAA">description</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Send emails to users&#39;</span><span style="color: #D4D4D4">);</span></span></code></pre></div>



<p>Tools can support anything you imagine &#8211; database queries, notifications, business logic, or custom reports.</p>



<h2 class="wp-block-heading" id="building-mcp-resources--data-connections"><strong>Building MCP Resources &amp; Data Connections</strong></h2>



<p>Resources in MCP aren’t just “stuff” &#8211; they’re the backbone of AI data access. You can expose settings, user profiles, files, or anything else your app stores:</p>



<p><strong>Example: Application Settings Resource</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Mcp::resource('config://app/settings', &#91;UserService::class, 'getAppSettings'&#93;)
->name('app_settings')
->description('Application configuration settings');</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #4EC9B0">Mcp</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">resource</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;config://app/settings&#39;</span><span style="color: #D4D4D4">, &#91;</span><span style="color: #4EC9B0">UserService</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">class</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;getAppSettings&#39;</span><span style="color: #D4D4D4">&#93;)</span></span>
<span class="line"><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">name</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;app_settings&#39;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">description</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Application configuration settings&#39;</span><span style="color: #D4D4D4">);</span></span></code></pre></div>



<p>Dynamic resource templates let AI fetch data for specific users, files, or entities. It’s like giving your AI a pantry full of smart ingredients to cook up insight!</p>



<h2 class="wp-block-heading" id="how-ai-interacts-with-mcp-servers"><strong>How AI Interacts with MCP Servers</strong></h2>



<p>When an AI assistant like Claude or ChatGPT connects to your MCP server, it:</p>



<ol class="wp-block-list">
<li>Discovers available tools and resources.</li>



<li>Selects what it needs to perform the requested job.</li>



<li>Sends instructions in natural language (e.g., “Send a summary email”).</li>



<li>Receives results &#8211; no hassle, no guesswork.</li>
</ol>



<p>This process is fast, secure, and standardized across all MCP-compatible clients. Your Laravel MCP acts as a responsive, intelligent interface.</p>



<h2 class="wp-block-heading" id="validations-security--permissions"><strong>Validations, Security &amp; Permissions</strong></h2>



<p>Worried about exposing too much or getting spammed by rogue requests? Relax &#8211; Laravel MCP gives you full control.</p>



<ul class="wp-block-list">
<li>Specify input types and requirements for each tool.</li>



<li>Add authentication and user roles as needed.</li>



<li>Log requests for auditing and security.</li>



<li>Use Laravel middleware to add extra checks or restrict usage.</li>
</ul>



<p>With great power comes great responsibility &#8211; and MCP servers give you the tools to use their power wisely.</p>



<figure class="wp-block-image size-large"><a href="https://serveravatar.com?ref=blog" target="_blank" rel=" noreferrer noopener"><img loading="lazy" decoding="async" width="1024" height="127" src="https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-1024x127.png" alt="Blog banner - ServerAvatar" class="wp-image-28184" srcset="https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-1024x127.png 1024w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-300x37.png 300w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-768x95.png 768w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-1536x190.png 1536w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-2048x254.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<h2 class="wp-block-heading" id="connecting-your-laravel-mcp-to-ai-clients"><strong>Connecting Your Laravel MCP Server to AI Clients</strong></h2>



<p>Ready to see the magic? Most AI platforms support MCP out of the box. You can find detailed information about connecting to various AI clients in the&nbsp;<strong><a href="https://docs.anthropic.com/en/docs/mcp">official MCP documentation</a></strong>.</p>



<p><strong>Basic Connection:</strong></p>



<p>Update your MCP client configuration (e.g., in Claude Desktop) to point to your Laravel endpoint:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">JSON</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>{
  "mcpServers": {
    "my-laravel-app": {
      "command": "curl",
      "args": &#91;
        "-X", "POST",
        "-H", "Content-Type: application/json",
        "http://127.0.0.1:8000/mcp"
      &#93;
    }
  }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">&quot;mcpServers&quot;</span><span style="color: #D4D4D4">: {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">&quot;my-laravel-app&quot;</span><span style="color: #D4D4D4">: {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">&quot;command&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;curl&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">&quot;args&quot;</span><span style="color: #D4D4D4">: &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;-X&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;POST&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;-H&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;Content-Type: application/json&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;http://127.0.0.1:8000/mcp&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">      &#93;</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p>Once you’re connected, your AI assistant can interact with your Laravel tools as if it was human! Try a test command or data request and watch live integrations unfold.</p>



<p>For detailed instructions on using an MCP server in VS Code, refer to the official guide: <a href="https://code.visualstudio.com/docs/copilot/customization/mcp-servers" target="_blank" rel="noopener" title="">Using MCP Servers in VS Code</a>.</p>



<h2 class="wp-block-heading" id="practical-use-cases--examples"><strong>Practical Use Cases &amp; Examples</strong></h2>



<p>Here’s where MCP servers get seriously fun. Real-world use cases include:</p>



<ul class="wp-block-list">
<li><strong>AI-powered customer support:</strong>&nbsp;Let bots fetch user info, log issues, or make bookings.</li>



<li><strong>Data analysis and reporting:</strong>&nbsp;Automate business insights, financial calculations, or personalized recommendations.</li>



<li><strong>Healthcare applications:</strong>&nbsp;Securely connect patient data for AI-driven diagnosis or consultations.</li>



<li><strong>Education &amp; tutorials:</strong>&nbsp;Create learning bots that interact with course materials and answer questions.</li>



<li><strong>Smart home and IoT:</strong>&nbsp;Control devices and analyze sensor data &#8211; all through voice or text AI instructions.</li>
</ul>



<p>You’re limited only by your imagination.</p>



<h2 class="wp-block-heading" id="troubleshooting-and-optimization-tips"><strong>Troubleshooting and Optimization Tips</strong></h2>



<p>Even the best servers hit bumps &#8211; here’s what you can do:</p>



<ul class="wp-block-list">
<li><strong>Monitor performance:</strong>&nbsp;Use real-time analytics to watch what tools are used most or spot slowdowns.</li>



<li><strong>Optimize security:</strong>&nbsp;Regularly update permissions and input checks.</li>



<li><strong>Test integrations:</strong>&nbsp;Simulate AI requests to catch errors before they hit production.</li>



<li><strong>Cache responses:</strong>&nbsp;For data-heavy tools, speed things up with Laravel’s built-in caching.</li>



<li><strong>Automate validation:</strong>&nbsp;Implement checks on new tools or resources to prevent mistakes.</li>
</ul>



<p>For developers working across different technology stacks, you might also find it helpful to compare Laravel’s approach with other implementations. Our detailed guide on&nbsp;<strong><a href="https://serveravatar.com/create-mcp-server-nodejs/">creating MCP servers with Node.js</a></strong>&nbsp;provides valuable insights into alternative development approaches that can complement your Laravel knowledge.</p>



<h2 class="wp-block-heading" id="future-trends-mcp-and-ai-in-2025"><strong>Future Trends: MCP and AI in 2025</strong></h2>



<p>The world of MCP servers is evolving fast. In 2025, expect:</p>



<ul class="wp-block-list">
<li><strong>Tighter integration with cloud platforms and edge devices.</strong></li>



<li><strong>Better personalization through real-time feedback.</strong></li>



<li><strong>Smarter security models based on context and user roles.</strong></li>



<li><strong>Frictionless onboarding for any AI model, anywhere.</strong></li>
</ul>



<p>Just as the smartphone became everyone’s digital companion, MCP servers are quickly becoming the new standard for how AI interacts with the real world. Stay tuned &#8211; the future is just getting started!</p>



<p>You can find the GitHub repository here: <a href="https://github.com/srvrsoorg/mcp-server-laravel">srvrsoorg/mcp-server-laravel</a>.</p>



<h2 class="wp-block-heading" id="conclusion"><strong>Conclusion</strong></h2>



<p>Building an MCP server with Laravel opens the door to a world where AI isn’t just smart &#8211; it’s practical, helpful, and easy to use. With this guide, you’re not just following tech trends; you’re leading them. By making advanced AI accessible to the general public, you help bridge the gap between curiosity and capability.</p>



<p>MCP server + Laravel = the magic wand for modern automation.<br>It’s time to start building, exploring, and imagining what’s possible. Ready to let AI work for&nbsp;<em>you</em>?</p>



<h2 class="wp-block-heading" id="frequently-asked-questions"><strong>Frequently Asked Questions</strong></h2>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question"><strong>What is an MCP server?</strong></h3><div class="aioseo-faq-block-answer">
<p>An MCP server is a protocol-based application backend that lets AI assistants securely fetch data, execute functions, and perform real-world actions for users, all in real time.</p>
</div></div>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question"><strong>Why should I use Laravel for my MCP server?</strong></h3><div class="aioseo-faq-block-answer">
<p>Laravel combines user-friendly code with robust features, making it easy to build, secure, and extend your MCP server without hours of complex setup.</p>
</div></div>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question"><strong>Can I connect any AI model to my Laravel MCP server?</strong></h3><div class="aioseo-faq-block-answer">
<p>Yes! MCP is designed as an open standard, so most popular AI clients and models can plug in, discover your tools, and interact seamlessly.</p>
</div></div>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question"><strong>Is it safe to expose server functions to AI?</strong></h3><div class="aioseo-faq-block-answer">
<p>Absolutely &#8211; as long as you use proper validations, controls, and permissions allowed by Laravel MCP configurations. You decide what’s exposed and what stays private.</p>
</div></div>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question"><strong>What are some cool things I can do with MCP server integration?</strong></h3><div class="aioseo-faq-block-answer">
<p>From sending automated emails to processing data, running database queries, or powering IoT devices, MCP servers unlock limitless possibilities for intelligent automation with just a few lines of code.</p>
</div></div>



<div style="font-family: 'Public Sans', sans-serif; background: #fff; border: 1px solid #e1eaff; padding: 40px 35px; border-radius: 16px; margin: 60px 0; box-shadow: 0 10px 32px rgba(0, 0, 0, 0.05); max-width: 860px; margin-left: auto; margin-right: auto; text-align: center;">

  <h2 style="font-size: 28px; font-weight: 800; color: #0b2b53; margin-top: 0; margin-bottom: 16px;">
    Stop Wasting Time on Servers. Start Building Instead.
  </h2>

  <p style="font-size: 17px; color: #333; font-weight: 500; margin: 0 0 12px;">
    You didn’t start your project to babysit servers.
    Let <strong>ServerAvatar</strong> handle deployment, monitoring, and backups — so you can focus on growth.
  </p>

  <p style="font-size: 16px; color: #555; font-weight: 400; margin-bottom: 24px;">
    Deploy <strong>WordPress, Laravel, N8N</strong>, and more in minutes.
    No DevOps required. No command line. No stress.
  </p>

  <div style="display: inline-flex; justify-content: center; gap: 10px; flex-wrap: wrap; margin-bottom: 16px;">
    <a href="https://app.serveravatar.com" target="_blank" rel="noopener"
       style="background: linear-gradient(135deg, #007bff, #0056d2); color: #fff; text-decoration: none; padding: 10px 20px; font-size: 14px; font-weight: 600; border-radius: 8px; text-align: center;">
      🚀 Try Free
    </a>
    <a href="https://serveravatar.com/" target="_blank" rel="noopener"
       style="background: #f5f9ff; color: #0056d2; text-decoration: none; padding: 10px 20px; font-size: 14px; font-weight: 600; border-radius: 8px; border: 1px solid #d2e3ff; text-align: center;">
      🌐 Learn More
    </a>
  </div>

  <p style="font-size: 14px; color: #888; margin-top: 10px;">
    Trusted by 10,000+ developers and growing.
  </p>
</div><p>The post <a href="https://serveravatar.com/build-mcp-server-laravel/">Build MCP Server Laravel: AI Integration Made Simple</a> first appeared on <a href="https://serveravatar.com">ServerAvatar</a>.</p>]]></content:encoded>
					
		
		<enclosure url="https://serveravatar.com/wp-content/uploads/2025/09/mcp-server-laravel-video.mp4" length="1554703" type="video/mp4" />

			</item>
		<item>
		<title>How to Use Yajra DataTables in Laravel Like a Pro</title>
		<link>https://serveravatar.com/master-yajra-datatables-laravel-tutorial/</link>
		
		<dc:creator><![CDATA[Suresh Ramani]]></dc:creator>
		<pubDate>Sun, 10 Aug 2025 04:30:00 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Guide]]></category>
		<category><![CDATA[Laravel]]></category>
		<category><![CDATA[DataTables Integration]]></category>
		<category><![CDATA[Laravel AJAX Tables]]></category>
		<category><![CDATA[Laravel Tables]]></category>
		<category><![CDATA[Laravel Tutorial]]></category>
		<category><![CDATA[Laravel Yajra DataTables]]></category>
		<category><![CDATA[PHP DataTables]]></category>
		<category><![CDATA[Yajra Package]]></category>
		<guid isPermaLink="false">https://serveravatar.com/?p=27277</guid>

					<description><![CDATA[<p>Introduction Have you ever wondered why some web applications feel lightning-fast when handling massive amounts of data, while others crawl like a snail? The secret often lies in how they handle data presentation.&#160;Yajra DataTables&#160;is like having a Swiss Army knife for your Laravel data &#8211; it’s versatile, powerful, and makes complex data operations feel effortless. [&#8230;]</p>
<p>The post <a href="https://serveravatar.com/master-yajra-datatables-laravel-tutorial/">How to Use Yajra DataTables in Laravel Like a Pro</a> first appeared on <a href="https://serveravatar.com">ServerAvatar</a>.</p>]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-image size-large"><a href="https://serveravatar.com?ref=blog" target="_blank" rel=" noreferrer noopener"><img loading="lazy" decoding="async" width="1024" height="127" src="https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-1024x127.png" alt="Blog banner - ServerAvatar" class="wp-image-28182" srcset="https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-1024x127.png 1024w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-300x37.png 300w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-768x95.png 768w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-1536x190.png 1536w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-2048x253.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<h2 class="wp-block-heading" id="introduction">Introduction</h2>



<p>Have you ever wondered why some web applications feel lightning-fast when handling massive amounts of data, while others crawl like a snail? The secret often lies in how they handle data presentation.&nbsp;<strong>Yajra DataTables</strong>&nbsp;is like having a Swiss Army knife for your Laravel data &#8211; it’s versatile, powerful, and makes complex data operations feel effortless.</p>



<p>If you’re working with Laravel and need to display large datasets efficiently, you’ve probably heard about DataTables. But here’s the thing: most developers barely scratch the surface of what this powerful package can do. Today, we’re going to change that. We’ll dive deep into&nbsp;<strong>yajra datatable</strong>&nbsp;and transform you from a beginner into someone who wields this tool like a seasoned pro.</p>



<h2 class="wp-block-heading" id="what-is-yajra-datatables-and-why-should-you-care"><strong>What is Yajra DataTables and Why Should You Care?</strong></h2>



<p>Think of&nbsp;<strong>Yajra DataTables</strong>&nbsp;as your data&#8217;s personal assistant. Just like a good assistant handles scheduling, filtering emails, and organizing tasks, DataTables manages your data presentation, sorting, searching, and pagination without breaking a sweat.</p>



<p><strong>Yajra DataTables</strong>&nbsp;is a Laravel package that seamlessly integrates the popular jQuery DataTables plugin with your Laravel applications. But why should you care? Here’s the deal:</p>



<ul class="wp-block-list">
<li><strong>Performance</strong>: It handles thousands of records without making your browser cry</li>



<li><strong>User Experience</strong>: Your users get instant search, sorting, and filtering</li>



<li><strong>Developer Friendly</strong>: Less code, more functionality</li>



<li><strong>Flexibility</strong>: Customize everything from appearance to behavior</li>
</ul>



<p>The beauty of&nbsp;<strong>yajra datatable</strong>&nbsp;lies in its ability to transform boring HTML tables into interactive powerhouses. Whether you’re building an admin panel, a reporting dashboard, or any data-heavy application, this package is your best friend.</p>



<h2 class="wp-block-heading" id="setting-up-your-laravel-environment"><strong>Setting Up Your Laravel Environment</strong></h2>



<p>Before we dive into the&nbsp;<strong>yajra datatable</strong>&nbsp;magic, let’s make sure your Laravel environment is ready. You’ll need:</p>



<p><strong>Prerequisites:</strong></p>



<ul class="wp-block-list">
<li>Laravel 8.0 or higher</li>



<li>PHP 7.4 or higher</li>



<li>Composer installed</li>



<li>Basic understanding of Laravel MVC structure</li>
</ul>



<p>If you haven’t deployed your Laravel application yet, consider using a reliable hosting solution. For seamless deployment, check out how to&nbsp;<a href="https://serveravatar.com/deployments/applications/laravel">Deploy Laravel on VM, VPS or Dedicated Server</a>&nbsp;for professional hosting options.</p>



<p><strong>Verify Your Setup:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>php artisan --version
composer --version</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">php</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">artisan</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">--version</span></span>
<span class="line"><span style="color: #DCDCAA">composer</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">--version</span></span></code></pre></div>



<p>Make sure you have a working database connection configured in your&nbsp;<code>.env</code>&nbsp;file. We’ll need this for our DataTable examples.</p>



<h2 class="wp-block-heading" id="installing-and-configuring-yajra-datatables"><strong>Installing and Configuring Yajra DataTables</strong></h2>



<p>Now comes the exciting part – installing the&nbsp;<strong>yajra datatable</strong>&nbsp;package. It’s easier than making morning coffee!</p>



<p><strong>Step 1: Install via Composer</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>composer require yajra/laravel-datatables-oracle</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">composer</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">require</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">yajra/laravel-datatables-oracle</span></span></code></pre></div>



<p><strong>Step 2: Publish Configuration (Optional)</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>php artisan vendor:publish --tag=datatables</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">php</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">artisan</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">vendor:publish</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">--tag=datatables</span></span></code></pre></div>



<p><strong>Step 3: Add Service Provider (Laravel &lt; 5.5)</strong>&nbsp;If you’re using an older Laravel version, add this to your&nbsp;<code>config/app.php</code>:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Yajra\DataTables\DataTablesServiceProvider::class,</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">Yajra\DataTables\</span><span style="color: #4EC9B0">DataTablesServiceProvider</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">class</span><span style="color: #D4D4D4">,</span></span></code></pre></div>



<p><strong>Step 4: Include DataTables Assets</strong>&nbsp;Add these to your layout file:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">HTML</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;!-- CSS -->
&lt;link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.13.7/css/jquery.dataTables.min.css">

&lt;!-- JavaScript -->
&lt;script type="text/javascript" charset="utf8" src="https://code.jquery.com/jquery-3.6.0.min.js">&lt;/script>
&lt;script type="text/javascript" charset="utf8" src="https://cdn.datatables.net/1.13.7/js/jquery.dataTables.min.js">&lt;/script></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">&lt;!-- CSS --&gt;</span></span>
<span class="line"><span style="color: #808080">&lt;</span><span style="color: #569CD6">link</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">rel</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;stylesheet&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">type</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;text/css&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">href</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;https://cdn.datatables.net/1.13.7/css/jquery.dataTables.min.css&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">&lt;!-- JavaScript --&gt;</span></span>
<span class="line"><span style="color: #808080">&lt;</span><span style="color: #569CD6">script</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">type</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;text/javascript&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">charset</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;utf8&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">src</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;https://code.jquery.com/jquery-3.6.0.min.js&quot;</span><span style="color: #808080">&gt;&lt;/</span><span style="color: #569CD6">script</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #808080">&lt;</span><span style="color: #569CD6">script</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">type</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;text/javascript&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">charset</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;utf8&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">src</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;https://cdn.datatables.net/1.13.7/js/jquery.dataTables.min.js&quot;</span><span style="color: #808080">&gt;&lt;/</span><span style="color: #569CD6">script</span><span style="color: #808080">&gt;</span></span></code></pre></div>



<p><strong>Pro Tip:</strong>&nbsp;Always use CDN links for better performance, but keep local copies as fallbacks.</p>



<h2 class="wp-block-heading" id="creating-your-first-datatable"><strong>Creating Your First DataTable</strong></h2>



<p>Let’s create your first&nbsp;<strong>yajra datatable</strong>. We’ll start with a simple users table – think of it as your “Hello World” moment with DataTables.</p>



<p><strong>Step 1: Create a Model and Migration</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>php artisan make:model User -m</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">php</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">artisan</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">make:model</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">User</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-m</span></span></code></pre></div>



<p><strong>Step 2: Set Up Your Route</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// routes/web.php
Route::get('/users', &#91;UserController::class, 'index'&#93;)->name('users.index');
Route::get('/users/data', &#91;UserController::class, 'getData'&#93;)->name('users.data');</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// routes/web.php</span></span>
<span class="line"><span style="color: #4EC9B0">Route</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">get</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;/users&#39;</span><span style="color: #D4D4D4">, &#91;</span><span style="color: #4EC9B0">UserController</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">class</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;index&#39;</span><span style="color: #D4D4D4">&#93;)-&gt;</span><span style="color: #DCDCAA">name</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;users.index&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #4EC9B0">Route</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">get</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;/users/data&#39;</span><span style="color: #D4D4D4">, &#91;</span><span style="color: #4EC9B0">UserController</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">class</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;getData&#39;</span><span style="color: #D4D4D4">&#93;)-&gt;</span><span style="color: #DCDCAA">name</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;users.data&#39;</span><span style="color: #D4D4D4">);</span></span></code></pre></div>



<p><strong>Step 3: Create the View</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Blade</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;!-- resources/views/users/index.blade.php -->
&lt;div class="container">
    &lt;h2>Users Management&lt;/h2>
    &lt;table id="users-table" class="table table-bordered">
        &lt;thead>
            &lt;tr>
                &lt;th>ID&lt;/th>
                &lt;th>Name&lt;/th>
                &lt;th>Email&lt;/th>
                &lt;th>Created At&lt;/th>
                &lt;th>Actions&lt;/th>
            &lt;/tr>
        &lt;/thead>
    &lt;/table>
&lt;/div>

&lt;script>
$(document).ready(function() {
    $('#users-table').DataTable({
        processing: true,
        serverSide: true,
        ajax: "{{ route('users.data') }}",
        columns: &#91;
            {data: 'id', name: 'id'},
            {data: 'name', name: 'name'},
            {data: 'email', name: 'email'},
            {data: 'created_at', name: 'created_at'},
            {data: 'actions', name: 'actions', orderable: false}
        &#93;
    });
});
&lt;/script></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">&lt;!-- resources/views/users/index.blade.php --&gt;</span></span>
<span class="line"><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">class</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;container&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">h2</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">Users Management</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">h2</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">table</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">id</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;users-table&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">class</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;table table-bordered&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">thead</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">tr</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">th</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">ID</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">th</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">th</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">Name</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">th</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">th</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">Email</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">th</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">th</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">Created At</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">th</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">th</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">Actions</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">th</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">tr</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">thead</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">table</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #808080">&lt;</span><span style="color: #569CD6">script</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #DCDCAA">$</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">document</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">ready</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">function</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">$</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;#users-table&#39;</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">DataTable</span><span style="color: #D4D4D4">({</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">processing:</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">serverSide:</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">ajax:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;{{ route(&#39;users.data&#39;) }}&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">columns:</span><span style="color: #D4D4D4"> &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">            {</span><span style="color: #9CDCFE">data:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;id&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">name:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;id&#39;</span><span style="color: #D4D4D4">},</span></span>
<span class="line"><span style="color: #D4D4D4">            {</span><span style="color: #9CDCFE">data:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;name&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">name:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;name&#39;</span><span style="color: #D4D4D4">},</span></span>
<span class="line"><span style="color: #D4D4D4">            {</span><span style="color: #9CDCFE">data:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;email&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">name:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;email&#39;</span><span style="color: #D4D4D4">},</span></span>
<span class="line"><span style="color: #D4D4D4">            {</span><span style="color: #9CDCFE">data:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;created_at&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">name:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;created_at&#39;</span><span style="color: #D4D4D4">},</span></span>
<span class="line"><span style="color: #D4D4D4">            {</span><span style="color: #9CDCFE">data:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;actions&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">name:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;actions&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">orderable:</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">false</span><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">        &#93;</span></span>
<span class="line"><span style="color: #D4D4D4">    });</span></span>
<span class="line"><span style="color: #D4D4D4">});</span></span>
<span class="line"><span style="color: #808080">&lt;/</span><span style="color: #569CD6">script</span><span style="color: #808080">&gt;</span></span></code></pre></div>



<p>Congratulations! You’ve just created your first&nbsp;<strong>yajra datatable</strong>. But we’re just getting started.</p>



<h2 class="wp-block-heading" id="understanding-datatable-controllers"><strong>Understanding DataTable Controllers</strong></h2>



<p>The controller is where the&nbsp;<strong>yajra datatable</strong>&nbsp;magic happens. It’s like the conductor of an orchestra, coordinating all the data operations.</p>



<p><strong>Basic Controller Structure:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;
use Yajra\DataTables\Facades\DataTables;

class UserController extends Controller
{
    public function index()
    {
        return view('users.index');
    }

    public function getData(Request $request)
    {
        if ($request->ajax()) {
            $users = User::select(&#91;'id', 'name', 'email', 'created_at'&#93;);
            
            return DataTables::of($users)
                ->addColumn('actions', function($user) {
                    return '&lt;a href="#" class="btn btn-sm btn-primary">Edit&lt;/a>
                            &lt;a href="#" class="btn btn-sm btn-danger">Delete&lt;/a>';
                })
                ->rawColumns(&#91;'actions'&#93;)
                ->make(true);
        }
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">&lt;?php</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">namespace</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">App\Http\Controllers</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">use</span><span style="color: #D4D4D4"> App\Models\</span><span style="color: #4EC9B0">User</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">use</span><span style="color: #D4D4D4"> Illuminate\Http\</span><span style="color: #4EC9B0">Request</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">use</span><span style="color: #D4D4D4"> Yajra\DataTables\Facades\</span><span style="color: #4EC9B0">DataTables</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">UserController</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">extends</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Controller</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">index</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">view</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;users.index&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">getData</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">Request</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">ajax</span><span style="color: #D4D4D4">()) {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">$users</span><span style="color: #D4D4D4"> = </span><span style="color: #4EC9B0">User</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">select</span><span style="color: #D4D4D4">(&#91;</span><span style="color: #CE9178">&#39;id&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;name&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;email&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;created_at&#39;</span><span style="color: #D4D4D4">&#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">            </span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">DataTables</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">of</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$users</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                -&gt;</span><span style="color: #DCDCAA">addColumn</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;actions&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;&lt;a href=&quot;#&quot; class=&quot;btn btn-sm btn-primary&quot;&gt;Edit&lt;/a&gt;</span></span>
<span class="line"><span style="color: #CE9178">                            &lt;a href=&quot;#&quot; class=&quot;btn btn-sm btn-danger&quot;&gt;Delete&lt;/a&gt;&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">                })</span></span>
<span class="line"><span style="color: #D4D4D4">                -&gt;</span><span style="color: #DCDCAA">rawColumns</span><span style="color: #D4D4D4">(&#91;</span><span style="color: #CE9178">&#39;actions&#39;</span><span style="color: #D4D4D4">&#93;)</span></span>
<span class="line"><span style="color: #D4D4D4">                -&gt;</span><span style="color: #DCDCAA">make</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p><strong>Key Methods to Remember:</strong></p>



<ul class="wp-block-list">
<li><strong><code>addColumn()</code></strong>: Add custom columns</li>



<li><strong><code>editColumn()</code></strong>: Modify existing columns</li>



<li><strong><code>rawColumns()</code></strong>: Allow HTML content</li>



<li><strong><code>filter()</code></strong>: Add custom filters</li>



<li><strong><code>orderColumn()</code></strong>: Custom ordering logic</li>
</ul>



<h2 class="wp-block-heading" id="mastering-column-definitions"><strong>Mastering Column Definitions</strong></h2>



<p>Columns are the building blocks of your&nbsp;<strong>yajra datatable</strong>. Mastering them is like learning the alphabet – everything else builds upon this foundation.</p>



<p><strong>Basic Column Types:</strong></p>



<p><strong>Text Columns:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">JavaScript</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>{data: 'name', name: 'name', title: 'Full Name'}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">{</span><span style="color: #C8C8C8">data</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&#39;name&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #C8C8C8">name</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&#39;name&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #C8C8C8">title</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&#39;Full Name&#39;</span><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p><strong>Date Columns:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">JavaScript</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>{data: 'created_at', name: 'created_at', title: 'Registration Date'}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">{</span><span style="color: #C8C8C8">data</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&#39;created_at&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #C8C8C8">name</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&#39;created_at&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #C8C8C8">title</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&#39;Registration Date&#39;</span><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p><strong>Custom Columns:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>->addColumn('status', function($user) {
    return $user->is_active ? 
        '&lt;span class="badge badge-success">Active&lt;/span>' :
        '&lt;span class="badge badge-danger">Inactive&lt;/span>';
})</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">addColumn</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;status&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">is_active</span><span style="color: #D4D4D4"> ? </span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;&lt;span class=&quot;badge badge-success&quot;&gt;Active&lt;/span&gt;&#39;</span><span style="color: #D4D4D4"> :</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;&lt;span class=&quot;badge badge-danger&quot;&gt;Inactive&lt;/span&gt;&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">})</span></span></code></pre></div>



<p><strong>Conditional Columns:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>->addColumn('actions', function($user) {
    $actions = '&lt;a href="'.route('users.show', $user->id).'" class="btn btn-info">View&lt;/a>';
    
    if(auth()->user()->can('edit-users')) {
        $actions .= ' &lt;a href="'.route('users.edit', $user->id).'" class="btn btn-primary">Edit&lt;/a>';
    }
    
    return $actions;
})</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">addColumn</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;actions&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$actions</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&#39;&lt;a href=&quot;&#39;</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">route</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;users.show&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">id</span><span style="color: #D4D4D4">)</span><span style="color: #D4D4D4">.</span><span style="color: #CE9178">&#39;&quot; class=&quot;btn btn-info&quot;&gt;View&lt;/a&gt;&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">auth</span><span style="color: #D4D4D4">()-&gt;</span><span style="color: #DCDCAA">user</span><span style="color: #D4D4D4">()-&gt;</span><span style="color: #DCDCAA">can</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;edit-users&#39;</span><span style="color: #D4D4D4">)) {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$actions</span><span style="color: #D4D4D4"> </span><span style="color: #D4D4D4">.=</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39; &lt;a href=&quot;&#39;</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">route</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;users.edit&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">id</span><span style="color: #D4D4D4">)</span><span style="color: #D4D4D4">.</span><span style="color: #CE9178">&#39;&quot; class=&quot;btn btn-primary&quot;&gt;Edit&lt;/a&gt;&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$actions</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">})</span></span></code></pre></div>



<p><strong>Pro Tip:</strong>&nbsp;Always sanitize user input when creating custom columns to prevent XSS attacks.</p>



<figure class="wp-block-image size-large"><a href="https://serveravatar.com?ref=blog" target="_blank" rel=" noreferrer noopener"><img loading="lazy" decoding="async" width="1024" height="127" src="https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-1024x127.png" alt="Blog banner - ServerAvatar" class="wp-image-28184" srcset="https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-1024x127.png 1024w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-300x37.png 300w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-768x95.png 768w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-1536x190.png 1536w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-2048x254.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<h2 class="wp-block-heading" id="adding-search-and-filter-functionality"><strong>Adding Search and Filter Functionality</strong></h2>



<p>Search functionality in&nbsp;<strong>yajra datatable</strong>&nbsp;is like having a personal detective for your data. It can find anything, anywhere, instantly.</p>



<p><strong>Global Search (Built-in):</strong>&nbsp;The global search comes free with DataTables. But you can customize it:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>->filter(function ($query) use ($request) {
    if ($request->has('search')) {
        $search = $request->get('search')&#91;'value'&#93;;
        $query->where('name', 'like', "%{$search}%")
              ->orWhere('email', 'like', "%{$search}%");
    }
})</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">filter</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$query</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">use</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">has</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;search&#39;</span><span style="color: #D4D4D4">)) {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$search</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">get</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;search&#39;</span><span style="color: #D4D4D4">)&#91;</span><span style="color: #CE9178">&#39;value&#39;</span><span style="color: #D4D4D4">&#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$query</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">where</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;name&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;like&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;%{</span><span style="color: #9CDCFE">$search</span><span style="color: #CE9178">}%&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">              -&gt;</span><span style="color: #DCDCAA">orWhere</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;email&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;like&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;%{</span><span style="color: #9CDCFE">$search</span><span style="color: #CE9178">}%&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">})</span></span></code></pre></div>



<p><strong>Column-Specific Search:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Blade</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;input type="text" id="name-search" placeholder="Search by name">
&lt;input type="text" id="email-search" placeholder="Search by email">

&lt;script>
$('#name-search').keyup(function() {
    table.columns(1).search(this.value).draw();
});

$('#email-search').keyup(function() {
    table.columns(2).search(this.value).draw();
});
&lt;/script></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #808080">&lt;</span><span style="color: #569CD6">input</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">type</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;text&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">id</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;name-search&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">placeholder</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;Search by name&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #808080">&lt;</span><span style="color: #569CD6">input</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">type</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;text&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">id</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;email-search&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">placeholder</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;Search by email&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #808080">&lt;</span><span style="color: #569CD6">script</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #DCDCAA">$</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;#name-search&#39;</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">keyup</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">function</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">table</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">columns</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">search</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">value</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">draw</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">});</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">$</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;#email-search&#39;</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">keyup</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">function</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">table</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">columns</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">search</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">value</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">draw</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">});</span></span>
<span class="line"><span style="color: #808080">&lt;/</span><span style="color: #569CD6">script</span><span style="color: #808080">&gt;</span></span></code></pre></div>



<p><strong>Date Range Filters:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>->filter(function ($query) use ($request) {
    if ($request->filled(&#91;'start_date', 'end_date'&#93;)) {
        $query->whereBetween('created_at', &#91;
            $request->start_date,
            $request->end_date
        &#93;);
    }
})</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">filter</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$query</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">use</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">filled</span><span style="color: #D4D4D4">(&#91;</span><span style="color: #CE9178">&#39;start_date&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;end_date&#39;</span><span style="color: #D4D4D4">&#93;)) {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$query</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">whereBetween</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;created_at&#39;</span><span style="color: #D4D4D4">, &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">start_date</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">end_date</span></span>
<span class="line"><span style="color: #D4D4D4">        &#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">})</span></span></code></pre></div>



<h2 class="wp-block-heading" id="implementing-custom-actions-and-buttons"><strong>Implementing Custom Actions and Buttons</strong></h2>



<p>Actions and buttons are like the remote control of your&nbsp;<strong>yajra datatable</strong>&nbsp;– they give users the power to interact with your data.</p>



<p><strong>Basic Action Buttons:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>->addColumn('actions', function($user) {
    return '
        &lt;div class="btn-group">
            &lt;a href="'.route('users.show', $user->id).'" class="btn btn-sm btn-info" title="View">
                &lt;i class="fa fa-eye">&lt;/i>
            &lt;/a>
            &lt;a href="'.route('users.edit', $user->id).'" class="btn btn-sm btn-primary" title="Edit">
                &lt;i class="fa fa-edit">&lt;/i>
            &lt;/a>
            &lt;button class="btn btn-sm btn-danger delete-btn" data-id="'.$user->id.'" title="Delete">
                &lt;i class="fa fa-trash">&lt;/i>
            &lt;/button>
        &lt;/div>
    ';
})</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">addColumn</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;actions&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;</span></span>
<span class="line"><span style="color: #CE9178">        &lt;div class=&quot;btn-group&quot;&gt;</span></span>
<span class="line"><span style="color: #CE9178">            &lt;a href=&quot;&#39;</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">route</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;users.show&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">id</span><span style="color: #D4D4D4">)</span><span style="color: #D4D4D4">.</span><span style="color: #CE9178">&#39;&quot; class=&quot;btn btn-sm btn-info&quot; title=&quot;View&quot;&gt;</span></span>
<span class="line"><span style="color: #CE9178">                &lt;i class=&quot;fa fa-eye&quot;&gt;&lt;/i&gt;</span></span>
<span class="line"><span style="color: #CE9178">            &lt;/a&gt;</span></span>
<span class="line"><span style="color: #CE9178">            &lt;a href=&quot;&#39;</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">route</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;users.edit&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">id</span><span style="color: #D4D4D4">)</span><span style="color: #D4D4D4">.</span><span style="color: #CE9178">&#39;&quot; class=&quot;btn btn-sm btn-primary&quot; title=&quot;Edit&quot;&gt;</span></span>
<span class="line"><span style="color: #CE9178">                &lt;i class=&quot;fa fa-edit&quot;&gt;&lt;/i&gt;</span></span>
<span class="line"><span style="color: #CE9178">            &lt;/a&gt;</span></span>
<span class="line"><span style="color: #CE9178">            &lt;button class=&quot;btn btn-sm btn-danger delete-btn&quot; data-id=&quot;&#39;</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">id</span><span style="color: #D4D4D4">.</span><span style="color: #CE9178">&#39;&quot; title=&quot;Delete&quot;&gt;</span></span>
<span class="line"><span style="color: #CE9178">                &lt;i class=&quot;fa fa-trash&quot;&gt;&lt;/i&gt;</span></span>
<span class="line"><span style="color: #CE9178">            &lt;/button&gt;</span></span>
<span class="line"><span style="color: #CE9178">        &lt;/div&gt;</span></span>
<span class="line"><span style="color: #CE9178">    &#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">})</span></span></code></pre></div>



<p><strong>Bulk Actions:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Blade</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;div class="bulk-actions">
    &lt;select id="bulk-action">
        &lt;option value="">Select Action&lt;/option>
        &lt;option value="delete">Delete Selected&lt;/option>
        &lt;option value="activate">Activate Selected&lt;/option>
    &lt;/select>
    &lt;button id="apply-bulk" class="btn btn-primary">Apply&lt;/button>
&lt;/div></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">class</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;bulk-actions&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">select</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">id</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;bulk-action&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">option</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">value</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;&quot;</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">Select Action</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">option</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">option</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">value</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;delete&quot;</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">Delete Selected</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">option</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">option</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">value</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;activate&quot;</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">Activate Selected</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">option</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">select</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">button</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">id</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;apply-bulk&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">class</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;btn btn-primary&quot;</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">Apply</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">button</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span></code></pre></div>



<p><strong>JavaScript for Bulk Actions:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">JavaScript</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>$('#apply-bulk').click(function() {
    var action = $('#bulk-action').val();
    var selectedIds = [];
    
    $('.row-checkbox:checked').each(function() {
        selectedIds.push($(this).val());
    });
    
    if(selectedIds.length > 0 &amp;&amp; action) {
        // Perform bulk action
        $.ajax({
            url: '/users/bulk-action',
            method: 'POST',
            data: {
                action: action,
                ids: selectedIds,
                _token: $('meta&#91;name="csrf-token"&#93;').attr('content')
            },
            success: function(response) {
                table.ajax.reload();
            }
        });
    }
});</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">$</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;#apply-bulk&#39;</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">click</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">function</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">action</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">$</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;#bulk-action&#39;</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">val</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">selectedIds</span><span style="color: #D4D4D4"> = [];</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">$</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;.row-checkbox:checked&#39;</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">each</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">function</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">selectedIds</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">push</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">$</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">val</span><span style="color: #D4D4D4">());</span></span>
<span class="line"><span style="color: #D4D4D4">    });</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">selectedIds</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">length</span><span style="color: #D4D4D4"> &gt; </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> &amp;&amp; </span><span style="color: #9CDCFE">action</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955">// Perform bulk action</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">ajax</span><span style="color: #D4D4D4">({</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">url:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;/users/bulk-action&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">method:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;POST&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">data:</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">action:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">action</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">ids:</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">selectedIds</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">_token:</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">$</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;meta&#91;name=&quot;csrf-token&quot;&#93;&#39;</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">attr</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;content&#39;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">            },</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #DCDCAA">success</span><span style="color: #9CDCFE">:</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">response</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">table</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">ajax</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">reload</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">        });</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">});</span></span></code></pre></div>



<h2 class="wp-block-heading" id="working-with-relationships-and-joins"><strong>Working with Relationships and Joins</strong></h2>



<p>When working with&nbsp;<strong>yajra datatable</strong>, relationships are like family connections – they make your data more meaningful and interconnected.</p>



<p><strong>Basic Relationship Handling:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public function getData()
{
    $users = User::with('profile', 'roles')
        ->select(&#91;'id', 'name', 'email', 'created_at'&#93;);
    
    return DataTables::of($users)
        ->addColumn('profile_picture', function($user) {
            return $user->profile &amp;&amp; $user->profile->avatar ? 
                '&lt;img src="'.$user->profile->avatar.'" width="50">' : 
                'No Image';
        })
        ->addColumn('roles', function($user) {
            return $user->roles->pluck('name')->implode(', ');
        })
        ->rawColumns(&#91;'profile_picture'&#93;)
        ->make(true);
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">getData</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$users</span><span style="color: #D4D4D4"> = </span><span style="color: #4EC9B0">User</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">with</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;profile&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;roles&#39;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        -&gt;</span><span style="color: #DCDCAA">select</span><span style="color: #D4D4D4">(&#91;</span><span style="color: #CE9178">&#39;id&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;name&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;email&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;created_at&#39;</span><span style="color: #D4D4D4">&#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">DataTables</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">of</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$users</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        -&gt;</span><span style="color: #DCDCAA">addColumn</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;profile_picture&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">profile</span><span style="color: #D4D4D4"> &amp;&amp; </span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">profile</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">avatar</span><span style="color: #D4D4D4"> ? </span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #CE9178">&#39;&lt;img src=&quot;&#39;</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">profile</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">avatar</span><span style="color: #D4D4D4">.</span><span style="color: #CE9178">&#39;&quot; width=&quot;50&quot;&gt;&#39;</span><span style="color: #D4D4D4"> : </span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #CE9178">&#39;No Image&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        })</span></span>
<span class="line"><span style="color: #D4D4D4">        -&gt;</span><span style="color: #DCDCAA">addColumn</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;roles&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">roles</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">pluck</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;name&#39;</span><span style="color: #D4D4D4">)-&gt;</span><span style="color: #DCDCAA">implode</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;, &#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        })</span></span>
<span class="line"><span style="color: #D4D4D4">        -&gt;</span><span style="color: #DCDCAA">rawColumns</span><span style="color: #D4D4D4">(&#91;</span><span style="color: #CE9178">&#39;profile_picture&#39;</span><span style="color: #D4D4D4">&#93;)</span></span>
<span class="line"><span style="color: #D4D4D4">        -&gt;</span><span style="color: #DCDCAA">make</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p><strong>Join Queries for Better Performance:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>$users = User::leftJoin('profiles', 'users.id', '=', 'profiles.user_id')
    ->leftJoin('user_roles', 'users.id', '=', 'user_roles.user_id')
    ->leftJoin('roles', 'user_roles.role_id', '=', 'roles.id')
    ->select(&#91;
        'users.id',
        'users.name',
        'users.email',
        'profiles.avatar',
        'roles.name as role_name'
    &#93;);</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #9CDCFE">$users</span><span style="color: #D4D4D4"> = </span><span style="color: #4EC9B0">User</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">leftJoin</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;profiles&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;users.id&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;=&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;profiles.user_id&#39;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    -&gt;</span><span style="color: #DCDCAA">leftJoin</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;user_roles&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;users.id&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;=&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;user_roles.user_id&#39;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    -&gt;</span><span style="color: #DCDCAA">leftJoin</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;roles&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;user_roles.role_id&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;=&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;roles.id&#39;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    -&gt;</span><span style="color: #DCDCAA">select</span><span style="color: #D4D4D4">(&#91;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;users.id&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;users.name&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;users.email&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;profiles.avatar&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;roles.name as role_name&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">    &#93;);</span></span></code></pre></div>



<p><strong>Handling Complex Relationships:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>->editColumn('department', function($user) {
    return $user->profile &amp;&amp; $user->profile->department ? 
        $user->profile->department->name : 'Not Assigned';
})</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">editColumn</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;department&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">profile</span><span style="color: #D4D4D4"> &amp;&amp; </span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">profile</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">department</span><span style="color: #D4D4D4"> ? </span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">profile</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">department</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">name</span><span style="color: #D4D4D4"> : </span><span style="color: #CE9178">&#39;Not Assigned&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">})</span></span></code></pre></div>



<h2 class="wp-block-heading" id="advanced-styling-and-customization"><strong>Advanced Styling and Customization</strong></h2>



<p>Styling your&nbsp;<strong>yajra datatable</strong>&nbsp;is like dressing up for a special occasion – it makes everything look more professional and appealing.</p>



<p><strong>Custom CSS Classes:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">CSS</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>.custom-datatable {
    font-family: 'Roboto', sans-serif;
}

.custom-datatable thead th {
    background-color: #3498db;
    color: white;
    font-weight: 600;
}

.custom-datatable tbody tr:hover {
    background-color: #f8f9fa;
}

.status-active {
    color: #28a745;
    font-weight: bold;
}

.status-inactive {
    color: #dc3545;
    font-weight: bold;
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D7BA7D">.custom-datatable</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">font-family</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&#39;Roboto&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">sans-serif</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D7BA7D">.custom-datatable</span><span style="color: #D4D4D4"> </span><span style="color: #D7BA7D">thead</span><span style="color: #D4D4D4"> </span><span style="color: #D7BA7D">th</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">background-color</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">#3498db</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">color</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">white</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">font-weight</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">600</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D7BA7D">.custom-datatable</span><span style="color: #D4D4D4"> </span><span style="color: #D7BA7D">tbody</span><span style="color: #D4D4D4"> </span><span style="color: #D7BA7D">tr:hover</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">background-color</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">#f8f9fa</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D7BA7D">.status-active</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">color</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">#28a745</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">font-weight</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">bold</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D7BA7D">.status-inactive</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">color</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">#dc3545</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">font-weight</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">bold</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p><strong>Bootstrap Integration:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">HTML</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;link rel="stylesheet" href="https://cdn.datatables.net/1.13.7/css/dataTables.bootstrap5.min.css">
&lt;script src="https://cdn.datatables.net/1.13.7/js/dataTables.bootstrap5.min.js">&lt;/script></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #808080">&lt;</span><span style="color: #569CD6">link</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">rel</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;stylesheet&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">href</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;https://cdn.datatables.net/1.13.7/css/dataTables.bootstrap5.min.css&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #808080">&lt;</span><span style="color: #569CD6">script</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">src</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;https://cdn.datatables.net/1.13.7/js/dataTables.bootstrap5.min.js&quot;</span><span style="color: #808080">&gt;&lt;/</span><span style="color: #569CD6">script</span><span style="color: #808080">&gt;</span></span></code></pre></div>



<p><strong>Custom Theme Configuration:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">JavaScript</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>$('#users-table').DataTable({
    // ... other options
    dom: '&lt;"row"&lt;"col-sm-6"l>&lt;"col-sm-6"f>>rtip',
    language: {
        search: "Search Users:",
        lengthMenu: "Show _MENU_ users per page",
        info: "Showing _START_ to _END_ of _TOTAL_ users",
        paginate: {
            first: "First",
            last: "Last",
            next: "Next",
            previous: "Previous"
        }
    }
});</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">$</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;#users-table&#39;</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">DataTable</span><span style="color: #D4D4D4">({</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">// ... other options</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">dom:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;&lt;&quot;row&quot;&lt;&quot;col-sm-6&quot;l&gt;&lt;&quot;col-sm-6&quot;f&gt;&gt;rtip&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">language:</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">search:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;Search Users:&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">lengthMenu:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;Show _MENU_ users per page&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">info:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;Showing _START_ to _END_ of _TOTAL_ users&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">paginate:</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">first:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;First&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">last:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;Last&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">next:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;Next&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">previous:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;Previous&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">});</span></span></code></pre></div>



<h2 class="wp-block-heading" id="performance-optimization-techniques"><strong>Performance Optimization Techniques</strong></h2>



<p>Performance optimization for&nbsp;<strong>yajra datatable</strong>&nbsp;is like tuning a race car – every little improvement makes a big difference in the overall experience.</p>



<p><strong>Database Optimization:</strong></p>



<p><strong>Use Indexes:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// In your migration
Schema::table('users', function (Blueprint $table) {
    $table->index(&#91;'name', 'email'&#93;);
    $table->index('created_at');
});</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// In your migration</span></span>
<span class="line"><span style="color: #4EC9B0">Schema</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">table</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;users&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> (</span><span style="color: #4EC9B0">Blueprint</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$table</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$table</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">index</span><span style="color: #D4D4D4">(&#91;</span><span style="color: #CE9178">&#39;name&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;email&#39;</span><span style="color: #D4D4D4">&#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$table</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">index</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;created_at&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">});</span></span></code></pre></div>



<p><strong>Select Only Required Columns:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>$users = User::select(&#91;'id', 'name', 'email', 'created_at'&#93;)
    ->with(&#91;'profile:id,user_id,avatar'&#93;);</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #9CDCFE">$users</span><span style="color: #D4D4D4"> = </span><span style="color: #4EC9B0">User</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">select</span><span style="color: #D4D4D4">(&#91;</span><span style="color: #CE9178">&#39;id&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;name&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;email&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;created_at&#39;</span><span style="color: #D4D4D4">&#93;)</span></span>
<span class="line"><span style="color: #D4D4D4">    -&gt;</span><span style="color: #DCDCAA">with</span><span style="color: #D4D4D4">(&#91;</span><span style="color: #CE9178">&#39;profile:id,user_id,avatar&#39;</span><span style="color: #D4D4D4">&#93;);</span></span></code></pre></div>



<p><strong>Implement Query Scopes:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// In User Model
public function scopeActive($query)
{
    return $query->where('is_active', true);
}

// In Controller
$users = User::active()->select(&#91;'id', 'name', 'email'&#93;);</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// In User Model</span></span>
<span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">scopeActive</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$query</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$query</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">where</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;is_active&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">// In Controller</span></span>
<span class="line"><span style="color: #9CDCFE">$users</span><span style="color: #D4D4D4"> = </span><span style="color: #4EC9B0">User</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">active</span><span style="color: #D4D4D4">()-&gt;</span><span style="color: #DCDCAA">select</span><span style="color: #D4D4D4">(&#91;</span><span style="color: #CE9178">&#39;id&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;name&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;email&#39;</span><span style="color: #D4D4D4">&#93;);</span></span></code></pre></div>



<p><strong>Frontend Optimization:</strong></p>



<p><strong>Enable Server-Side Processing:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">JavaScript</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>$('#users-table').DataTable({
    processing: true,
    serverSide: true,
    deferRender: true,
    // ... other options
});</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">$</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;#users-table&#39;</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">DataTable</span><span style="color: #D4D4D4">({</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">processing:</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">serverSide:</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">deferRender:</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">// ... other options</span></span>
<span class="line"><span style="color: #D4D4D4">});</span></span></code></pre></div>



<p><strong>Optimize Column Rendering:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>->editColumn('created_at', function($user) {
    return $user->created_at->format('M d, Y');
})
->filterColumn('created_at', function($query, $keyword) {
    $query->whereDate('created_at', $keyword);
})</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">editColumn</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;created_at&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">created_at</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">format</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;M d, Y&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">})</span></span>
<span class="line"><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">filterColumn</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;created_at&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$query</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">$keyword</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$query</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">whereDate</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;created_at&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">$keyword</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">})</span></span></code></pre></div>



<h2 class="wp-block-heading" id="handling-large-datasets-efficiently"><strong>Handling Large Datasets Efficiently</strong></h2>



<p>When dealing with massive datasets, your&nbsp;<strong>yajra datatable</strong>&nbsp;needs to be like a well-oiled machine – efficient, smooth, and never breaking down under pressure.</p>



<p><strong>Pagination Strategies:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">JavaScript</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>$('#users-table').DataTable({
    pageLength: 25,
    lengthMenu: [&#91;10, 25, 50, 100&#93;, &#91;10, 25, 50, 100&#93;],
    processing: true,
    serverSide: true
});</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">$</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;#users-table&#39;</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">DataTable</span><span style="color: #D4D4D4">({</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">pageLength:</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">25</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">lengthMenu:</span><span style="color: #D4D4D4"> [&#91;</span><span style="color: #B5CEA8">10</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">25</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">50</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">100</span><span style="color: #D4D4D4">&#93;, &#91;</span><span style="color: #B5CEA8">10</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">25</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">50</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">100</span><span style="color: #D4D4D4">&#93;],</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">processing:</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">serverSide:</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">true</span></span>
<span class="line"><span style="color: #D4D4D4">});</span></span></code></pre></div>



<p><strong>Memory Management:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public function getData()
{
    $users = User::query();
    
    return DataTables::of($users)
        ->setTotalRecords(User::count()) // Cache total count
        ->setFilteredRecords(User::count()) // Cache filtered count
        ->make(true);
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">getData</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$users</span><span style="color: #D4D4D4"> = </span><span style="color: #4EC9B0">User</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">query</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">DataTables</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">of</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$users</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        -&gt;</span><span style="color: #DCDCAA">setTotalRecords</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">User</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">count</span><span style="color: #D4D4D4">()) </span><span style="color: #6A9955">// Cache total count</span></span>
<span class="line"><span style="color: #D4D4D4">        -&gt;</span><span style="color: #DCDCAA">setFilteredRecords</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">User</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">count</span><span style="color: #D4D4D4">()) </span><span style="color: #6A9955">// Cache filtered count</span></span>
<span class="line"><span style="color: #D4D4D4">        -&gt;</span><span style="color: #DCDCAA">make</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p><strong>Chunked Processing:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>User::chunk(1000, function ($users) {
    foreach ($users as $user) {
        // Process each user
    }
});</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #4EC9B0">User</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">chunk</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">1000</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$users</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">foreach</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$users</span><span style="color: #D4D4D4"> as </span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955">// Process each user</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">});</span></span></code></pre></div>



<p><strong>Caching Strategies:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public function getData(Request $request)
{
    $cacheKey = 'users_datatable_' . md5($request->getQueryString());
    
    return Cache::remember($cacheKey, 300, function() use ($request) {
        // Your DataTable logic here
    });
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">getData</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">Request</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$cacheKey</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&#39;users_datatable_&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #D4D4D4">.</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">md5</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">getQueryString</span><span style="color: #D4D4D4">());</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Cache</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">remember</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$cacheKey</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">300</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4">() </span><span style="color: #569CD6">use</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955">// Your DataTable logic here</span></span>
<span class="line"><span style="color: #D4D4D4">    });</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h2 class="wp-block-heading" id="security-best-practices"><strong>Security Best Practices</strong></h2>



<p>Security in&nbsp;<strong>yajra datatable</strong>&nbsp;is like having a good security system in your home – it protects what’s valuable and gives you peace of mind.</p>



<p><strong>Input Validation:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public function getData(Request $request)
{
    $request->validate(&#91;
        'start' => 'integer|min:0',
        'length' => 'integer|min:1|max:100',
        'search.value' => 'string|max:255'
    &#93;);
    
    // Your logic here
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">getData</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">Request</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">validate</span><span style="color: #D4D4D4">(&#91;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;start&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;integer|min:0&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;length&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;integer|min:1|max:100&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;search.value&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;string|max:255&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">    &#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">// Your logic here</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p><strong>SQL Injection Prevention:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>->filter(function ($query) use ($request) {
    if ($request->filled('search.value')) {
        $search = $request->input('search.value');
        $query->where('name', 'LIKE', '%' . $search . '%');
        // Never use raw SQL with user input
    }
})</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">filter</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$query</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">use</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">filled</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;search.value&#39;</span><span style="color: #D4D4D4">)) {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$search</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">input</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;search.value&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$query</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">where</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;name&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;LIKE&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;%&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #D4D4D4">.</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$search</span><span style="color: #D4D4D4"> </span><span style="color: #D4D4D4">.</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;%&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955">// Never use raw SQL with user input</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">})</span></span></code></pre></div>



<p><strong>XSS Protection:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>->addColumn('description', function($user) {
    return e($user->description); // Escape HTML entities
})
->rawColumns(&#91;'actions'&#93;) // Only allow HTML in specific columns</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">addColumn</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;description&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">e</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">description</span><span style="color: #D4D4D4">); </span><span style="color: #6A9955">// Escape HTML entities</span></span>
<span class="line"><span style="color: #D4D4D4">})</span></span>
<span class="line"><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">rawColumns</span><span style="color: #D4D4D4">(&#91;</span><span style="color: #CE9178">&#39;actions&#39;</span><span style="color: #D4D4D4">&#93;) </span><span style="color: #6A9955">// Only allow HTML in specific columns</span></span></code></pre></div>



<p><strong>Authorization Checks:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public function getData(Request $request)
{
    $this->authorize('view-users');
    
    $users = User::query();
    
    // Filter based on user permissions
    if (!auth()->user()->hasRole('admin')) {
        $users->where('department_id', auth()->user()->department_id);
    }
    
    return DataTables::of($users)->make(true);
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">getData</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">Request</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">$this</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">authorize</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;view-users&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$users</span><span style="color: #D4D4D4"> = </span><span style="color: #4EC9B0">User</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">query</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">// Filter based on user permissions</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (!</span><span style="color: #DCDCAA">auth</span><span style="color: #D4D4D4">()-&gt;</span><span style="color: #DCDCAA">user</span><span style="color: #D4D4D4">()-&gt;</span><span style="color: #DCDCAA">hasRole</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;admin&#39;</span><span style="color: #D4D4D4">)) {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$users</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">where</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;department_id&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #DCDCAA">auth</span><span style="color: #D4D4D4">()-&gt;</span><span style="color: #DCDCAA">user</span><span style="color: #D4D4D4">()-&gt;</span><span style="color: #9CDCFE">department_id</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">DataTables</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">of</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$users</span><span style="color: #D4D4D4">)-&gt;</span><span style="color: #DCDCAA">make</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h2 class="wp-block-heading" id="common-troubleshooting-issues"><strong>Common Troubleshooting Issues</strong></h2>



<p>Even the best&nbsp;<strong>yajra datatable</strong>&nbsp;implementations sometimes hiccup. Here are the most common issues and their solutions:</p>



<p><strong>Issue 1: &#8220;DataTables warning: table id=example &#8211; Invalid JSON response&#8221;</strong></p>



<p><strong>Solution:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// Check your route returns JSON
return DataTables::of($users)->make(true);

// Debug by checking raw response
dd($users->toArray());</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// Check your route returns JSON</span></span>
<span class="line"><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">DataTables</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">of</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$users</span><span style="color: #D4D4D4">)-&gt;</span><span style="color: #DCDCAA">make</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">// Debug by checking raw response</span></span>
<span class="line"><span style="color: #DCDCAA">dd</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$users</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">toArray</span><span style="color: #D4D4D4">());</span></span></code></pre></div>



<p><strong>Issue 2: Search not working properly</strong></p>



<p><strong>Solution:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>->filterColumn('full_name', function($query, $keyword) {
    $sql = "CONCAT(first_name,' ',last_name) like ?";
    $query->whereRaw($sql, &#91;"%{$keyword}%"&#93;);
})</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">filterColumn</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;full_name&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$query</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">$keyword</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$sql</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;CONCAT(first_name,&#39; &#39;,last_name) like ?&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$query</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">whereRaw</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$sql</span><span style="color: #D4D4D4">, &#91;</span><span style="color: #CE9178">&quot;%{</span><span style="color: #9CDCFE">$keyword</span><span style="color: #CE9178">}%&quot;</span><span style="color: #D4D4D4">&#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">})</span></span></code></pre></div>



<p><strong>Issue 3: Actions column not displaying HTML</strong></p>



<p><strong>Solution:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>->rawColumns(&#91;'actions', 'status'&#93;) // Don't forget this!</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">rawColumns</span><span style="color: #D4D4D4">(&#91;</span><span style="color: #CE9178">&#39;actions&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;status&#39;</span><span style="color: #D4D4D4">&#93;) </span><span style="color: #6A9955">// Don&#39;t forget this!</span></span></code></pre></div>



<p><strong>Issue 4: Slow performance with large datasets</strong></p>



<p><strong>Solution:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// Enable server-side processing
'serverSide' => true,

// Optimize queries
$users = User::select(&#91;'id', 'name', 'email'&#93;); // Only needed columns</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// Enable server-side processing</span></span>
<span class="line"><span style="color: #CE9178">&#39;serverSide&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">,</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">// Optimize queries</span></span>
<span class="line"><span style="color: #9CDCFE">$users</span><span style="color: #D4D4D4"> = </span><span style="color: #4EC9B0">User</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">select</span><span style="color: #D4D4D4">(&#91;</span><span style="color: #CE9178">&#39;id&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;name&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;email&#39;</span><span style="color: #D4D4D4">&#93;); </span><span style="color: #6A9955">// Only needed columns</span></span></code></pre></div>



<p><strong>Issue 5: CSRF token mismatch</strong></p>



<p><strong>Solution:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Blade</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;meta name="csrf-token" content="{{ csrf_token() }}">

&lt;script>
$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta&#91;name="csrf-token"&#93;').attr('content')
    }
});
&lt;/script></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #808080">&lt;</span><span style="color: #569CD6">meta</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">name</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;csrf-token&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">content</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;</span><span style="color: #DCDCAA">{{</span><span style="color: #CE9178"> </span><span style="color: #DCDCAA">csrf_token</span><span style="color: #CE9178">() </span><span style="color: #DCDCAA">}}</span><span style="color: #CE9178">&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #808080">&lt;</span><span style="color: #569CD6">script</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #9CDCFE">$</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">ajaxSetup</span><span style="color: #D4D4D4">({</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">headers:</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;X-CSRF-TOKEN&#39;</span><span style="color: #9CDCFE">:</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">$</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;meta&#91;name=&quot;csrf-token&quot;&#93;&#39;</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">attr</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;content&#39;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">});</span></span>
<span class="line"><span style="color: #808080">&lt;/</span><span style="color: #569CD6">script</span><span style="color: #808080">&gt;</span></span></code></pre></div>



<h2 class="wp-block-heading" id="real-world-examples-and-use-cases"><strong>Real-World Examples and Use Cases</strong></h2>



<p>Let’s look at some real-world scenarios where&nbsp;<strong>yajra datatable</strong>&nbsp;shines like a diamond.</p>



<p><strong>E-commerce Order Management:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public function getOrdersData()
{
    $orders = Order::with(&#91;'customer', 'items'&#93;)
        ->select(&#91;'id', 'order_number', 'customer_id', 'total', 'status', 'created_at'&#93;);
    
    return DataTables::of($orders)
        ->addColumn('customer_name', function($order) {
            return $order->customer->name ?? 'Guest';
        })
        ->addColumn('items_count', function($order) {
            return $order->items->count();
        })
        ->editColumn('total', function($order) {
            return '$' . number_format($order->total, 2);
        })
        ->addColumn('actions', function($order) {
            return '&lt;a href="'.route('orders.show', $order->id).'" class="btn btn-info">View&lt;/a>
                    &lt;a href="'.route('orders.invoice', $order->id).'" class="btn btn-success">Invoice&lt;/a>';
        })
        ->rawColumns(&#91;'actions'&#93;)
        ->make(true);
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">getOrdersData</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$orders</span><span style="color: #D4D4D4"> = </span><span style="color: #4EC9B0">Order</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">with</span><span style="color: #D4D4D4">(&#91;</span><span style="color: #CE9178">&#39;customer&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;items&#39;</span><span style="color: #D4D4D4">&#93;)</span></span>
<span class="line"><span style="color: #D4D4D4">        -&gt;</span><span style="color: #DCDCAA">select</span><span style="color: #D4D4D4">(&#91;</span><span style="color: #CE9178">&#39;id&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;order_number&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;customer_id&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;total&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;status&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;created_at&#39;</span><span style="color: #D4D4D4">&#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">DataTables</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">of</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$orders</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        -&gt;</span><span style="color: #DCDCAA">addColumn</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;customer_name&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$order</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$order</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">customer</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">name</span><span style="color: #D4D4D4"> ?? </span><span style="color: #CE9178">&#39;Guest&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        })</span></span>
<span class="line"><span style="color: #D4D4D4">        -&gt;</span><span style="color: #DCDCAA">addColumn</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;items_count&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$order</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$order</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">items</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">count</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">        })</span></span>
<span class="line"><span style="color: #D4D4D4">        -&gt;</span><span style="color: #DCDCAA">editColumn</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;total&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$order</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;$&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #D4D4D4">.</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">number_format</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$order</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">total</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        })</span></span>
<span class="line"><span style="color: #D4D4D4">        -&gt;</span><span style="color: #DCDCAA">addColumn</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;actions&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$order</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;&lt;a href=&quot;&#39;</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">route</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;orders.show&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">$order</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">id</span><span style="color: #D4D4D4">)</span><span style="color: #D4D4D4">.</span><span style="color: #CE9178">&#39;&quot; class=&quot;btn btn-info&quot;&gt;View&lt;/a&gt;</span></span>
<span class="line"><span style="color: #CE9178">                    &lt;a href=&quot;&#39;</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">route</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;orders.invoice&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">$order</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">id</span><span style="color: #D4D4D4">)</span><span style="color: #D4D4D4">.</span><span style="color: #CE9178">&#39;&quot; class=&quot;btn btn-success&quot;&gt;Invoice&lt;/a&gt;&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        })</span></span>
<span class="line"><span style="color: #D4D4D4">        -&gt;</span><span style="color: #DCDCAA">rawColumns</span><span style="color: #D4D4D4">(&#91;</span><span style="color: #CE9178">&#39;actions&#39;</span><span style="color: #D4D4D4">&#93;)</span></span>
<span class="line"><span style="color: #D4D4D4">        -&gt;</span><span style="color: #DCDCAA">make</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p><strong>Employee Management System:</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public function getEmployeesData()
{
    $employees = Employee::with(&#91;'department', 'position'&#93;)
        ->select(&#91;'id', 'employee_id', 'name', 'email', 'department_id', 'position_id', 'salary', 'hire_date'&#93;);
    
    return DataTables::of($employees)
        ->addColumn('department_name', function($employee) {
            return $employee->department->name ?? 'Not Assigned';
        })
        ->addColumn('position_title', function($employee) {
            return $employee->position->title ?? 'Not Assigned';
        })
        ->editColumn('salary', function($employee) {
            return '$' . number_format($employee->salary, 0);
        })
        ->editColumn('hire_date', function($employee) {
            return $employee->hire_date->format('M d, Y');
        })
        ->filter(function ($query) use ($request) {
            if ($request->filled('department')) {
                $query->where('department_id', $request->department);
            }
            if ($request->filled('position')) {
                $query->where('position_id', $request->position);
            }
        })
        ->make(true);
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">getEmployeesData</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$employees</span><span style="color: #D4D4D4"> = </span><span style="color: #4EC9B0">Employee</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">with</span><span style="color: #D4D4D4">(&#91;</span><span style="color: #CE9178">&#39;department&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;position&#39;</span><span style="color: #D4D4D4">&#93;)</span></span>
<span class="line"><span style="color: #D4D4D4">        -&gt;</span><span style="color: #DCDCAA">select</span><span style="color: #D4D4D4">(&#91;</span><span style="color: #CE9178">&#39;id&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;employee_id&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;name&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;email&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;department_id&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;position_id&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;salary&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;hire_date&#39;</span><span style="color: #D4D4D4">&#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">DataTables</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">of</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$employees</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        -&gt;</span><span style="color: #DCDCAA">addColumn</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;department_name&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$employee</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$employee</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">department</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">name</span><span style="color: #D4D4D4"> ?? </span><span style="color: #CE9178">&#39;Not Assigned&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        })</span></span>
<span class="line"><span style="color: #D4D4D4">        -&gt;</span><span style="color: #DCDCAA">addColumn</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;position_title&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$employee</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$employee</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">position</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">title</span><span style="color: #D4D4D4"> ?? </span><span style="color: #CE9178">&#39;Not Assigned&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        })</span></span>
<span class="line"><span style="color: #D4D4D4">        -&gt;</span><span style="color: #DCDCAA">editColumn</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;salary&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$employee</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;$&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #D4D4D4">.</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">number_format</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$employee</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">salary</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        })</span></span>
<span class="line"><span style="color: #D4D4D4">        -&gt;</span><span style="color: #DCDCAA">editColumn</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;hire_date&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$employee</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$employee</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">hire_date</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">format</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;M d, Y&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        })</span></span>
<span class="line"><span style="color: #D4D4D4">        -&gt;</span><span style="color: #DCDCAA">filter</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$query</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">use</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">filled</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;department&#39;</span><span style="color: #D4D4D4">)) {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">$query</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">where</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;department_id&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">department</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">filled</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;position&#39;</span><span style="color: #D4D4D4">)) {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">$query</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">where</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;position_id&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">position</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">        })</span></span>
<span class="line"><span style="color: #D4D4D4">        -&gt;</span><span style="color: #DCDCAA">make</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p>For more complex applications that require robust hosting, consider checking out professional deployment options at&nbsp;<a href="https://laravel.com/docs/10.x/deployment">ServerAvatar Laravel Deployment Guide</a>&nbsp;for production-ready setups.</p>



<h2 class="wp-block-heading" id="conclusion">Conclusion</h2>



<p>Mastering&nbsp;<strong>Yajra DataTables</strong>&nbsp;in Laravel is like learning to ride a bike – once you get it, you never forget it, and it opens up a whole new world of possibilities. We’ve covered everything from basic setup to advanced optimization techniques, security best practices, and real-world applications.</p>



<p>Remember, the key to becoming a&nbsp;<strong>yajra datatable</strong>&nbsp;pro isn’t just about knowing the features – it’s about understanding when and how to use them effectively. Start with simple implementations and gradually add complexity as your needs grow.</p>



<p>The beauty of&nbsp;<strong>yajra datatable</strong>&nbsp;lies in its flexibility and power. Whether you’re building a simple admin panel or a complex enterprise application, this package provides the tools you need to create exceptional data experiences for your users.</p>



<p>Keep practicing, keep experimenting, and most importantly, keep building amazing applications with Laravel and DataTables!</p>



<h2 class="wp-block-heading" id="frequently-asked-questions">Frequently Asked Questions</h2>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question"><strong>What is the difference between client-side and server-side processing in yajra datatable?</strong></h3><div class="aioseo-faq-block-answer">
<p>Client-side processing loads all data at once and handles sorting, searching, and pagination in the browser using JavaScript. This works well for smaller datasets (under 1000 records) but can slow down with larger datasets. Server-side processing, on the other hand, sends requests to the server for each operation, making it ideal for large datasets as it only loads the data currently needed for display.</p>
</div></div>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question"><strong>How can I add custom filters to my yajra datatable implementation?</strong></h3><div class="aioseo-faq-block-answer">
<p>You can add custom filters by using the&nbsp;<code>filter()</code>&nbsp;method in your DataTable controller. Create additional input fields in your view, capture their values via AJAX, and apply them in the filter method. For example, you can filter by date ranges, dropdown selections, or any custom criteria by modifying the query builder within the filter callback function.</p>
</div></div>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question"><strong>Why is my yajra datatable showing &#8220;No data available&#8221; even though my database has records?</strong></h3><div class="aioseo-faq-block-answer">
<p>This usually happens due to incorrect route configuration, missing CSRF tokens, or JSON response issues. Check that your DataTable route is correctly defined, ensure the controller method returns&nbsp;<code>DataTables::of($query)-&gt;make(true)</code>, verify that the AJAX URL in your JavaScript matches your route, and confirm that your controller method is accessible and returning proper JSON responses.</p>
</div></div>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question"><strong>How do I optimize yajra datatable performance for large datasets?</strong></h3><div class="aioseo-faq-block-answer">
<p>Enable server-side processing, select only required columns in your queries, use database indexes on searchable and sortable columns, implement proper caching strategies, consider pagination limits, and use eager loading for relationships to avoid N+1 query problems. Also, consider using database views or optimized queries for complex data transformations.</p>
</div></div>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question"><strong>Can I export data from yajra datatable to Excel or PDF formats?</strong></h3><div class="aioseo-faq-block-answer">
<p>Yes, you can integrate export functionality using DataTables’ Buttons extension or create custom export endpoints in Laravel. For Excel exports, you can use Laravel Excel package, and for PDF exports, consider packages like DomPDF or wkhtmltopdf. You can add export buttons to your DataTable configuration and handle the export logic in separate controller methods that format and return the data in the desired format.</p>
</div></div>



<div style="font-family: 'Public Sans', sans-serif; background: #fff; border: 1px solid #e1eaff; padding: 40px 35px; border-radius: 16px; margin: 60px 0; box-shadow: 0 10px 32px rgba(0, 0, 0, 0.05); max-width: 860px; margin-left: auto; margin-right: auto; text-align: center;">

  <h2 style="font-size: 28px; font-weight: 800; color: #0b2b53; margin-top: 0; margin-bottom: 16px;">
    Stop Wasting Time on Servers. Start Building Instead.
  </h2>

  <p style="font-size: 17px; color: #333; font-weight: 500; margin: 0 0 12px;">
    You didn’t start your project to babysit servers.
    Let <strong>ServerAvatar</strong> handle deployment, monitoring, and backups — so you can focus on growth.
  </p>

  <p style="font-size: 16px; color: #555; font-weight: 400; margin-bottom: 24px;">
    Deploy <strong>WordPress, Laravel, N8N</strong>, and more in minutes.
    No DevOps required. No command line. No stress.
  </p>

  <div style="display: inline-flex; justify-content: center; gap: 10px; flex-wrap: wrap; margin-bottom: 16px;">
    <a href="https://app.serveravatar.com" target="_blank" rel="noopener"
       style="background: linear-gradient(135deg, #007bff, #0056d2); color: #fff; text-decoration: none; padding: 10px 20px; font-size: 14px; font-weight: 600; border-radius: 8px; text-align: center;">
      🚀 Try Free
    </a>
    <a href="https://serveravatar.com/" target="_blank" rel="noopener"
       style="background: #f5f9ff; color: #0056d2; text-decoration: none; padding: 10px 20px; font-size: 14px; font-weight: 600; border-radius: 8px; border: 1px solid #d2e3ff; text-align: center;">
      🌐 Learn More
    </a>
  </div>

  <p style="font-size: 14px; color: #888; margin-top: 10px;">
    Trusted by 10,000+ developers and growing.
  </p>
</div><p>The post <a href="https://serveravatar.com/master-yajra-datatables-laravel-tutorial/">How to Use Yajra DataTables in Laravel Like a Pro</a> first appeared on <a href="https://serveravatar.com">ServerAvatar</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Quick Stripe Integration Guide for Laravel Users</title>
		<link>https://serveravatar.com/quick-stripe-integration-guide-for-laravel-users/</link>
		
		<dc:creator><![CDATA[Suresh Ramani]]></dc:creator>
		<pubDate>Sat, 09 Aug 2025 16:00:00 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Guide]]></category>
		<category><![CDATA[Laravel]]></category>
		<category><![CDATA[Laravel Development]]></category>
		<category><![CDATA[Laravel Payments]]></category>
		<category><![CDATA[Laravel Tips]]></category>
		<category><![CDATA[Laravel Tutorial]]></category>
		<category><![CDATA[PHP Stripe]]></category>
		<category><![CDATA[Stripe API]]></category>
		<category><![CDATA[Stripe Checkout]]></category>
		<guid isPermaLink="false">https://serveravatar.com/?p=27294</guid>

					<description><![CDATA[<p>Introduction Have you ever wondered why some websites make online payments feel as smooth as butter while others leave you frustrated and clicking away? The secret often lies in their payment gateway integration. If you’re a Laravel developer looking to Stripe integrate&#160;into your application, you’re in the right place! Think of Stripe as the Swiss [&#8230;]</p>
<p>The post <a href="https://serveravatar.com/quick-stripe-integration-guide-for-laravel-users/">Quick Stripe Integration Guide for Laravel Users</a> first appeared on <a href="https://serveravatar.com">ServerAvatar</a>.</p>]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-image size-large"><a href="https://serveravatar.com?ref=blog" target="_blank" rel=" noreferrer noopener"><img loading="lazy" decoding="async" width="1024" height="127" src="https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-1024x127.png" alt="Blog banner - ServerAvatar" class="wp-image-28182" srcset="https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-1024x127.png 1024w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-300x37.png 300w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-768x95.png 768w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-1536x190.png 1536w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-2048x253.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<h2 class="wp-block-heading" id="introduction">Introduction</h2>



<p>Have you ever wondered why some websites make online payments feel as smooth as butter while others leave you frustrated and clicking away? The secret often lies in their payment gateway integration. If you’re a Laravel developer looking to <strong>Stripe</strong> integrate&nbsp;into your application, you’re in the right place!</p>



<p>Think of Stripe as the Swiss Army knife of payment processing – it’s versatile, reliable, and packed with features that make handling online payments a breeze. When combined with Laravel’s elegant framework, you get a powerhouse combination that can handle everything from simple one-time payments to complex subscription billing.</p>



<h2 class="wp-block-heading" id="understanding-stripe-and-laravel-integration"><strong>Understanding Stripe and Laravel Integration</strong></h2>



<h3 class="wp-block-heading" id="what-makes-stripe-perfect-for-laravel"><strong>What Makes Stripe Perfect for Laravel?</strong></h3>



<p><strong>Stripe</strong>&nbsp;isn’t just another payment processor – it’s a complete payment infrastructure that speaks the same language as modern web developers. When you combine it with&nbsp;<strong>Laravel</strong>, you’re essentially pairing a Ferrari engine with a Formula 1 chassis.</p>



<p>Laravel’s built-in features like&nbsp;<strong>middleware</strong>,&nbsp;<strong>validation</strong>, and&nbsp;<strong>Eloquent ORM</strong>&nbsp;work seamlessly with Stripe’s API structure. The framework’s&nbsp;<strong>service container</strong>&nbsp;makes it easy to inject Stripe services wherever you need them, while Laravel’s&nbsp;<strong>event system</strong>&nbsp;perfectly complements Stripe’s webhook functionality.</p>



<h3 class="wp-block-heading" id="key-benefits-of-this-integration"><strong>Key Benefits of This Integration</strong></h3>



<p>The&nbsp;<strong>stripe laravel</strong>&nbsp;combination offers several advantages:</p>



<ul class="wp-block-list">
<li><strong>Rapid development</strong>&nbsp;with pre-built components</li>



<li><strong>Robust security</strong>&nbsp;through Laravel’s built-in protections</li>



<li><strong>Scalable architecture</strong>&nbsp;that grows with your business</li>



<li><strong>Comprehensive documentation</strong>&nbsp;and community support</li>
</ul>



<h2 class="wp-block-heading" id="prerequisites-and-setup-requirements"><strong>Prerequisites and Setup Requirements</strong></h2>



<h3 class="wp-block-heading" id="what-youll-need-before-starting"><strong>What You’ll Need Before Starting</strong></h3>



<p>Before diving into the integration, make sure you have these essentials ready:</p>



<p><strong>Technical Requirements:</strong></p>



<ul class="wp-block-list">
<li>PHP 8.0 or higher</li>



<li>Laravel 9.x or 10.x</li>



<li>Composer installed globally</li>



<li>A Stripe account (free to create)</li>



<li>Basic knowledge of Laravel routing and controllers</li>
</ul>



<p><strong>Stripe Account Setup:</strong></p>



<ol class="wp-block-list">
<li>Create your free Stripe account at&nbsp;<a href="https://stripe.com/">stripe.com</a></li>



<li>Verify your email address</li>



<li>Complete your business profile</li>



<li>Obtain your&nbsp;<strong>API keys</strong>&nbsp;from the dashboard</li>
</ol>



<h3 class="wp-block-heading" id="understanding-api-keys"><strong>Understanding API Keys</strong></h3>



<p>Stripe provides two types of API keys:</p>



<ul class="wp-block-list">
<li><strong>Publishable keys</strong>&nbsp;(safe for client-side code)</li>



<li><strong>Secret keys</strong>&nbsp;(must be kept server-side only)</li>
</ul>



<p>Think of these like a house key and a master key – the publishable key opens the front door, while the secret key gives you access to everything inside.</p>



<h2 class="wp-block-heading" id="installing-stripe-in-your-laravel-project"><strong>Installing Stripe in Your Laravel Project</strong></h2>



<h3 class="wp-block-heading" id="using-composer-for-installation"><strong>Using Composer for Installation</strong></h3>



<p>The easiest way to add Stripe to your Laravel project is through Composer:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>composer require stripe/stripe-php</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">composer</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">require</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">stripe/stripe-php</span></span></code></pre></div>



<h3 class="wp-block-heading" id="laravel-cashier-alternative"><strong>Laravel Cashier Alternative</strong></h3>



<p>For more advanced features, consider&nbsp;<strong>Laravel Cashier</strong>:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>composer require laravel/cashier</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">composer</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">require</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">laravel/cashier</span></span></code></pre></div>



<h3 class="wp-block-heading" id="advanced-laravel-features"><strong>Advanced Laravel Features</strong></h3>



<p>For more complex integrations, you might want to explore&nbsp;<strong>Laravel’s official documentation</strong>&nbsp;on payment processing patterns and best practices. The&nbsp;<a href="https://laravel.com/docs">Laravel Documentation</a>&nbsp;provides excellent guidance on structuring payment-related services and implementing proper error handling strategies.</p>



<p><strong>Laravel Cashier</strong>&nbsp;provides a more Laravel-centric approach to Stripe integration, offering:</p>



<ul class="wp-block-list">
<li>Built-in subscription management</li>



<li>Invoice handling</li>



<li>Webhook management</li>



<li>Customer portal integration</li>
</ul>



<h3 class="wp-block-heading" id="publishing-configuration-files"><strong>Publishing Configuration Files</strong></h3>



<p>If using Cashier, publish the migration files:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>php artisan vendor:publish --tag="cashier-migrations"
php artisan migrate</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">php</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">artisan</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">vendor:publish</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">--tag=</span><span style="color: #CE9178">&quot;cashier-migrations&quot;</span></span>
<span class="line"><span style="color: #DCDCAA">php</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">artisan</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">migrate</span></span></code></pre></div>



<h2 class="wp-block-heading" id="configuring-environment-variables"><strong>Configuring Environment Variables</strong></h2>



<h3 class="wp-block-heading" id="setting-up-your-.env-file"><strong>Setting Up Your .env File</strong></h3>



<p>Add your Stripe credentials to your&nbsp;<code>.env</code>&nbsp;file:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Plaintext</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>STRIPE_KEY=pk_test_your_publishable_key_here
STRIPE_SECRET=sk_test_your_secret_key_here
STRIPE_WEBHOOK_SECRET=whsec_your_webhook_secret_here</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">STRIPE_KEY=pk_test_your_publishable_key_here</span></span>
<span class="line"><span style="color: #D4D4D4">STRIPE_SECRET=sk_test_your_secret_key_here</span></span>
<span class="line"><span style="color: #D4D4D4">STRIPE_WEBHOOK_SECRET=whsec_your_webhook_secret_here</span></span></code></pre></div>



<h3 class="wp-block-heading" id="config-file-setup"><strong>Config File Setup</strong></h3>



<p>Create a dedicated config file for Stripe settings:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// config/stripe.php
return &#91;
    'key' => env('STRIPE_KEY'),
    'secret' => env('STRIPE_SECRET'),
    'webhook_secret' => env('STRIPE_WEBHOOK_SECRET'),
&#93;;</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// config/stripe.php</span></span>
<span class="line"><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&#39;key&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #DCDCAA">env</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;STRIPE_KEY&#39;</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&#39;secret&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #DCDCAA">env</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;STRIPE_SECRET&#39;</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&#39;webhook_secret&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #DCDCAA">env</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;STRIPE_WEBHOOK_SECRET&#39;</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">&#93;;</span></span></code></pre></div>



<p><strong>Pro Tip:</strong>&nbsp;Never commit your actual API keys to version control. Always use environment variables!</p>



<figure class="wp-block-image size-large"><a href="https://serveravatar.com?ref=blog" target="_blank" rel=" noreferrer noopener"><img loading="lazy" decoding="async" width="1024" height="127" src="https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-1024x127.png" alt="Blog banner - ServerAvatar" class="wp-image-28184" srcset="https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-1024x127.png 1024w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-300x37.png 300w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-768x95.png 768w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-1536x190.png 1536w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-2048x254.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<h2 class="wp-block-heading" id="creating-your-first-payment-form"><strong>Creating Your First Payment Form</strong></h2>



<h3 class="wp-block-heading" id="frontend-payment-form"><strong>Frontend Payment Form</strong></h3>



<p>Create a simple payment form using&nbsp;<strong>Stripe Elements</strong>:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">HTML</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;form id="payment-form">
    &lt;div id="payment-element">
        &lt;!-- Stripe Elements will create form elements here -->
    &lt;/div>
    &lt;button id="submit" type="submit">Pay Now&lt;/button>
&lt;/form></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #808080">&lt;</span><span style="color: #569CD6">form</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">id</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;payment-form&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">id</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;payment-element&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955">&lt;!-- Stripe Elements will create form elements here --&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">button</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">id</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;submit&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">type</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;submit&quot;</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">Pay Now</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">button</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #808080">&lt;/</span><span style="color: #569CD6">form</span><span style="color: #808080">&gt;</span></span></code></pre></div>



<h3 class="wp-block-heading" id="javascript-integration"><strong>JavaScript Integration</strong></h3>



<p>Initialize Stripe on the frontend:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">JavaScript</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>const stripe = Stripe('{{ config('stripe.key') }}');
const elements = stripe.elements();
const paymentElement = elements.create('payment');
paymentElement.mount('#payment-element');</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">stripe</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">Stripe</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;{{ config(&#39;</span><span style="color: #9CDCFE">stripe</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">key</span><span style="color: #CE9178">&#39;) }}&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">elements</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">stripe</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">elements</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4FC1FF">paymentElement</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">elements</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">create</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;payment&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #9CDCFE">paymentElement</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">mount</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;#payment-element&#39;</span><span style="color: #D4D4D4">);</span></span></code></pre></div>



<h3 class="wp-block-heading" id="handling-form-submission"><strong>Handling Form Submission</strong></h3>



<p>Process the form submission with client-side validation:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">JavaScript</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>document.getElementById('payment-form').addEventListener('submit', async (event) => {
    event.preventDefault();
    
    const {error} = await stripe.confirmPayment({
        elements,
        confirmParams: {
            return_url: '{{ route('payment.success') }}'
        }
    });
    
    if (error) {
        console.error('Payment failed:', error);
    }
});</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #9CDCFE">document</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">getElementById</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;payment-form&#39;</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">addEventListener</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;submit&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">event</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">=&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">event</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">preventDefault</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> {</span><span style="color: #4FC1FF">error</span><span style="color: #D4D4D4">} = </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">stripe</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">confirmPayment</span><span style="color: #D4D4D4">({</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">elements</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">confirmParams:</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">return_url:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;{{ route(&#39;</span><span style="color: #9CDCFE">payment</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">success</span><span style="color: #CE9178">&#39;) }}&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">    });</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">error</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">console</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">error</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Payment failed:&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">error</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">});</span></span></code></pre></div>



<h2 class="wp-block-heading" id="processing-payments-with-controllers"><strong>Processing Payments with Controllers</strong></h2>



<h3 class="wp-block-heading" id="creating-the-payment-controller"><strong>Creating the Payment Controller</strong></h3>



<p>Generate a controller to handle payment processing:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>php artisan make:controller PaymentController</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">php</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">artisan</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">make:controller</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">PaymentController</span></span></code></pre></div>



<h3 class="wp-block-heading" id="payment-processing-logic"><strong>Payment Processing Logic</strong></h3>



<p>Implement the core payment processing method:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Stripe\Stripe;
use Stripe\PaymentIntent;

class PaymentController extends Controller
{
    public function createPaymentIntent(Request $request)
    {
        Stripe::setApiKey(config('stripe.secret'));
        
        $paymentIntent = PaymentIntent::create([
            'amount' => $request->amount * 100, // Convert to cents
            'currency' => 'usd',
            'metadata' => &#91;
                'user_id' => auth()->id(),
                'order_id' => $request->order_id
            &#93;
        ]);
        
        return response()->json(&#91;
            'client_secret' => $paymentIntent->client_secret
        &#93;);
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">&lt;?php</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">namespace</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">App\Http\Controllers</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">use</span><span style="color: #D4D4D4"> Illuminate\Http\</span><span style="color: #4EC9B0">Request</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">use</span><span style="color: #D4D4D4"> Stripe\</span><span style="color: #4EC9B0">Stripe</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">use</span><span style="color: #D4D4D4"> Stripe\</span><span style="color: #4EC9B0">PaymentIntent</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">PaymentController</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">extends</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Controller</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">createPaymentIntent</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">Request</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #4EC9B0">Stripe</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">setApiKey</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">config</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;stripe.secret&#39;</span><span style="color: #D4D4D4">));</span></span>
<span class="line"><span style="color: #D4D4D4">        </span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$paymentIntent</span><span style="color: #D4D4D4"> = </span><span style="color: #4EC9B0">PaymentIntent</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">create</span><span style="color: #D4D4D4">([</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #CE9178">&#39;amount&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">amount</span><span style="color: #D4D4D4"> * </span><span style="color: #B5CEA8">100</span><span style="color: #D4D4D4">, </span><span style="color: #6A9955">// Convert to cents</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #CE9178">&#39;currency&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;usd&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #CE9178">&#39;metadata&#39;</span><span style="color: #D4D4D4"> =&gt; &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #CE9178">&#39;user_id&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #DCDCAA">auth</span><span style="color: #D4D4D4">()-&gt;</span><span style="color: #DCDCAA">id</span><span style="color: #D4D4D4">(),</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #CE9178">&#39;order_id&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">order_id</span></span>
<span class="line"><span style="color: #D4D4D4">            &#93;</span></span>
<span class="line"><span style="color: #D4D4D4">        ]);</span></span>
<span class="line"><span style="color: #D4D4D4">        </span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">response</span><span style="color: #D4D4D4">()-&gt;</span><span style="color: #DCDCAA">json</span><span style="color: #D4D4D4">(&#91;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #CE9178">&#39;client_secret&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #9CDCFE">$paymentIntent</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">client_secret</span></span>
<span class="line"><span style="color: #D4D4D4">        &#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h3 class="wp-block-heading" id="route-configuration"><strong>Route Configuration</strong></h3>



<p>Add routes for your payment endpoints:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Route::post('/create-payment-intent', &#91;PaymentController::class, 'createPaymentIntent'&#93;)
    ->middleware('auth');
Route::get('/payment/success', &#91;PaymentController::class, 'success'&#93;)
    ->name('payment.success');</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #4EC9B0">Route</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">post</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;/create-payment-intent&#39;</span><span style="color: #D4D4D4">, &#91;</span><span style="color: #4EC9B0">PaymentController</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">class</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;createPaymentIntent&#39;</span><span style="color: #D4D4D4">&#93;)</span></span>
<span class="line"><span style="color: #D4D4D4">    -&gt;</span><span style="color: #DCDCAA">middleware</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;auth&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #4EC9B0">Route</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">get</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;/payment/success&#39;</span><span style="color: #D4D4D4">, &#91;</span><span style="color: #4EC9B0">PaymentController</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">class</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;success&#39;</span><span style="color: #D4D4D4">&#93;)</span></span>
<span class="line"><span style="color: #D4D4D4">    -&gt;</span><span style="color: #DCDCAA">name</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;payment.success&#39;</span><span style="color: #D4D4D4">);</span></span></code></pre></div>



<h2 class="wp-block-heading" id="handling-payment-success-and-failures"><strong>Handling Payment Success and Failures</strong></h2>



<h3 class="wp-block-heading" id="success-page-implementation"><strong>Success Page Implementation</strong></h3>



<p>Create a dedicated success page for completed payments:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public function success(Request $request)
{
    $paymentIntentId = $request->get('payment_intent');
    
    if ($paymentIntentId) {
        // Retrieve payment details from Stripe
        Stripe::setApiKey(config('stripe.secret'));
        $paymentIntent = PaymentIntent::retrieve($paymentIntentId);
        
        // Update your database
        // Send confirmation email
        // Redirect to thank you page
        
        return view('payment.success', compact('paymentIntent'));
    }
    
    return redirect()->route('home')->with('error', 'Payment verification failed');
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">success</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">Request</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$paymentIntentId</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">get</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;payment_intent&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$paymentIntentId</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955">// Retrieve payment details from Stripe</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #4EC9B0">Stripe</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">setApiKey</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">config</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;stripe.secret&#39;</span><span style="color: #D4D4D4">));</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$paymentIntent</span><span style="color: #D4D4D4"> = </span><span style="color: #4EC9B0">PaymentIntent</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">retrieve</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$paymentIntentId</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        </span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955">// Update your database</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955">// Send confirmation email</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955">// Redirect to thank you page</span></span>
<span class="line"><span style="color: #D4D4D4">        </span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">view</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;payment.success&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #DCDCAA">compact</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;paymentIntent&#39;</span><span style="color: #D4D4D4">));</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">redirect</span><span style="color: #D4D4D4">()-&gt;</span><span style="color: #DCDCAA">route</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;home&#39;</span><span style="color: #D4D4D4">)-&gt;</span><span style="color: #DCDCAA">with</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;error&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;Payment verification failed&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h3 class="wp-block-heading" id="error-handling-best-practices"><strong>Error Handling Best Practices</strong></h3>



<p>Implement comprehensive error handling:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>try {
    $paymentIntent = PaymentIntent::create($paymentData);
} catch (\Stripe\Exception\CardException $e) {
    // Card was declined
    return back()->with('error', 'Your card was declined.');
} catch (\Stripe\Exception\InvalidRequestException $e) {
    // Invalid parameters
    return back()->with('error', 'Invalid payment request.');
} catch (\Exception $e) {
    // General error
    return back()->with('error', 'Something went wrong. Please try again.');
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">try</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$paymentIntent</span><span style="color: #D4D4D4"> = </span><span style="color: #4EC9B0">PaymentIntent</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">create</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$paymentData</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">} </span><span style="color: #C586C0">catch</span><span style="color: #D4D4D4"> (\Stripe\Exception\</span><span style="color: #4EC9B0">CardException</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$e</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">// Card was declined</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">back</span><span style="color: #D4D4D4">()-&gt;</span><span style="color: #DCDCAA">with</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;error&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;Your card was declined.&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">} </span><span style="color: #C586C0">catch</span><span style="color: #D4D4D4"> (\Stripe\Exception\</span><span style="color: #4EC9B0">InvalidRequestException</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$e</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">// Invalid parameters</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">back</span><span style="color: #D4D4D4">()-&gt;</span><span style="color: #DCDCAA">with</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;error&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;Invalid payment request.&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">} </span><span style="color: #C586C0">catch</span><span style="color: #D4D4D4"> (\</span><span style="color: #4EC9B0">Exception</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$e</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">// General error</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">back</span><span style="color: #D4D4D4">()-&gt;</span><span style="color: #DCDCAA">with</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;error&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;Something went wrong. Please try again.&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h2 class="wp-block-heading" id="implementing-stripe-webhooks"><strong>Implementing Stripe Webhooks</strong></h2>



<h3 class="wp-block-heading" id="why-webhooks-matter"><strong>Why Webhooks Matter</strong></h3>



<p>Webhooks are like having a direct phone line between Stripe and your application. Instead of constantly asking “Has anything happened?”, Stripe calls you immediately when events occur.</p>



<h3 class="wp-block-heading" id="setting-up-webhook-endpoints"><strong>Setting Up Webhook Endpoints</strong></h3>



<p>Create a webhook controller:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Stripe\Webhook;
use Stripe\Exception\SignatureVerificationException;

class WebhookController extends Controller
{
    public function handleWebhook(Request $request)
    {
        $payload = $request->getContent();
        $sigHeader = $request->header('Stripe-Signature');
        $endpointSecret = config('stripe.webhook_secret');
        
        try {
            $event = Webhook::constructEvent($payload, $sigHeader, $endpointSecret);
        } catch (SignatureVerificationException $e) {
            return response('Invalid signature', 400);
        }
        
        switch ($event->type) {
            case 'payment_intent.succeeded':
                $this->handlePaymentSucceeded($event->data->object);
                break;
            case 'payment_intent.payment_failed':
                $this->handlePaymentFailed($event->data->object);
                break;
            default:
                \Log::info('Unhandled webhook event: ' . $event->type);
        }
        
        return response('Webhook handled', 200);
    }
    
    private function handlePaymentSucceeded($paymentIntent)
    {
        // Update order status
        // Send confirmation email
        // Update customer records
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">&lt;?php</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">namespace</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">App\Http\Controllers</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">use</span><span style="color: #D4D4D4"> Illuminate\Http\</span><span style="color: #4EC9B0">Request</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">use</span><span style="color: #D4D4D4"> Stripe\</span><span style="color: #4EC9B0">Webhook</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">use</span><span style="color: #D4D4D4"> Stripe\Exception\</span><span style="color: #4EC9B0">SignatureVerificationException</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">WebhookController</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">extends</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Controller</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">handleWebhook</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">Request</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$payload</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">getContent</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$sigHeader</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">header</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Stripe-Signature&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$endpointSecret</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">config</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;stripe.webhook_secret&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        </span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">try</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">$event</span><span style="color: #D4D4D4"> = </span><span style="color: #4EC9B0">Webhook</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">constructEvent</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$payload</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">$sigHeader</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">$endpointSecret</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        } </span><span style="color: #C586C0">catch</span><span style="color: #D4D4D4"> (</span><span style="color: #4EC9B0">SignatureVerificationException</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$e</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">response</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Invalid signature&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">400</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">        </span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">switch</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$event</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">type</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">case</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;payment_intent.succeeded&#39;</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #569CD6">$this</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">handlePaymentSucceeded</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$event</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">object</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">break</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">case</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;payment_intent.payment_failed&#39;</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #569CD6">$this</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">handlePaymentFailed</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$event</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">object</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">break</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">default</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">                \</span><span style="color: #4EC9B0">Log</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">info</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Unhandled webhook event: &#39;</span><span style="color: #D4D4D4"> </span><span style="color: #D4D4D4">.</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$event</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">type</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">        </span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">response</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Webhook handled&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">200</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">handlePaymentSucceeded</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$paymentIntent</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955">// Update order status</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955">// Send confirmation email</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955">// Update customer records</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h3 class="wp-block-heading" id="webhook-route-configuration"><strong>Webhook Route Configuration</strong></h3>



<p>Add webhook routes with CSRF exemption:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// In routes/web.php
Route::post('/stripe/webhook', &#91;WebhookController::class, 'handleWebhook'&#93;)
    ->withoutMiddleware(&#91;\App\Http\Middleware\VerifyCsrfToken::class&#93;);</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// In routes/web.php</span></span>
<span class="line"><span style="color: #4EC9B0">Route</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">post</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;/stripe/webhook&#39;</span><span style="color: #D4D4D4">, &#91;</span><span style="color: #4EC9B0">WebhookController</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">class</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;handleWebhook&#39;</span><span style="color: #D4D4D4">&#93;)</span></span>
<span class="line"><span style="color: #D4D4D4">    -&gt;</span><span style="color: #DCDCAA">withoutMiddleware</span><span style="color: #D4D4D4">(&#91;\App\Http\Middleware\</span><span style="color: #4EC9B0">VerifyCsrfToken</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">class</span><span style="color: #D4D4D4">&#93;);</span></span></code></pre></div>



<h2 class="wp-block-heading" id="managing-customer-data"><strong>Managing Customer Data</strong></h2>



<h3 class="wp-block-heading" id="creating-stripe-customers"><strong>Creating Stripe Customers</strong></h3>



<p>Link your Laravel users with Stripe customers:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public function createStripeCustomer(User $user)
{
    Stripe::setApiKey(config('stripe.secret'));
    
    $customer = \Stripe\Customer::create([
        'email' => $user->email,
        'name' => $user->name,
        'metadata' => &#91;
            'user_id' => $user->id
        &#93;
    ]);
    
    $user->update(&#91;'stripe_customer_id' => $customer->id&#93;);
    
    return $customer;
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">createStripeCustomer</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">User</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4EC9B0">Stripe</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">setApiKey</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">config</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;stripe.secret&#39;</span><span style="color: #D4D4D4">));</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$customer</span><span style="color: #D4D4D4"> = \Stripe\</span><span style="color: #4EC9B0">Customer</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">create</span><span style="color: #D4D4D4">([</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;email&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">email</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;name&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">name</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;metadata&#39;</span><span style="color: #D4D4D4"> =&gt; &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #CE9178">&#39;user_id&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">id</span></span>
<span class="line"><span style="color: #D4D4D4">        &#93;</span></span>
<span class="line"><span style="color: #D4D4D4">    ]);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">update</span><span style="color: #D4D4D4">(&#91;</span><span style="color: #CE9178">&#39;stripe_customer_id&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #9CDCFE">$customer</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">id</span><span style="color: #D4D4D4">&#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$customer</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h3 class="wp-block-heading" id="storing-payment-methods"><strong>Storing Payment Methods</strong></h3>



<p>Save customer payment methods for future use:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public function savePaymentMethod(Request $request)
{
    $user = auth()->user();
    
    if (!$user->stripe_customer_id) {
        $this->createStripeCustomer($user);
    }
    
    $paymentMethod = \Stripe\PaymentMethod::retrieve($request->payment_method_id);
    $paymentMethod->attach(&#91;'customer' => $user->stripe_customer_id&#93;);
    
    return response()->json(&#91;'status' => 'success'&#93;);
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">savePaymentMethod</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">Request</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">auth</span><span style="color: #D4D4D4">()-&gt;</span><span style="color: #DCDCAA">user</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (!</span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">stripe_customer_id</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">$this</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">createStripeCustomer</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$paymentMethod</span><span style="color: #D4D4D4"> = \Stripe\</span><span style="color: #4EC9B0">PaymentMethod</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">retrieve</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">payment_method_id</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$paymentMethod</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">attach</span><span style="color: #D4D4D4">(&#91;</span><span style="color: #CE9178">&#39;customer&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">stripe_customer_id</span><span style="color: #D4D4D4">&#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">response</span><span style="color: #D4D4D4">()-&gt;</span><span style="color: #DCDCAA">json</span><span style="color: #D4D4D4">(&#91;</span><span style="color: #CE9178">&#39;status&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;success&#39;</span><span style="color: #D4D4D4">&#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h2 class="wp-block-heading" id="setting-up-subscription-billing"><strong>Setting Up Subscription Billing</strong></h2>



<h3 class="wp-block-heading" id="creating-subscription-plans"><strong>Creating Subscription Plans</strong></h3>



<p>Define subscription products and prices in your Stripe dashboard or programmatically:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public function createSubscriptionPlan($productName, $amount, $interval = 'month')
{
    Stripe::setApiKey(config('stripe.secret'));
    
    $product = \Stripe\Product::create(&#91;
        'name' => $productName,
    &#93;);
    
    $price = \Stripe\Price::create([
        'product' => $product->id,
        'unit_amount' => $amount * 100,
        'currency' => 'usd',
        'recurring' => &#91;'interval' => $interval&#93;,
    ]);
    
    return $price;
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">createSubscriptionPlan</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$productName</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">$amount</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">$interval</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&#39;month&#39;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4EC9B0">Stripe</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">setApiKey</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">config</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;stripe.secret&#39;</span><span style="color: #D4D4D4">));</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$product</span><span style="color: #D4D4D4"> = \Stripe\</span><span style="color: #4EC9B0">Product</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">create</span><span style="color: #D4D4D4">(&#91;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;name&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #9CDCFE">$productName</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    &#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$price</span><span style="color: #D4D4D4"> = \Stripe\</span><span style="color: #4EC9B0">Price</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">create</span><span style="color: #D4D4D4">([</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;product&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #9CDCFE">$product</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">id</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;unit_amount&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #9CDCFE">$amount</span><span style="color: #D4D4D4"> * </span><span style="color: #B5CEA8">100</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;currency&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;usd&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;recurring&#39;</span><span style="color: #D4D4D4"> =&gt; &#91;</span><span style="color: #CE9178">&#39;interval&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #9CDCFE">$interval</span><span style="color: #D4D4D4">&#93;,</span></span>
<span class="line"><span style="color: #D4D4D4">    ]);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$price</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h3 class="wp-block-heading" id="managing-subscriptions"><strong>Managing Subscriptions</strong></h3>



<p>Handle subscription creation and management:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public function createSubscription(Request $request)
{
    $user = auth()->user();
    
    $subscription = \Stripe\Subscription::create([
        'customer' => $user->stripe_customer_id,
        'items' => [&#91;
            'price' => $request->price_id,
        &#93;],
        'payment_behavior' => 'default_incomplete',
        'expand' => &#91;'latest_invoice.payment_intent'&#93;,
    ]);
    
    return response()->json(&#91;
        'subscription_id' => $subscription->id,
        'client_secret' => $subscription->latest_invoice->payment_intent->client_secret
    &#93;);
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">createSubscription</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">Request</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">auth</span><span style="color: #D4D4D4">()-&gt;</span><span style="color: #DCDCAA">user</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$subscription</span><span style="color: #D4D4D4"> = \Stripe\</span><span style="color: #4EC9B0">Subscription</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">create</span><span style="color: #D4D4D4">([</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;customer&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">stripe_customer_id</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;items&#39;</span><span style="color: #D4D4D4"> =&gt; [&#91;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #CE9178">&#39;price&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">price_id</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        &#93;],</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;payment_behavior&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;default_incomplete&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;expand&#39;</span><span style="color: #D4D4D4"> =&gt; &#91;</span><span style="color: #CE9178">&#39;latest_invoice.payment_intent&#39;</span><span style="color: #D4D4D4">&#93;,</span></span>
<span class="line"><span style="color: #D4D4D4">    ]);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">response</span><span style="color: #D4D4D4">()-&gt;</span><span style="color: #DCDCAA">json</span><span style="color: #D4D4D4">(&#91;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;subscription_id&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #9CDCFE">$subscription</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">id</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;client_secret&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #9CDCFE">$subscription</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">latest_invoice</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">payment_intent</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">client_secret</span></span>
<span class="line"><span style="color: #D4D4D4">    &#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h2 class="wp-block-heading" id="security-best-practices"><strong>Security Best Practices</strong></h2>



<h3 class="wp-block-heading" id="protecting-sensitive-data"><strong>Protecting Sensitive Data</strong></h3>



<p><strong>Never store sensitive payment information</strong>&nbsp;in your database:</p>



<ul class="wp-block-list">
<li>Card numbers</li>



<li>CVV codes</li>



<li>Expiration dates</li>
</ul>



<p>Instead, use Stripe’s&nbsp;<strong>tokenization system</strong>&nbsp;and store only:</p>



<ul class="wp-block-list">
<li>Customer IDs</li>



<li>Payment method IDs</li>



<li>Transaction references</li>
</ul>



<h3 class="wp-block-heading" id="implementing-request-validation"><strong>Implementing Request Validation</strong></h3>



<p>Always validate incoming requests:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public function createPaymentIntent(Request $request)
{
    $validated = $request->validate(&#91;
        'amount' => 'required|numeric|min:0.50',
        'currency' => 'required|string|in:usd,eur,gbp',
        'payment_method_id' => 'sometimes|string'
    &#93;);
    
    // Process payment...
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">createPaymentIntent</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">Request</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$validated</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">validate</span><span style="color: #D4D4D4">(&#91;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;amount&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;required|numeric|min:0.50&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;currency&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;required|string|in:usd,eur,gbp&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;payment_method_id&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;sometimes|string&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">    &#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">// Process payment...</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h3 class="wp-block-heading" id="rate-limiting"><strong>Rate Limiting</strong></h3>



<p>Protect your payment endpoints with rate limiting:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Route::middleware(&#91;'throttle:payment'&#93;)
    ->post('/create-payment-intent', &#91;PaymentController::class, 'createPaymentIntent'&#93;);</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #4EC9B0">Route</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">middleware</span><span style="color: #D4D4D4">(&#91;</span><span style="color: #CE9178">&#39;throttle:payment&#39;</span><span style="color: #D4D4D4">&#93;)</span></span>
<span class="line"><span style="color: #D4D4D4">    -&gt;</span><span style="color: #DCDCAA">post</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;/create-payment-intent&#39;</span><span style="color: #D4D4D4">, &#91;</span><span style="color: #4EC9B0">PaymentController</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">class</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;createPaymentIntent&#39;</span><span style="color: #D4D4D4">&#93;);</span></span></code></pre></div>



<h2 class="wp-block-heading" id="testing-your-integration"><strong>Testing Your Integration</strong></h2>



<h3 class="wp-block-heading" id="using-stripe-test-mode"><strong>Using Stripe Test Mode</strong></h3>



<p>Stripe provides test card numbers for different scenarios:</p>



<p><strong>Successful payments:</strong></p>



<ul class="wp-block-list">
<li><code>4242424242424242</code>&nbsp;(Visa)</li>



<li><code>5555555555554444</code>&nbsp;(Mastercard)</li>
</ul>



<p><strong>Failed payments:</strong></p>



<ul class="wp-block-list">
<li><code>4000000000000002</code>&nbsp;(Card declined)</li>



<li><code>4000000000009995</code>&nbsp;(Insufficient funds)</li>
</ul>



<h3 class="wp-block-heading" id="automated-testing"><strong>Automated Testing</strong></h3>



<p>Create tests for your payment functionality:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;?php

namespace Tests\Feature;

use Tests\TestCase;
use App\Models\User;

class PaymentTest extends TestCase
{
    public function test_payment_intent_creation()
    {
        $user = User::factory()->create();
        
        $response = $this->actingAs($user)->post('/create-payment-intent', &#91;
            'amount' => 10.00,
            'currency' => 'usd'
        &#93;);
        
        $response->assertStatus(200)
                ->assertJsonStructure(&#91;'client_secret'&#93;);
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">&lt;?php</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">namespace</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Tests\Feature</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">use</span><span style="color: #D4D4D4"> Tests\</span><span style="color: #4EC9B0">TestCase</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">use</span><span style="color: #D4D4D4"> App\Models\</span><span style="color: #4EC9B0">User</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">PaymentTest</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">extends</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TestCase</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">test_payment_intent_creation</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4"> = </span><span style="color: #4EC9B0">User</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">factory</span><span style="color: #D4D4D4">()-&gt;</span><span style="color: #DCDCAA">create</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">        </span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$response</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">$this</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">actingAs</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">)-&gt;</span><span style="color: #DCDCAA">post</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;/create-payment-intent&#39;</span><span style="color: #D4D4D4">, &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #CE9178">&#39;amount&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #B5CEA8">10.00</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #CE9178">&#39;currency&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;usd&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">        &#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">        </span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$response</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">assertStatus</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">200</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                -&gt;</span><span style="color: #DCDCAA">assertJsonStructure</span><span style="color: #D4D4D4">(&#91;</span><span style="color: #CE9178">&#39;client_secret&#39;</span><span style="color: #D4D4D4">&#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h2 class="wp-block-heading" id="common-troubleshooting-issues"><strong>Common Troubleshooting Issues</strong></h2>



<h3 class="wp-block-heading" id="cors-configuration-issues"><strong>CORS Configuration Issues</strong></h3>



<p>If you’re having CORS problems, add proper headers:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// In app/Http/Middleware/Cors.php
public function handle($request, Closure $next)
{
    return $next($request)
        ->header('Access-Control-Allow-Origin', '*')
        ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')
        ->header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// In app/Http/Middleware/Cors.php</span></span>
<span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">handle</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">, </span><span style="color: #4EC9B0">Closure</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$next</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$next</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        -&gt;</span><span style="color: #DCDCAA">header</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Access-Control-Allow-Origin&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;*&#39;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        -&gt;</span><span style="color: #DCDCAA">header</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Access-Control-Allow-Methods&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;GET, POST, PUT, DELETE, OPTIONS&#39;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        -&gt;</span><span style="color: #DCDCAA">header</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Access-Control-Allow-Headers&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;Content-Type, Authorization&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h3 class="wp-block-heading" id="ssl-certificate-requirements"><strong>SSL Certificate Requirements</strong></h3>



<p>Stripe requires HTTPS in production. Ensure your Laravel app uses SSL:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// In AppServiceProvider
public function boot()
{
    if (app()->environment('production')) {
        \URL::forceScheme('https');
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// In AppServiceProvider</span></span>
<span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">boot</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #DCDCAA">app</span><span style="color: #D4D4D4">()-&gt;</span><span style="color: #DCDCAA">environment</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;production&#39;</span><span style="color: #D4D4D4">)) {</span></span>
<span class="line"><span style="color: #D4D4D4">        \</span><span style="color: #4EC9B0">URL</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">forceScheme</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;https&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h3 class="wp-block-heading" id="debugging-webhook-issues"><strong>Debugging Webhook Issues</strong></h3>



<p>Log webhook events for debugging:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public function handleWebhook(Request $request)
{
    \Log::info('Webhook received', [
        'type' => $event->type ?? 'unknown',
        'id' => $event->id ?? 'unknown',
        'data' => $event->data ?? []
    ]);
    
    // Process webhook...
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">handleWebhook</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">Request</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    \</span><span style="color: #4EC9B0">Log</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">info</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Webhook received&#39;</span><span style="color: #D4D4D4">, [</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;type&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #9CDCFE">$event</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">type</span><span style="color: #D4D4D4"> ?? </span><span style="color: #CE9178">&#39;unknown&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;id&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #9CDCFE">$event</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">id</span><span style="color: #D4D4D4"> ?? </span><span style="color: #CE9178">&#39;unknown&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;data&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #9CDCFE">$event</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4"> ?? []</span></span>
<span class="line"><span style="color: #D4D4D4">    ]);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">// Process webhook...</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h2 class="wp-block-heading" id="performance-optimization-tips"><strong>Performance Optimization Tips</strong></h2>



<h3 class="wp-block-heading" id="database-indexing"><strong>Database Indexing</strong></h3>



<p>Add indexes to frequently queried payment-related fields:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// In your migration
$table->index('stripe_customer_id');
$table->index('stripe_subscription_id');
$table->index(&#91;'user_id', 'status'&#93;);</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// In your migration</span></span>
<span class="line"><span style="color: #9CDCFE">$table</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">index</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;stripe_customer_id&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #9CDCFE">$table</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">index</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;stripe_subscription_id&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #9CDCFE">$table</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">index</span><span style="color: #D4D4D4">(&#91;</span><span style="color: #CE9178">&#39;user_id&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;status&#39;</span><span style="color: #D4D4D4">&#93;);</span></span></code></pre></div>



<h3 class="wp-block-heading" id="caching-strategies"><strong>Caching Strategies</strong></h3>



<p>Cache customer data to reduce API calls:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public function getStripeCustomer(User $user)
{
    return Cache::remember("stripe_customer_{$user->id}", 3600, function () use ($user) {
        return \Stripe\Customer::retrieve($user->stripe_customer_id);
    });
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">getStripeCustomer</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">User</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Cache</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">remember</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;stripe_customer_{</span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">id</span><span style="color: #CE9178">}&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">3600</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> () </span><span style="color: #569CD6">use</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> \Stripe\</span><span style="color: #4EC9B0">Customer</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">retrieve</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$user</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">stripe_customer_id</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    });</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h3 class="wp-block-heading" id="queued-processing"><strong>Queued Processing</strong></h3>



<p>Use Laravel queues for webhook processing:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public function handleWebhook(Request $request)
{
    ProcessStripeWebhook::dispatch($request->all())->onQueue('webhooks');
    return response('Webhook queued', 200);
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">handleWebhook</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">Request</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4EC9B0">ProcessStripeWebhook</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">dispatch</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">all</span><span style="color: #D4D4D4">())-&gt;</span><span style="color: #DCDCAA">onQueue</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;webhooks&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">response</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;Webhook queued&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">200</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h2 class="wp-block-heading" id="going-live-with-your-payment-system"><strong>Going Live with Your Payment System</strong></h2>



<h3 class="wp-block-heading" id="pre-launch-checklist"><strong>Pre-Launch Checklist</strong></h3>



<p>Before switching to live mode:</p>



<p>✅&nbsp;<strong>Test all payment flows thoroughly</strong><br>✅&nbsp;<strong>Verify webhook endpoints are working</strong><br>✅&nbsp;<strong>Confirm SSL certificates are valid</strong><br>✅&nbsp;<strong>Review error handling and logging</strong><br>✅&nbsp;<strong>Set up monitoring and alerts</strong><br>✅&nbsp;<strong>Complete Stripe account verification</strong></p>



<h3 class="wp-block-heading" id="switching-to-live-mode"><strong>Switching to Live Mode</strong></h3>



<p>Update your environment variables:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Plaintext</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>STRIPE_KEY=pk_live_your_live_publishable_key
STRIPE_SECRET=sk_live_your_live_secret_key</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">STRIPE_KEY=pk_live_your_live_publishable_key</span></span>
<span class="line"><span style="color: #D4D4D4">STRIPE_SECRET=sk_live_your_live_secret_key</span></span></code></pre></div>



<h3 class="wp-block-heading" id="monitoring-and-maintenance"><strong>Monitoring and Maintenance</strong></h3>



<p>Set up monitoring for:</p>



<ul class="wp-block-list">
<li><strong>Payment success rates</strong></li>



<li><strong>Error frequencies</strong></li>



<li><strong>Response times</strong></li>



<li><strong>Webhook delivery failures</strong></li>
</ul>



<h2 class="wp-block-heading" id="conclusion">Conclusion</h2>



<p>Integrating&nbsp;<strong>Stripe with Laravel</strong>&nbsp;doesn’t have to be rocket science. With the right approach and understanding of both platforms, you can create a robust, secure payment system that serves your users well.</p>



<p>Remember, the key to successful&nbsp;<strong>stripe laravel</strong>&nbsp;integration lies in thorough testing, proper error handling, and following security best practices. Start with small, simple implementations and gradually add complexity as your understanding grows.</p>



<p>The combination of Stripe’s powerful payment infrastructure and Laravel’s elegant framework gives you everything you need to build world-class payment experiences. Whether you’re handling one-time payments or complex subscription billing, this integration will scale with your business needs.</p>



<h2 class="wp-block-heading" id="frequently-asked-questions">Frequently Asked Questions</h2>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question"><strong>How long does it typically take to integrate Stripe with Laravel?</strong></h3><div class="aioseo-faq-block-answer">
<p>A basic integration can be completed in a few hours, while a full-featured implementation with subscriptions and advanced features might take several days. The timeline depends on your requirements and Laravel experience level.</p>
</div></div>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question"><strong>Is it safe to store Stripe API keys in the .env file?</strong></h3><div class="aioseo-faq-block-answer">
<p>Yes, storing API keys in the .env file is the recommended approach for Laravel applications. Just ensure your .env file is never committed to version control and has proper file permissions (typically 600) on your server.</p>
</div></div>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question"><strong>Can I use Stripe with Laravel for international payments?</strong></h3><div class="aioseo-faq-block-answer">
<p>Absolutely! Stripe supports payments in 135+ currencies and is available in 40+ countries. You can configure multiple currencies and handle international transactions seamlessly within your Laravel application.</p>
</div></div>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question"><strong>What’s the difference between using raw Stripe PHP SDK versus Laravel Cashier?</strong></h3><div class="aioseo-faq-block-answer">
<p>The raw Stripe PHP SDK gives you complete control and flexibility, while Laravel Cashier provides a more Laravel-centric approach with built-in subscription management, invoicing, and customer portals. Choose Cashier if you need subscription billing features.</p>
</div></div>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question"><strong>How do I handle failed payments and retry logic in my Laravel Stripe integration?</strong></h3><div class="aioseo-faq-block-answer">
<p>You can handle failed payments through webhook events, implement automatic retry mechanisms using Laravel queues, and provide customers with options to update payment methods. Set up proper error logging and customer notifications for the best user experience.</p>
</div></div>



<div style="font-family: 'Public Sans', sans-serif; background: #fff; border: 1px solid #e1eaff; padding: 40px 35px; border-radius: 16px; margin: 60px 0; box-shadow: 0 10px 32px rgba(0, 0, 0, 0.05); max-width: 860px; margin-left: auto; margin-right: auto; text-align: center;">

  <h2 style="font-size: 28px; font-weight: 800; color: #0b2b53; margin-top: 0; margin-bottom: 16px;">
    Stop Wasting Time on Servers. Start Building Instead.
  </h2>

  <p style="font-size: 17px; color: #333; font-weight: 500; margin: 0 0 12px;">
    You didn’t start your project to babysit servers.
    Let <strong>ServerAvatar</strong> handle deployment, monitoring, and backups — so you can focus on growth.
  </p>

  <p style="font-size: 16px; color: #555; font-weight: 400; margin-bottom: 24px;">
    Deploy <strong>WordPress, Laravel, N8N</strong>, and more in minutes.
    No DevOps required. No command line. No stress.
  </p>

  <div style="display: inline-flex; justify-content: center; gap: 10px; flex-wrap: wrap; margin-bottom: 16px;">
    <a href="https://app.serveravatar.com" target="_blank" rel="noopener"
       style="background: linear-gradient(135deg, #007bff, #0056d2); color: #fff; text-decoration: none; padding: 10px 20px; font-size: 14px; font-weight: 600; border-radius: 8px; text-align: center;">
      🚀 Try Free
    </a>
    <a href="https://serveravatar.com/" target="_blank" rel="noopener"
       style="background: #f5f9ff; color: #0056d2; text-decoration: none; padding: 10px 20px; font-size: 14px; font-weight: 600; border-radius: 8px; border: 1px solid #d2e3ff; text-align: center;">
      🌐 Learn More
    </a>
  </div>

  <p style="font-size: 14px; color: #888; margin-top: 10px;">
    Trusted by 10,000+ developers and growing.
  </p>
</div><p>The post <a href="https://serveravatar.com/quick-stripe-integration-guide-for-laravel-users/">Quick Stripe Integration Guide for Laravel Users</a> first appeared on <a href="https://serveravatar.com">ServerAvatar</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to Use cURL Basic Auth in Laravel: Simple Guide for Developers</title>
		<link>https://serveravatar.com/curl-basic-auth-laravel-guide/</link>
		
		<dc:creator><![CDATA[Suresh Ramani]]></dc:creator>
		<pubDate>Fri, 08 Aug 2025 18:35:00 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Guide]]></category>
		<category><![CDATA[Laravel]]></category>
		<category><![CDATA[API Authentication]]></category>
		<category><![CDATA[cURL Basic Auth]]></category>
		<category><![CDATA[Laravel Authentication]]></category>
		<category><![CDATA[Laravel Guide]]></category>
		<category><![CDATA[Laravel Security]]></category>
		<category><![CDATA[Laravel Tips]]></category>
		<category><![CDATA[Laravel Tutorial]]></category>
		<category><![CDATA[PHP cURL]]></category>
		<category><![CDATA[PHP Security]]></category>
		<guid isPermaLink="false">https://serveravatar.com/?p=27254</guid>

					<description><![CDATA[<p>Introduction Ever wondered how websites make sure only trusted users can access sensitive information? Imagine handing a secret note to a friend, but first showing a badge only your circle has. In the world of web development,&#160;cURL Basic Auth&#160;is that badge &#8211; it proves who you are when your Laravel app “talks” to other services. [&#8230;]</p>
<p>The post <a href="https://serveravatar.com/curl-basic-auth-laravel-guide/">How to Use cURL Basic Auth in Laravel: Simple Guide for Developers</a> first appeared on <a href="https://serveravatar.com">ServerAvatar</a>.</p>]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-image size-large"><a href="https://serveravatar.com?ref=blog" target="_blank" rel=" noreferrer noopener"><img loading="lazy" decoding="async" width="1024" height="127" src="https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-1024x127.png" alt="Blog banner - ServerAvatar" class="wp-image-28182" srcset="https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-1024x127.png 1024w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-300x37.png 300w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-768x95.png 768w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-1536x190.png 1536w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-2048x253.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<h2 class="wp-block-heading" id="introduction"><strong>Introduction</strong></h2>



<p>Ever wondered how websites make sure only trusted users can access sensitive information? Imagine handing a secret note to a friend, but first showing a badge only your circle has. In the world of web development,&nbsp;<strong>cURL Basic Auth</strong>&nbsp;is that badge &#8211; it proves who you are when your Laravel app “talks” to other services. The good news? Setting up cURL Basic Auth with Laravel is simpler than you might think. Whether you’re new to web development or just want a refresher, let’s break down the process so it feels like passing notes in class: simple and secure.</p>



<h2 class="wp-block-heading" id="what-is-curl"><strong>What Is cURL?</strong></h2>



<p>Think of&nbsp;<strong>cURL</strong>&nbsp;as an internet messenger. Want your Laravel app to ask for data, like the weather, from another website? cURL sends that request and brings the response back. Even though cURL is a command-line tool, Laravel tucks it conveniently into your PHP code, so you can use it right in your code editor.</p>



<h2 class="wp-block-heading" id="why-use-basic-auth-with-curl"><strong>Why Use Basic Auth with cURL?</strong></h2>



<p>Ever visited a members-only club? You show your membership card before stepping in. Similarly, websites often hide their data behind &#8220;locked doors.&#8221;&nbsp;<strong>Basic Auth</strong>&nbsp;is the bouncer &#8211; it checks your credentials before letting you access protected information. When paired with&nbsp;<strong>cURL</strong>, you easily prove your identity to other services every time you knock on their door.</p>



<h2 class="wp-block-heading" id="understanding-basic-auth-in-simple-terms"><strong>Understanding Basic Auth in Simple Terms</strong></h2>



<p><strong>Basic Auth</strong>&nbsp;is just a way of saying, &#8220;I am who I say I am.&#8221; Every time your Laravel app makes a request, it includes a special header packed with your username and password, but encoded so the message isn’t in plain sight.</p>



<p><em>Analogy:</em><br>Picture a diary with a simple lock &#8211; if you know the combination, you can read or write in it.&nbsp;<strong>Basic Auth</strong>&nbsp;is that combination for web requests.</p>



<ul class="wp-block-list">
<li><em>Credentials (username:password)</em>&nbsp;are combined and Base64-encoded.</li>



<li>This combo is sent in the request headers.</li>



<li>The server decodes this to verify if you get access.</li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>For more on HTTP authentication basics, check out the&nbsp;<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication">MDN Web Docs on HTTP Authentication</a>.</p>
</blockquote>



<h2 class="wp-block-heading" id="setting-up-laravel-for-curl-requests"><strong>Setting Up Laravel for cURL Requests</strong></h2>



<p>Before you jump in, ensure your Laravel project and server environment support cURL.</p>



<ol class="wp-block-list">
<li><strong>Install Laravel</strong>&nbsp;(if you haven&#8217;t already):</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>composer create-project --prefer-dist laravel/laravel curlBasicAuthDemo</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">composer</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">create-project</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">--prefer-dist</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">laravel/laravel</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">curlBasicAuthDemo</span></span></code></pre></div>



<ol start="2" class="wp-block-list">
<li><strong>Check for cURL Extension:</strong></li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>php -m | grep curl</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">php</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-m</span><span style="color: #D4D4D4"> | </span><span style="color: #DCDCAA">grep</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">curl</span></span></code></pre></div>



<p>If the word &#8220;curl&#8221; appears, you&#8217;re ready to go!</p>



<p>Laravel 7.x and onward includes a built-in&nbsp;<strong>HTTP client</strong>&nbsp;that leverages cURL behind the scenes.</p>



<h2 class="wp-block-heading" id="making-your-first-curl-request-in-laravel"><strong>Making Your First cURL Request in Laravel</strong></h2>



<p>Laravel&#8217;s HTTP client makes working with cURL a breeze. Here&#8217;s a simple example:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>use Illuminate\Support\Facades\Http;

$response = Http::get('https://api.example.com/data');
$data = $response->json();</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">use</span><span style="color: #D4D4D4"> Illuminate\Support\Facades\</span><span style="color: #4EC9B0">Http</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #9CDCFE">$response</span><span style="color: #D4D4D4"> = </span><span style="color: #4EC9B0">Http</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">get</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;https://api.example.com/data&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #9CDCFE">$data</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">$response</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">json</span><span style="color: #D4D4D4">();</span></span></code></pre></div>



<p>You just fetched data from another website, no command line needed!</p>



<p><em>Want to learn more about HTTP client options? Visit the&nbsp;<a href="https://laravel.com/docs/10.x/http-client">Laravel HTTP Client documentation</a>.</em></p>



<h2 class="wp-block-heading" id="adding-basic-auth-to-your-curl-requests"><strong>Adding Basic Auth to Your cURL Requests</strong></h2>



<p>Here’s where the magic happens &#8211; <strong>add authentication with just one extra method</strong>:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>$response = Http::withBasicAuth('your_username', 'your_password')
               ->get('https://api.example.com/secure-data');</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #9CDCFE">$response</span><span style="color: #D4D4D4"> = </span><span style="color: #4EC9B0">Http</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">withBasicAuth</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;your_username&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;your_password&#39;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">               -&gt;</span><span style="color: #DCDCAA">get</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;https://api.example.com/secure-data&#39;</span><span style="color: #D4D4D4">);</span></span></code></pre></div>



<p>Laravel automatically adds your credentials in the right format, so the other server recognizes you right away.</p>



<h2 class="wp-block-heading" id="protecting-your-credentials-with-config"><strong>Protecting Your Credentials with Config</strong></h2>



<p>Never put your sensitive usernames and passwords directly into your code. It&#8217;s like leaving your house keys under the doormat. Instead, let’s follow the Laravel best practice and use configuration files:</p>



<h3 class="wp-block-heading" id="set-credentials-in-.env">1.&nbsp;<strong>Set Credentials in .env</strong></h3>



<p>Add these lines to your&nbsp;<code>.env</code>&nbsp;file:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Plaintext</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>BASIC_AUTH_USER=myUsername
BASIC_AUTH_PASS=myPassword</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">BASIC_AUTH_USER=myUsername</span></span>
<span class="line"><span style="color: #D4D4D4">BASIC_AUTH_PASS=myPassword</span></span></code></pre></div>



<h3 class="wp-block-heading" id="expose-them-in-a-config-file">2.&nbsp;<strong>Expose Them in a Config File</strong></h3>



<p>Edit&nbsp;<code>config/services.php</code>&nbsp;(or create a new file like&nbsp;<code>config/curl.php</code>&nbsp;for clarity):</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>// config/services.php

'curl_basic_auth' => &#91;
    'username' => env('BASIC_AUTH_USER'),
    'password' => env('BASIC_AUTH_PASS'),
&#93;,</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// config/services.php</span></span>
<span class="line"></span>
<span class="line"><span style="color: #CE9178">&#39;curl_basic_auth&#39;</span><span style="color: #D4D4D4"> =&gt; &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&#39;username&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #DCDCAA">env</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;BASIC_AUTH_USER&#39;</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&#39;password&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #DCDCAA">env</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;BASIC_AUTH_PASS&#39;</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">&#93;,</span></span></code></pre></div>



<h3 class="wp-block-heading" id="access-credentials-using-config">3.&nbsp;<strong>Access Credentials Using config()</strong></h3>



<p>Now, always reach for your credentials using the&nbsp;<code>config()</code>&nbsp;helper, which taps into Laravel&#8217;s configuration cache:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>$response = Http::withBasicAuth(
    config('services.curl_basic_auth.username'), 
    config('services.curl_basic_auth.password')
)->get('https://api.example.com/secure');</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #9CDCFE">$response</span><span style="color: #D4D4D4"> = </span><span style="color: #4EC9B0">Http</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">withBasicAuth</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">config</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;services.curl_basic_auth.username&#39;</span><span style="color: #D4D4D4">), </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">config</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;services.curl_basic_auth.password&#39;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">)-&gt;</span><span style="color: #DCDCAA">get</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;https://api.example.com/secure&#39;</span><span style="color: #D4D4D4">);</span></span></code></pre></div>



<p><strong>Key Point:</strong><br>By using&nbsp;<code>config()</code>, your app remains flexible, secure, and deployment-ready &#8211; even when environments change.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>For Laravel-specific deployment on servers, see:&nbsp;<a href="https://serveravatar.com/deployments/applications/laravel">Deploy Laravel on VM, VPS or Dedicated Server</a></p>
</blockquote>



<h2 class="wp-block-heading" id="practical-example-fetching-data-securely"><strong>Practical Example: Fetching Data Securely</strong></h2>



<p>Let&#8217;s put all these concepts into practice. Imagine fetching weather data from a protected API:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public function fetchWeather()
{
    $response = Http::withBasicAuth(
        config('services.curl_basic_auth.username'), 
        config('services.curl_basic_auth.password')
    )->get('https://weatherapi.com/secure-weather');

    if ($response->successful()) {
        return $response->json();
    } else {
        return response()->json(&#91;'error' => 'Unable to fetch weather data'&#93;, 401);
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">fetchWeather</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$response</span><span style="color: #D4D4D4"> = </span><span style="color: #4EC9B0">Http</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">withBasicAuth</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">config</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;services.curl_basic_auth.username&#39;</span><span style="color: #D4D4D4">), </span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">config</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;services.curl_basic_auth.password&#39;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    )-&gt;</span><span style="color: #DCDCAA">get</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;https://weatherapi.com/secure-weather&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$response</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">successful</span><span style="color: #D4D4D4">()) {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$response</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">json</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    } </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">response</span><span style="color: #D4D4D4">()-&gt;</span><span style="color: #DCDCAA">json</span><span style="color: #D4D4D4">(&#91;</span><span style="color: #CE9178">&#39;error&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;Unable to fetch weather data&#39;</span><span style="color: #D4D4D4">&#93;, </span><span style="color: #B5CEA8">401</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p>With a few lines of code, your Laravel app safely and reliably retrieves secured information!</p>



<h2 class="wp-block-heading" id="error-handling--debugging-tips"><strong>Error Handling &amp; Debugging Tips</strong></h2>



<p>Even well-crafted requests can hiccup. Want to catch issues before they grow? Here&#8217;s how:</p>



<ul class="wp-block-list">
<li><strong>Check for Success:</strong></li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>if ($response->successful()) {
    // Process the data
} else {
    // Handle the error gracefully
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$response</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">successful</span><span style="color: #D4D4D4">()) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">// Process the data</span></span>
<span class="line"><span style="color: #D4D4D4">} </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">// Handle the error gracefully</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<ul class="wp-block-list">
<li><strong>Log Problems for Troubleshooting:</strong></li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Log::error('API request failed', &#91;'response' => $response->body()&#93;);</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #4EC9B0">Log</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">error</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;API request failed&#39;</span><span style="color: #D4D4D4">, &#91;</span><span style="color: #CE9178">&#39;response&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #9CDCFE">$response</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">body</span><span style="color: #D4D4D4">()&#93;);</span></span></code></pre></div>



<ul class="wp-block-list">
<li><strong>Monitor HTTP Status Codes:</strong><br>Always be alert to responses like&nbsp;<code>401 Unauthorized</code>. It might mean your credentials are missing or incorrect.</li>
</ul>



<h2 class="wp-block-heading" id="when-should-you-use-basic-auth"><strong>When Should You Use Basic Auth?</strong></h2>



<ul class="wp-block-list">
<li><strong>Great for internal tools:</strong><br>If you need quick and easy security for your APIs used within a trusted team, Basic Auth is hard to beat.</li>



<li><strong>Testing and prototyping:</strong><br>Secure endpoints rapidly without building a full OAuth system.</li>



<li><strong>Short-term solutions:</strong><br>Useful for early development or limited-use projects.</li>
</ul>



<h2 class="wp-block-heading" id="alternatives-to-basic-auth"><strong>Alternatives to Basic Auth</strong></h2>



<p>Sometimes, you need a sturdier lock:</p>



<ul class="wp-block-list">
<li><strong>OAuth:</strong><br>More secure, often required for large or public applications &#8211; think of it as a bank vault. (<a href="https://oauth.net/2/">Read more about OAuth 2.0</a>)</li>



<li><strong>Token Auth:</strong><br>Each user gets a unique key known only to themselves and the server.</li>



<li><strong>API Keys:</strong><br>Unique, shareable keys that declare which app is talking to the server.</li>
</ul>



<p>Choose the method that fits your project&#8217;s size and security needs.</p>



<figure class="wp-block-image size-large"><a href="https://serveravatar.com?ref=blog" target="_blank" rel=" noreferrer noopener"><img loading="lazy" decoding="async" width="1024" height="127" src="https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-1024x127.png" alt="Blog banner - ServerAvatar" class="wp-image-28184" srcset="https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-1024x127.png 1024w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-300x37.png 300w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-768x95.png 768w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-1536x190.png 1536w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-2048x254.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<h2 class="wp-block-heading" id="testing-your-curl-basic-auth-requests"><strong>Testing Your cURL Basic Auth Requests</strong></h2>



<p>Don&#8217;t just assume it works &#8211; test it!</p>



<ul class="wp-block-list">
<li><strong>Postman:</strong><br>Use the Basic Auth setting, enter your credentials, and call the endpoint.</li>



<li><strong>Logs:</strong><br>Inspect Laravel logs for error messages after making requests.</li>



<li><strong>Automated Feature Tests:</strong><br>Write automated tests so you’re always sure your integration works.</li>
</ul>



<p>Testing means peace of mind before going live.</p>



<h2 class="wp-block-heading" id="real-world-scenarios"><strong>Real-World Scenarios</strong></h2>



<ul class="wp-block-list">
<li><strong>Business integrations:</strong><br>Many partner services use Basic Auth for fast, authenticated connections.</li>



<li><strong>Scheduled scripts:</strong><br>Automate repetitive data fetching or posting jobs, securely.</li>



<li><strong>Mobile or internal web apps:</strong><br>Securely connect backends without heavy authentication frameworks.</li>
</ul>



<h2 class="wp-block-heading" id="common-mistakes--how-to-fix-them"><strong>Common Mistakes &amp; How to Fix Them</strong></h2>



<ul class="wp-block-list">
<li><strong>Wrong credentials:</strong><br>Double-check your&nbsp;<code>.env</code>&nbsp;file and make sure your configuration is updated.</li>



<li><strong>Using HTTP (not HTTPS):</strong><br>Basic Auth credentials travel encoded, not encrypted &#8211; never send them over insecure channels.</li>



<li><strong>Ignoring errors:</strong><br>Always verify the API response and log or handle errors gracefully.</li>
</ul>



<p>A little diligence now saves big headaches later.</p>



<h2 class="wp-block-heading" id="conclusion"><strong>Conclusion</strong></h2>



<p>Learning to use&nbsp;<strong>cURL Basic Auth in Laravel</strong>&nbsp;is like mastering a simple lock for securing your digital conversations. Once you get the hang of it, you can confidently access protected data, automate tasks, and build safer integrations. Just remember to shield your credentials using Laravel’s config system and always test your code before releasing it into the wild. As your development skills grow, you’ll quickly know when to use this solution and when it’s time to upgrade to even tighter security.</p>



<h2 class="wp-block-heading" id="faqs"><strong>FAQs</strong></h2>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question"><strong>What is cURL Basic Auth and how does it work in Laravel?</strong></h3><div class="aioseo-faq-block-answer">
<p>cURL Basic Auth verifies your app&#8217;s identity to protected APIs by including your username and password in each HTTP request header, seamlessly managed in Laravel with&nbsp;<code>withBasicAuth</code>.</p>
</div></div>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question"><strong>How should I store and access credentials for Basic Auth in Laravel?</strong></h3><div class="aioseo-faq-block-answer">
<p>Store sensitive data in your&nbsp;<code>.env</code>&nbsp;file, expose them in config files like&nbsp;<code>config/services.php</code>, and access them using the&nbsp;<code>config()</code>&nbsp;helper for best security and flexibility.</p>
</div></div>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question"><strong>Is it safe to use Basic Auth for public APIs?</strong></h3><div class="aioseo-faq-block-answer">
<p>It&#8217;s best suited for internal or testing environments. For public-facing or sensitive projects, consider stronger authentication methods like OAuth or API tokens.</p>
</div></div>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question"><strong>How do I debug failed Basic Auth requests in Laravel?</strong></h3><div class="aioseo-faq-block-answer">
<p>Check for&nbsp;<code>401 Unauthorized</code>&nbsp;errors, verify your credentials, ensure you&#8217;re using HTTPS, and log errors for deeper inspection.</p>
</div></div>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question"><strong>Can I automate testing of Basic Auth-protected endpoints?</strong></h3><div class="aioseo-faq-block-answer">
<p>Yes! Use tools like Postman for manual tests and Laravel’s feature tests for automation. Regular testing ensures integrations stay secure and reliable after updates.</p>
</div></div>



<div style="font-family: 'Public Sans', sans-serif; background: #fff; border: 1px solid #e1eaff; padding: 40px 35px; border-radius: 16px; margin: 60px 0; box-shadow: 0 10px 32px rgba(0, 0, 0, 0.05); max-width: 860px; margin-left: auto; margin-right: auto; text-align: center;">

  <h2 style="font-size: 28px; font-weight: 800; color: #0b2b53; margin-top: 0; margin-bottom: 16px;">
    Stop Wasting Time on Servers. Start Building Instead.
  </h2>

  <p style="font-size: 17px; color: #333; font-weight: 500; margin: 0 0 12px;">
    You didn’t start your project to babysit servers.
    Let <strong>ServerAvatar</strong> handle deployment, monitoring, and backups — so you can focus on growth.
  </p>

  <p style="font-size: 16px; color: #555; font-weight: 400; margin-bottom: 24px;">
    Deploy <strong>WordPress, Laravel, N8N</strong>, and more in minutes.
    No DevOps required. No command line. No stress.
  </p>

  <div style="display: inline-flex; justify-content: center; gap: 10px; flex-wrap: wrap; margin-bottom: 16px;">
    <a href="https://app.serveravatar.com" target="_blank" rel="noopener"
       style="background: linear-gradient(135deg, #007bff, #0056d2); color: #fff; text-decoration: none; padding: 10px 20px; font-size: 14px; font-weight: 600; border-radius: 8px; text-align: center;">
      🚀 Try Free
    </a>
    <a href="https://serveravatar.com/" target="_blank" rel="noopener"
       style="background: #f5f9ff; color: #0056d2; text-decoration: none; padding: 10px 20px; font-size: 14px; font-weight: 600; border-radius: 8px; border: 1px solid #d2e3ff; text-align: center;">
      🌐 Learn More
    </a>
  </div>

  <p style="font-size: 14px; color: #888; margin-top: 10px;">
    Trusted by 10,000+ developers and growing.
  </p>
</div><p>The post <a href="https://serveravatar.com/curl-basic-auth-laravel-guide/">How to Use cURL Basic Auth in Laravel: Simple Guide for Developers</a> first appeared on <a href="https://serveravatar.com">ServerAvatar</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Laravel API Tutorial: Create RESTful APIs with Ease</title>
		<link>https://serveravatar.com/laravel-rest-api-tutorial/</link>
		
		<dc:creator><![CDATA[Meghna Meghwani]]></dc:creator>
		<pubDate>Fri, 25 Jul 2025 11:34:30 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Laravel]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[API Development]]></category>
		<category><![CDATA[Laravel API]]></category>
		<category><![CDATA[Laravel for Beginners]]></category>
		<category><![CDATA[Laravel Tutorial]]></category>
		<category><![CDATA[PHP API]]></category>
		<category><![CDATA[RESTful API]]></category>
		<guid isPermaLink="false">https://serveravatar.com/?p=26620</guid>

					<description><![CDATA[<p>Laravel API development has become essential with the growing popularity of mobile applications and JavaScript frameworks. Implementing a RESTful APIs is now the optimal solution for creating a unified interface between your data and client applications. PHP continues to be one of the most widely used web programming languages today due to its simplicity in [&#8230;]</p>
<p>The post <a href="https://serveravatar.com/laravel-rest-api-tutorial/">Laravel API Tutorial: Create RESTful APIs with Ease</a> first appeared on <a href="https://serveravatar.com">ServerAvatar</a>.</p>]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-image size-large"><a href="https://serveravatar.com?ref=blog" target="_blank" rel=" noreferrer noopener"><img loading="lazy" decoding="async" width="1024" height="127" src="https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-1024x127.png" alt="Blog banner - ServerAvatar" class="wp-image-28182" srcset="https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-1024x127.png 1024w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-300x37.png 300w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-768x95.png 768w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-1536x190.png 1536w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-3-2048x253.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p><strong>Laravel API</strong> development has become essential with the growing popularity of mobile applications and JavaScript frameworks. Implementing a RESTful APIs is now the optimal solution for creating a unified interface between your data and client applications.</p>



<p>PHP continues to be one of the most widely used web programming languages today due to its simplicity in maintenance and rapid development of feature-rich web applications. Dynamic, interactive, secure, and efficient websites require robust tools for creating and consuming APIs.</p>



<p>In this comprehensive tutorial, you will learn how to build a modern RESTful API using Laravel. Let&#8217;s explore building a PHP RESTful API with Laravel.</p>



<h2 class="wp-block-heading">Step 1: Prerequisites</h2>



<p>Let&#8217;s examine the technologies we&#8217;ll use to build our API:</p>



<ul class="wp-block-list">
<li>PHP 8.2 or higher</li>



<li>Laravel 12 Framework</li>



<li>MySQL Database</li>



<li>Composer (Dependency Manager)</li>



<li>Basic understanding of PHP and HTTP methods</li>
</ul>



<p><a href="https://serveravatar.com/" target="_blank" rel="noreferrer noopener">ServerAvatar</a>&nbsp;takes care of the entire setup process for you, so there&#8217;s no need to install or configure these technologies manually. With ServerAvatar, you can easily deploy a server that&#8217;s ready with basic setup.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="719" height="359" src="https://serveravatar.com/wp-content/uploads/2025/07/image-120.png" alt="Laravel API" class="wp-image-26621" srcset="https://serveravatar.com/wp-content/uploads/2025/07/image-120.png 719w, https://serveravatar.com/wp-content/uploads/2025/07/image-120-300x150.png 300w" sizes="auto, (max-width: 719px) 100vw, 719px" /></figure>



<h2 class="wp-block-heading">Step 2: Understanding Application</h2>



<p>We will build a complete CRUD API. CRUD stands for Create, Read, Update, and Delete. Our API will include the following endpoints:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th><strong>Method</strong></th><th><strong>URI</strong></th><th><strong>Name</strong></th><th><strong>Description</strong></th></tr></thead><tbody><tr><td>GET</td><td>api/posts</td><td>Index</td><td>Retrieve all posts</td></tr><tr><td>GET</td><td>api/posts/{id}</td><td>Show</td><td>Get details of a specific post by ID</td></tr><tr><td>POST</td><td>api/posts</td><td>Store</td><td>Create a new post</td></tr><tr><td>PUT</td><td>api/posts/{id}</td><td>Update</td><td>Update a specific post by ID</td></tr><tr><td>DELETE</td><td>api/posts/{id}</td><td>Destroy</td><td>Delete a specific post by ID</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">Step 3: Setup New Laravel App</h2>



<p>To begin, create a new Laravel application. Execute the following command in your terminal:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>composer create-project laravel/laravel blog-api</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">composer</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">create-project</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">laravel/laravel</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">blog-api</span></span></code></pre></div>



<p>Alternatively, if you have installed the<a href="https://laravel.com/" target="_blank" rel="noopener nofollow" title=" Laravel"> Laravel</a> Installer as a global composer dependency:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>laravel new blog-api</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">laravel</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">new</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">blog-api</span></span></code></pre></div>



<p>Next, start the Laravel development server if it&#8217;s not already running:</p>



<h2 class="wp-block-heading">Step 4: Create MySQL Database</h2>



<p>Create a new database for your application. Login to MySQL and execute the following command:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>mysql -u&lt;username> -p&lt;password></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">mysql</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-u</span><span style="color: #D4D4D4">&lt;</span><span style="color: #569CD6">username</span><span style="color: #D4D4D4">&gt;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-p</span><span style="color: #D4D4D4">&lt;</span><span style="color: #569CD6">password</span><span style="color: #D4D4D4">&gt;</span></span></code></pre></div>



<p>To create a new database, run the following command:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>CREATE DATABASE 'laravel_api';</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">CREATE</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">DATABASE</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;laravel_api&#39;</span><span style="color: #D4D4D4">;</span></span></code></pre></div>



<h2 class="wp-block-heading">Step 5: Create Model and Migration</h2>



<p>We can create a Model along with migration by running the following command:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>php artisan make:model Post -m</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">php artisan make:model Post -m</span></span></code></pre></div>



<p>The<strong>&nbsp;-m argument</strong>&nbsp;will create a Migration in a single command.</p>



<p>A new file named &#8220;Post.php&#8221; will be created in the app/Models directory.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    protected $table = 'posts';
    
    protected $fillable = &#91;
        'name',
        'image',
        'description'
    &#93;;
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">&lt;?php</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">namespace</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">App\Models</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">use</span><span style="color: #D4D4D4"> Illuminate\Database\Eloquent\</span><span style="color: #4EC9B0">Model</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Post</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">extends</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Model</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">protected</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$table</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&#39;posts&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">protected</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$fillable</span><span style="color: #D4D4D4"> = &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;name&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;image&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;description&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">    &#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p>A migration file will be created in the database/migrations directory to generate the table in our database. Modify the migration file to create columns for name, description, and image &#8211; all fields that accept string values.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreatePostsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('image');
            $table->text('description');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('posts');
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">&lt;?php</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">use</span><span style="color: #D4D4D4"> Illuminate\Database\Migrations\</span><span style="color: #4EC9B0">Migration</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">use</span><span style="color: #D4D4D4"> Illuminate\Database\Schema\</span><span style="color: #4EC9B0">Blueprint</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">use</span><span style="color: #D4D4D4"> Illuminate\Support\Facades\</span><span style="color: #4EC9B0">Schema</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CreatePostsTable</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">extends</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Migration</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">/**</span></span>
<span class="line"><span style="color: #6A9955">     * Run the migrations.</span></span>
<span class="line"><span style="color: #6A9955">     *</span></span>
<span class="line"><span style="color: #6A9955">     * </span><span style="color: #569CD6">@return</span><span style="color: #6A9955"> </span><span style="color: #569CD6">void</span></span>
<span class="line"><span style="color: #6A9955">     */</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">up</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #4EC9B0">Schema</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">create</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;posts&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> (</span><span style="color: #4EC9B0">Blueprint</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$table</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">$table</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">id</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">$table</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">string</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;name&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">$table</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">string</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;image&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">$table</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">text</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;description&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">$table</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">timestamps</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">        });</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">/**</span></span>
<span class="line"><span style="color: #6A9955">     * Reverse the migrations.</span></span>
<span class="line"><span style="color: #6A9955">     *</span></span>
<span class="line"><span style="color: #6A9955">     * </span><span style="color: #569CD6">@return</span><span style="color: #6A9955"> </span><span style="color: #569CD6">void</span></span>
<span class="line"><span style="color: #6A9955">     */</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">down</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #4EC9B0">Schema</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">dropIfExists</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;posts&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p>Open the .env file and update the credentials to access your MySQL database:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_api
DB_USERNAME=your_username
DB_PASSWORD=your_password</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #9CDCFE">DB_CONNECTION</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">mysql</span></span>
<span class="line"><span style="color: #9CDCFE">DB_HOST</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">127.0</span><span style="color: #CE9178">.0.1</span></span>
<span class="line"><span style="color: #9CDCFE">DB_PORT</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">3306</span></span>
<span class="line"><span style="color: #9CDCFE">DB_DATABASE</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">laravel_api</span></span>
<span class="line"><span style="color: #9CDCFE">DB_USERNAME</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">your_username</span></span>
<span class="line"><span style="color: #9CDCFE">DB_PASSWORD</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">your_password</span></span></code></pre></div>



<p>Next, run your migration using the following command:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>php artisan migrate</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">php</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">artisan</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">migrate</span></span></code></pre></div>



<h2 class="wp-block-heading">Step 6: Create Controller and Request</h2>



<p>Create a resource Controller by running the following command:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>php artisan make:controller PostController -r</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">php</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">artisan</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">make:controller</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">PostController</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-r</span></span></code></pre></div>



<p>Resource controllers make it effortless to build RESTful controllers around resources.</p>



<p>Next, create a Request file by running the following command:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>php artisan make:request PostStoreRequest</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">php</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">artisan</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">make:request</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">PostStoreRequest</span></span></code></pre></div>



<p>As you may already know, there are multiple ways to validate requests in Laravel. Handling request validation is a crucial part of any application. Laravel provides excellent features for handling this efficiently.</p>



<h2 class="wp-block-heading">HTTP Status Codes</h2>



<p>We&#8217;ve incorporated the response()-&gt;json() method in our endpoints. This allows us to explicitly return JSON data and send HTTP status codes that the client can interpret. The most common codes you&#8217;ll be returning are:</p>



<ul class="wp-block-list">
<li><strong>200</strong>: OK. The standard success code and default option.</li>



<li><strong>201</strong>: Created. Object created successfully. Useful for store actions.</li>



<li><strong>204</strong>: No Content. When the action was executed successfully, but there is no content to return.</li>



<li><strong>206</strong>: Partial Content. Useful when returning a paginated list of resources.</li>



<li><strong>400</strong>: Bad Request. The standard option for requests that fail validation.</li>



<li><strong>401</strong>: Unauthorized. The user needs to be authenticated.</li>



<li><strong>403</strong>: Forbidden. The user is authenticated but lacks permissions to perform an action.</li>



<li><strong>404</strong>: Not Found. Laravel will return this automatically when the resource is not found.</li>



<li><strong>500</strong>: Internal Server Error. Ideally, you won&#8217;t be explicitly returning this, but if something unexpected occurs, this is what your user will receive.</li>



<li><strong>503</strong>: Service Unavailable. Self-explanatory, but another code that won&#8217;t be returned explicitly by the application.</li>
</ul>



<figure class="wp-block-image size-large"><a href="https://serveravatar.com?ref=blog" target="_blank" rel=" noreferrer noopener"><img loading="lazy" decoding="async" width="1024" height="127" src="https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-1024x127.png" alt="Blog banner - ServerAvatar" class="wp-image-28184" srcset="https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-1024x127.png 1024w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-300x37.png 300w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-768x95.png 768w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-1536x190.png 1536w, https://serveravatar.com/wp-content/uploads/2025/09/728_90-Banner-1-2048x254.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<h2 class="wp-block-heading">Step 7: Setup CRUD (Create, Read, Update and Delete)</h2>



<p><strong>1. Setup Routes</strong></p>



<p><strong>Note</strong>: All API requests will need the header Accept: application/json.</p>



<p>Add the routes to the API routes file to access all the functions we created.</p>



<p>Open &#8220;routes/api.php&#8221; and update it with the following code:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Route::get('posts', "PostController@index"); // List Posts
Route::post('posts', "PostController@store"); // Create Post
Route::get('posts/{id}', "PostController@show"); // Detail of Post
Route::put('posts/{id}', "PostController@update"); // Update Post
Route::delete('posts/{id}', "PostController@destroy"); // Delete Post</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">Route::get(</span><span style="color: #DCDCAA">&#39;posts&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;PostController@index&quot;</span><span style="color: #D4D4D4">); </span><span style="color: #DCDCAA">//</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">List</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">Posts</span></span>
<span class="line"><span style="color: #DCDCAA">Route::post(</span><span style="color: #DCDCAA">&#39;posts&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;PostController@store&quot;</span><span style="color: #D4D4D4">); </span><span style="color: #DCDCAA">//</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">Create</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">Post</span></span>
<span class="line"><span style="color: #DCDCAA">Route::get(</span><span style="color: #DCDCAA">&#39;posts/{id}&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;PostController@show&quot;</span><span style="color: #D4D4D4">); </span><span style="color: #DCDCAA">//</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">Detail</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">of</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">Post</span></span>
<span class="line"><span style="color: #DCDCAA">Route::put(</span><span style="color: #DCDCAA">&#39;posts/{id}&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;PostController@update&quot;</span><span style="color: #D4D4D4">); </span><span style="color: #DCDCAA">//</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">Update</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">Post</span></span>
<span class="line"><span style="color: #DCDCAA">Route::delete(</span><span style="color: #DCDCAA">&#39;posts/{id}&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;PostController@destroy&quot;</span><span style="color: #D4D4D4">); </span><span style="color: #DCDCAA">//</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">Delete</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">Post</span></span></code></pre></div>



<p>Or you can add a resource route like this:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Route::resource('posts', 'PostController');</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">Route::resource(</span><span style="color: #DCDCAA">&#39;posts&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;PostController&#39;</span><span style="color: #D4D4D4">);</span></span></code></pre></div>



<p>Now, open &#8220;app/Http/Controllers/PostController.php&#8221; and update it with the following code:</p>



<p><strong>2. Read All Posts</strong></p>



<p>To get the list of all posts, update the following code:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>/**
 * Display a listing of the resource.
 *
 * @return \Illuminate\Http\Response
 */
public function index()
{
    // All Posts
    $posts = Post::all();
    
    // Return Json Response
    return response()->json(&#91;
        'posts' => $posts
    &#93;, 200);
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">/**</span></span>
<span class="line"><span style="color: #6A9955"> * Display a listing of the resource.</span></span>
<span class="line"><span style="color: #6A9955"> *</span></span>
<span class="line"><span style="color: #6A9955"> * </span><span style="color: #569CD6">@return</span><span style="color: #6A9955"> \Illuminate\Http\</span><span style="color: #4EC9B0">Response</span></span>
<span class="line"><span style="color: #6A9955"> */</span></span>
<span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">index</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">// All Posts</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$posts</span><span style="color: #D4D4D4"> = </span><span style="color: #4EC9B0">Post</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">all</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">// Return Json Response</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">response</span><span style="color: #D4D4D4">()-&gt;</span><span style="color: #DCDCAA">json</span><span style="color: #D4D4D4">(&#91;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;posts&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #9CDCFE">$posts</span></span>
<span class="line"><span style="color: #D4D4D4">    &#93;, </span><span style="color: #B5CEA8">200</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p>Get the details of a post by ID. Update the following code:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>/**
 * Display the specified resource.
 *
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function show($id)
{
    // Post Detail  
    $post = Post::find($id);
    
    if (!$post) {
        return response()->json(&#91;
            'message' => 'Post Not Found.'
        &#93;, 404);
    }
    
    // Return Json Response
    return response()->json(&#91;
        'post' => $post
    &#93;, 200);
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">/**</span></span>
<span class="line"><span style="color: #6A9955"> * Display the specified resource.</span></span>
<span class="line"><span style="color: #6A9955"> *</span></span>
<span class="line"><span style="color: #6A9955"> * </span><span style="color: #569CD6">@param</span><span style="color: #6A9955">  </span><span style="color: #569CD6">int</span><span style="color: #6A9955">  $id</span></span>
<span class="line"><span style="color: #6A9955"> * </span><span style="color: #569CD6">@return</span><span style="color: #6A9955"> \Illuminate\Http\</span><span style="color: #4EC9B0">Response</span></span>
<span class="line"><span style="color: #6A9955"> */</span></span>
<span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">show</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$id</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">// Post Detail  </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$post</span><span style="color: #D4D4D4"> = </span><span style="color: #4EC9B0">Post</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">find</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$id</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (!</span><span style="color: #9CDCFE">$post</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">response</span><span style="color: #D4D4D4">()-&gt;</span><span style="color: #DCDCAA">json</span><span style="color: #D4D4D4">(&#91;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #CE9178">&#39;message&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;Post Not Found.&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">        &#93;, </span><span style="color: #B5CEA8">404</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">// Return Json Response</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">response</span><span style="color: #D4D4D4">()-&gt;</span><span style="color: #DCDCAA">json</span><span style="color: #D4D4D4">(&#91;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;post&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #9CDCFE">$post</span></span>
<span class="line"><span style="color: #D4D4D4">    &#93;, </span><span style="color: #B5CEA8">200</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p><strong>3. Create Post<br></strong>Now, open &#8220;app/Http/Requests/PostStoreRequest.php&#8221; and update it with the following code:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&lt;?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class PostStoreRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        if (request()->isMethod('post')) {
            return &#91;
                'name' => 'required|string|max:258',
                'image' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
                'description' => 'required|string'
            &#93;;
        } else {
            return &#91;
                'name' => 'required|string|max:258',
                'image' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
                'description' => 'required|string'
            &#93;;
        }
    }

    /**
     * Custom message for validation
     *
     * @return array
     */
    public function messages()
    {
        if (request()->isMethod('post')) {
            return &#91;
                'name.required' => 'Name is required!',
                'image.required' => 'Image is required!',
                'description.required' => 'Description is required!'
            &#93;;
        } else {
            return &#91;
                'name.required' => 'Name is required!',
                'description.required' => 'Description is required!'
            &#93;;
        }
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">&lt;?php</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">namespace</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">App\Http\Requests</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">use</span><span style="color: #D4D4D4"> Illuminate\Foundation\Http\</span><span style="color: #4EC9B0">FormRequest</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">PostStoreRequest</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">extends</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">FormRequest</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">/**</span></span>
<span class="line"><span style="color: #6A9955">     * Determine if the user is authorized to make this request.</span></span>
<span class="line"><span style="color: #6A9955">     *</span></span>
<span class="line"><span style="color: #6A9955">     * </span><span style="color: #569CD6">@return</span><span style="color: #6A9955"> </span><span style="color: #569CD6">bool</span></span>
<span class="line"><span style="color: #6A9955">     */</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">authorize</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">/**</span></span>
<span class="line"><span style="color: #6A9955">     * Get the validation rules that apply to the request.</span></span>
<span class="line"><span style="color: #6A9955">     *</span></span>
<span class="line"><span style="color: #6A9955">     * </span><span style="color: #569CD6">@return</span><span style="color: #6A9955"> </span><span style="color: #569CD6">array</span></span>
<span class="line"><span style="color: #6A9955">     */</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">rules</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #DCDCAA">request</span><span style="color: #D4D4D4">()-&gt;</span><span style="color: #DCDCAA">isMethod</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;post&#39;</span><span style="color: #D4D4D4">)) {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #CE9178">&#39;name&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;required|string|max:258&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #CE9178">&#39;image&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;required|image|mimes:jpeg,png,jpg,gif,svg|max:2048&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #CE9178">&#39;description&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;required|string&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">            &#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">        } </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #CE9178">&#39;name&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;required|string|max:258&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #CE9178">&#39;image&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;nullable|image|mimes:jpeg,png,jpg,gif,svg|max:2048&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #CE9178">&#39;description&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;required|string&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">            &#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">/**</span></span>
<span class="line"><span style="color: #6A9955">     * Custom message for validation</span></span>
<span class="line"><span style="color: #6A9955">     *</span></span>
<span class="line"><span style="color: #6A9955">     * </span><span style="color: #569CD6">@return</span><span style="color: #6A9955"> </span><span style="color: #569CD6">array</span></span>
<span class="line"><span style="color: #6A9955">     */</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">messages</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #DCDCAA">request</span><span style="color: #D4D4D4">()-&gt;</span><span style="color: #DCDCAA">isMethod</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;post&#39;</span><span style="color: #D4D4D4">)) {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #CE9178">&#39;name.required&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;Name is required!&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #CE9178">&#39;image.required&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;Image is required!&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #CE9178">&#39;description.required&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;Description is required!&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">            &#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">        } </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #CE9178">&#39;name.required&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;Name is required!&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #CE9178">&#39;description.required&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;Description is required!&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">            &#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p>Now, open &#8220;app/Http/Controllers/PostController.php&#8221; and update it with the following code:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>/**
 * Store a newly created resource in storage.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
public function store(PostStoreRequest $request)
{
    try {
        $imageName = Str::random(32) . "." . $request->image->getClientOriginalExtension();
        
        // Create Post
        Post::create(&#91;
            'name' => $request->name,
            'image' => $imageName,
            'description' => $request->description
        &#93;);
        
        // Save Image in Storage folder
        Storage::disk('public')->put($imageName, file_get_contents($request->image));
        
        // Return Json Response
        return response()->json(&#91;
            'message' => "Post successfully created."
        &#93;, 200);
    } catch (\Exception $e) {
        // Return Json Response
        return response()->json(&#91;
            'message' => "Something went really wrong!"
        &#93;, 500);
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">/**</span></span>
<span class="line"><span style="color: #6A9955"> * Store a newly created resource in storage.</span></span>
<span class="line"><span style="color: #6A9955"> *</span></span>
<span class="line"><span style="color: #6A9955"> * </span><span style="color: #569CD6">@param</span><span style="color: #6A9955">  \Illuminate\Http\</span><span style="color: #4EC9B0">Request</span><span style="color: #6A9955">  $request</span></span>
<span class="line"><span style="color: #6A9955"> * </span><span style="color: #569CD6">@return</span><span style="color: #6A9955"> \Illuminate\Http\</span><span style="color: #4EC9B0">Response</span></span>
<span class="line"><span style="color: #6A9955"> */</span></span>
<span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">store</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">PostStoreRequest</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">try</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$imageName</span><span style="color: #D4D4D4"> = </span><span style="color: #4EC9B0">Str</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">random</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">32</span><span style="color: #D4D4D4">) </span><span style="color: #D4D4D4">.</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;.&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #D4D4D4">.</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">image</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">getClientOriginalExtension</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">        </span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955">// Create Post</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #4EC9B0">Post</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">create</span><span style="color: #D4D4D4">(&#91;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #CE9178">&#39;name&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">name</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #CE9178">&#39;image&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #9CDCFE">$imageName</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #CE9178">&#39;description&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">description</span></span>
<span class="line"><span style="color: #D4D4D4">        &#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">        </span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955">// Save Image in Storage folder</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #4EC9B0">Storage</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">disk</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;public&#39;</span><span style="color: #D4D4D4">)-&gt;</span><span style="color: #DCDCAA">put</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$imageName</span><span style="color: #D4D4D4">, </span><span style="color: #DCDCAA">file_get_contents</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">image</span><span style="color: #D4D4D4">));</span></span>
<span class="line"><span style="color: #D4D4D4">        </span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955">// Return Json Response</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">response</span><span style="color: #D4D4D4">()-&gt;</span><span style="color: #DCDCAA">json</span><span style="color: #D4D4D4">(&#91;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #CE9178">&#39;message&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&quot;Post successfully created.&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        &#93;, </span><span style="color: #B5CEA8">200</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    } </span><span style="color: #C586C0">catch</span><span style="color: #D4D4D4"> (\</span><span style="color: #4EC9B0">Exception</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$e</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955">// Return Json Response</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">response</span><span style="color: #D4D4D4">()-&gt;</span><span style="color: #DCDCAA">json</span><span style="color: #D4D4D4">(&#91;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #CE9178">&#39;message&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&quot;Something went really wrong!&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        &#93;, </span><span style="color: #B5CEA8">500</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p><strong>4. Update Post</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>/**
 * Update the specified resource in storage.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function update(PostStoreRequest $request, $id)
{
    try {
        // Find Post
        $post = Post::find($id);
        
        if (!$post) {
            return response()->json(&#91;
                'message' => 'Post Not Found.'
            &#93;, 404);
        }

        $post->name = $request->name;
        $post->description = $request->description;

        if ($request->image) {
            // Public storage
            $storage = Storage::disk('public');
            
            // Old image delete
            if ($storage->exists($post->image))
                $storage->delete($post->image);

            // Image name
            $imageName = Str::random(32) . "." . $request->image->getClientOriginalExtension();
            $post->image = $imageName;
            
            // Image save in public folder
            $storage->put($imageName, file_get_contents($request->image));
        }

        // Update Post
        $post->save();

        // Return Json Response
        return response()->json(&#91;
            'message' => "Post successfully updated."
        &#93;, 200);
    } catch (\Exception $e) {
        // Return Json Response
        return response()->json(&#91;
            'message' => "Something went really wrong!"
        &#93;, 500);
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">/**</span></span>
<span class="line"><span style="color: #6A9955"> * Update the specified resource in storage.</span></span>
<span class="line"><span style="color: #6A9955"> *</span></span>
<span class="line"><span style="color: #6A9955"> * </span><span style="color: #569CD6">@param</span><span style="color: #6A9955">  \Illuminate\Http\</span><span style="color: #4EC9B0">Request</span><span style="color: #6A9955">  $request</span></span>
<span class="line"><span style="color: #6A9955"> * </span><span style="color: #569CD6">@param</span><span style="color: #6A9955">  </span><span style="color: #569CD6">int</span><span style="color: #6A9955">  $id</span></span>
<span class="line"><span style="color: #6A9955"> * </span><span style="color: #569CD6">@return</span><span style="color: #6A9955"> \Illuminate\Http\</span><span style="color: #4EC9B0">Response</span></span>
<span class="line"><span style="color: #6A9955"> */</span></span>
<span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">update</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">PostStoreRequest</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">$id</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">try</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955">// Find Post</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$post</span><span style="color: #D4D4D4"> = </span><span style="color: #4EC9B0">Post</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">find</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$id</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        </span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (!</span><span style="color: #9CDCFE">$post</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">response</span><span style="color: #D4D4D4">()-&gt;</span><span style="color: #DCDCAA">json</span><span style="color: #D4D4D4">(&#91;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #CE9178">&#39;message&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;Post Not Found.&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">            &#93;, </span><span style="color: #B5CEA8">404</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$post</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">name</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">name</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$post</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">description</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">description</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">image</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #6A9955">// Public storage</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">$storage</span><span style="color: #D4D4D4"> = </span><span style="color: #4EC9B0">Storage</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">disk</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;public&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">            </span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #6A9955">// Old image delete</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$storage</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">exists</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$post</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">image</span><span style="color: #D4D4D4">))</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">$storage</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">delete</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$post</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">image</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #6A9955">// Image name</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">$imageName</span><span style="color: #D4D4D4"> = </span><span style="color: #4EC9B0">Str</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">random</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">32</span><span style="color: #D4D4D4">) </span><span style="color: #D4D4D4">.</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;.&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #D4D4D4">.</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">image</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">getClientOriginalExtension</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">$post</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">image</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">$imageName</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #6A9955">// Image save in public folder</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">$storage</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">put</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$imageName</span><span style="color: #D4D4D4">, </span><span style="color: #DCDCAA">file_get_contents</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$request</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">image</span><span style="color: #D4D4D4">));</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955">// Update Post</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$post</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">save</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955">// Return Json Response</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">response</span><span style="color: #D4D4D4">()-&gt;</span><span style="color: #DCDCAA">json</span><span style="color: #D4D4D4">(&#91;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #CE9178">&#39;message&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&quot;Post successfully updated.&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        &#93;, </span><span style="color: #B5CEA8">200</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    } </span><span style="color: #C586C0">catch</span><span style="color: #D4D4D4"> (\</span><span style="color: #4EC9B0">Exception</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">$e</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955">// Return Json Response</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">response</span><span style="color: #D4D4D4">()-&gt;</span><span style="color: #DCDCAA">json</span><span style="color: #D4D4D4">(&#91;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #CE9178">&#39;message&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&quot;Something went really wrong!&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        &#93;, </span><span style="color: #B5CEA8">500</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p><strong>5. Delete Post</strong></p>



<p>Delete a post by ID. Update the following code:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">PHP</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>/**
 * Remove the specified resource from storage.
 *
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function destroy($id)
{
    // Post Detail 
    $post = Post::find($id);
    
    if (!$post) {
        return response()->json(&#91;
            'message' => 'Post Not Found.'
        &#93;, 404);
    }

    // Public storage
    $storage = Storage::disk('public');
    
    // Image delete
    if ($storage->exists($post->image))
        $storage->delete($post->image);

    // Delete Post
    $post->delete();

    // Return Json Response
    return response()->json(&#91;
        'message' => "Post successfully deleted."
    &#93;, 200);
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">/**</span></span>
<span class="line"><span style="color: #6A9955"> * Remove the specified resource from storage.</span></span>
<span class="line"><span style="color: #6A9955"> *</span></span>
<span class="line"><span style="color: #6A9955"> * </span><span style="color: #569CD6">@param</span><span style="color: #6A9955">  </span><span style="color: #569CD6">int</span><span style="color: #6A9955">  $id</span></span>
<span class="line"><span style="color: #6A9955"> * </span><span style="color: #569CD6">@return</span><span style="color: #6A9955"> \Illuminate\Http\</span><span style="color: #4EC9B0">Response</span></span>
<span class="line"><span style="color: #6A9955"> */</span></span>
<span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">destroy</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$id</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">// Post Detail </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$post</span><span style="color: #D4D4D4"> = </span><span style="color: #4EC9B0">Post</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">find</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$id</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (!</span><span style="color: #9CDCFE">$post</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">response</span><span style="color: #D4D4D4">()-&gt;</span><span style="color: #DCDCAA">json</span><span style="color: #D4D4D4">(&#91;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #CE9178">&#39;message&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&#39;Post Not Found.&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">        &#93;, </span><span style="color: #B5CEA8">404</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">// Public storage</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$storage</span><span style="color: #D4D4D4"> = </span><span style="color: #4EC9B0">Storage</span><span style="color: #D4D4D4">::</span><span style="color: #DCDCAA">disk</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&#39;public&#39;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">// Image delete</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">$storage</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">exists</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$post</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">image</span><span style="color: #D4D4D4">))</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">$storage</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">delete</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">$post</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #9CDCFE">image</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">// Delete Post</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">$post</span><span style="color: #D4D4D4">-&gt;</span><span style="color: #DCDCAA">delete</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">// Return Json Response</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">response</span><span style="color: #D4D4D4">()-&gt;</span><span style="color: #DCDCAA">json</span><span style="color: #D4D4D4">(&#91;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;message&#39;</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #CE9178">&quot;Post successfully deleted.&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    &#93;, </span><span style="color: #B5CEA8">200</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p>You may or may not be aware that there is an artisan command to create a symbolic link from the storage folder to the public folder.</p>



<p>This command allows us to access the files. By default, Laravel stores files in the storage directory while keeping the public directory clean for public files only.</p>



<p>This command helps us generate symbolic links:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>php artisan storage:link</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">php</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">artisan</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">storage:link</span></span></code></pre></div>



<p>Don&#8217;t forget to add the necessary imports at the top of your PostController:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>use App\Models\Post;
use App\Http\Requests\PostStoreRequest;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">use</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">App</span><span style="color: #D7BA7D">\M</span><span style="color: #CE9178">odels</span><span style="color: #D7BA7D">\P</span><span style="color: #CE9178">ost</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #DCDCAA">use</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">App</span><span style="color: #D7BA7D">\H</span><span style="color: #CE9178">ttp</span><span style="color: #D7BA7D">\R</span><span style="color: #CE9178">equests</span><span style="color: #D7BA7D">\P</span><span style="color: #CE9178">ostStoreRequest</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #DCDCAA">use</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">Illuminate</span><span style="color: #D7BA7D">\S</span><span style="color: #CE9178">upport</span><span style="color: #D7BA7D">\F</span><span style="color: #CE9178">acades</span><span style="color: #D7BA7D">\S</span><span style="color: #CE9178">torage</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #DCDCAA">use</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">Illuminate</span><span style="color: #D7BA7D">\S</span><span style="color: #CE9178">upport</span><span style="color: #D7BA7D">\S</span><span style="color: #CE9178">tr</span><span style="color: #D4D4D4">;</span></span></code></pre></div>



<h2 class="wp-block-heading">No More Manual Setup – ServerAvatar Does It All for You!</h2>



<p>When you&#8217;re using&nbsp;<a href="https://serveravatar.com/" target="_blank" rel="noreferrer noopener">ServerAvatar</a>, there&#8217;s no need to install MySQL manually, it&#8217;s all handled for you. Plus, you can streamline your workflow even further using our Git-based deployment system.</p>



<p>ServerAvatar is your all-in-one, easy-to-use server management platform that takes the complexity out of managing servers and applications. With a clean and intuitive dashboard, you can take care of everything, from provisioning servers and deploying applications to setting up security, backups, and software updates, without touching the terminal.</p>



<p>Whether you&#8217;re managing one app or dozens, ServerAvatar makes it simple to create databases, manage multiple applications, and handle several servers, all in one place, with zero hassle.</p>



<h2 class="wp-block-heading">Frequently Asked Questions (FAQ)</h2>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question"><strong>Q1: How do I test my REST API endpoints?</strong></h3><div class="aioseo-faq-block-answer">
<p>You can test your API using several methods:<br><strong>Postman</strong>: Popular GUI tool for API testing<br><strong>cURL</strong>: Command line tool for making HTTP requests<br>Example cURL command:<br>curl -X GET http://localhost:8000/api/posts \ -H &#8220;Accept: application/json&#8221;</p>
</div></div>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question"><strong>Q2: Why am I getting &#8220;Accept: application/json&#8221; header requirement?</strong></h3><div class="aioseo-faq-block-answer">
<p>Laravel requires this header to return JSON responses instead of HTML. Without this header, Laravel might return HTML error pages instead of JSON responses, which is not suitable for API clients.</p>
</div></div>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question"><strong>Q3: How do I handle file uploads larger than 2MB?</strong></h3><div class="aioseo-faq-block-answer">
<p>You can modify the validation rules and PHP configuration:<br>Update validation in PostStoreRequest.php:<br>&#8216;image&#8217; =&gt; &#8216;required|image|mimes:jpeg,png,jpg,gif,svg|max:10240&#8217;, <em>// 10MB</em><br><br>Update PHP settings in php.ini:<br>upload_max_filesize = 10M post_max_size = 10M</p>
</div></div>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question"><strong>Q4: What if I get &#8220;Storage link already exists&#8221; error?</strong></h3><div class="aioseo-faq-block-answer">
<p>This happens when the symbolic link already exists. You can either:<br>Remove the existing link: rm public/storage<br>Or ignore the error if the link is working properly</p>
</div></div>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question"><strong>Q5: How do I add authentication to my API?</strong></h3><div class="aioseo-faq-block-answer">
<p>Laravel offers several authentication options:<br><strong>Sanctum</strong>: For SPA and mobile applications<br><strong>Passport</strong>: For OAuth2 implementation<br>Example with Sanctum:<br>composer require laravel/sanctum php artisan vendor:publish &#8211;provider=&#8221;Laravel\Sanctum\SanctumServiceProvider&#8221;</p>
</div></div>



<div data-schema-only="false" class="wp-block-aioseo-faq"><h3 class="aioseo-faq-block-question"><strong>Q6: What about CORS issues when calling API from frontend?</strong></h3><div class="aioseo-faq-block-answer">
<p>&nbsp;Laravel includes CORS middleware. Configure it in config/cors.php:<br>&#8216;allowed_origins&#8217; =&gt; [&#8216;http://localhost:3000&#8217;], <em>// Your frontend URL</em> &#8216;allowed_methods&#8217; =&gt; [&#8216;*&#8217;], &#8216;allowed_headers&#8217; =&gt; [&#8216;*&#8217;],</p>
</div></div>



<h2 class="wp-block-heading">Conclusion</h2>



<p>You have successfully built a complete REST API using Laravel 12 with full CRUD functionality. This API includes proper validation, error handling, image upload capabilities, and follows REST conventions.</p>



<p>Your API is now ready to handle:</p>



<ul class="wp-block-list">
<li>Creating new posts with image uploads</li>



<li>Retrieving all posts or specific posts by ID</li>



<li>Updating existing posts with optional image replacement</li>



<li>Deleting posts along with their associated images</li>
</ul>



<p>Remember to test your API endpoints using tools like Postman or any other API testing tool with the proper headers and request formats.</p><p>The post <a href="https://serveravatar.com/laravel-rest-api-tutorial/">Laravel API Tutorial: Create RESTful APIs with Ease</a> first appeared on <a href="https://serveravatar.com">ServerAvatar</a>.</p>]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
