<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: tech-angel</title>
    <description>The latest articles on DEV Community by tech-angel (@bhumi_shah_bce47c89355731).</description>
    <link>https://dev.to/bhumi_shah_bce47c89355731</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2870571%2Fe56d8b16-2264-4963-aeeb-a633e76dbf87.png</url>
      <title>DEV Community: tech-angel</title>
      <link>https://dev.to/bhumi_shah_bce47c89355731</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bhumi_shah_bce47c89355731"/>
    <language>en</language>
    <item>
      <title>5 Under-the-Radar Laravel13 Features Worth Using Today</title>
      <dc:creator>tech-angel</dc:creator>
      <pubDate>Fri, 05 Jun 2026 13:23:00 +0000</pubDate>
      <link>https://dev.to/bhumi_shah_bce47c89355731/5-under-the-radar-laravel13-features-worth-using-today-57b8</link>
      <guid>https://dev.to/bhumi_shah_bce47c89355731/5-under-the-radar-laravel13-features-worth-using-today-57b8</guid>
      <description>&lt;p&gt;Laravel 13's recent release didn't introduce any breaking changes or headline-grabbing framework overhauls. Instead, they delivered a collection of practical enhancements that improve developer experience in areas many applications rely on every day: queues, task scheduling, caching, and database migrations.&lt;/p&gt;

&lt;p&gt;While each update may seem minor on its own, together they reveal a clear focus on making background processing and application operations easier to manage and monitor.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Dispatch Multiple Jobs with &lt;code&gt;Bus::bulk()&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;A common pattern in Laravel applications is dispatching large numbers of jobs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$users&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ProcessUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Laravel 13 introduces &lt;code&gt;Bus::bulk()&lt;/code&gt;, providing a more elegant way to dispatch multiple jobs at once:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Bus&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;bulk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ProcessUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Unlike &lt;code&gt;Bus::batch()&lt;/code&gt;, this approach doesn't create batch records or maintain progress tracking. Instead, it focuses on efficient job dispatching by grouping jobs by queue and connection internally.&lt;/p&gt;

&lt;p&gt;Ideal use cases include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sending bulk notifications&lt;/li&gt;
&lt;li&gt;Large-scale data imports&lt;/li&gt;
&lt;li&gt;Email campaigns&lt;/li&gt;
&lt;li&gt;Mass background processing tasks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you only need to queue jobs and don't require batch monitoring, &lt;code&gt;Bus::bulk()&lt;/code&gt; is likely the better choice.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Using S3 as a Cache Backend
&lt;/h2&gt;

&lt;p&gt;Laravel 13 introduced a new storage-based cache driver that can leverage any configured filesystem disk, including Amazon S3.&lt;/p&gt;

&lt;p&gt;Configuration is straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CACHE_DRIVER=storage
CACHE_STORAGE_DISK=s3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This opens interesting possibilities for cloud-native and serverless applications where maintaining dedicated caching infrastructure may not be desirable.&lt;/p&gt;

&lt;p&gt;Benefits include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fewer services to manage&lt;/li&gt;
&lt;li&gt;Simplified deployments&lt;/li&gt;
&lt;li&gt;Better compatibility with serverless environments&lt;/li&gt;
&lt;li&gt;Easy integration with existing storage configurations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While Redis remains the preferred option for high-performance caching, the storage driver provides a practical alternative when simplicity matters more than speed.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Metadata for Scheduled Tasks
&lt;/h2&gt;

&lt;p&gt;Monitoring scheduled commands often requires custom naming conventions or parsing command strings to identify task categories.&lt;/p&gt;

&lt;p&gt;Laravel 13 addresses this with support for task attributes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$schedule&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'reports:generate'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;withAttributes&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
        &lt;span class="s1"&gt;'tag'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'reports'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'priority'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'high'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These attributes become available during scheduler lifecycle events and callbacks, making it much easier to build:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monitoring dashboards&lt;/li&gt;
&lt;li&gt;Logging systems&lt;/li&gt;
&lt;li&gt;Alerting tools&lt;/li&gt;
&lt;li&gt;Operational reporting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of relying on command names for identification, you can now attach structured metadata directly to scheduled jobs.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Conditional Event Listener Discovery
&lt;/h2&gt;

&lt;p&gt;Laravel's event discovery system also received an improvement through support for conditional registration.&lt;/p&gt;

&lt;p&gt;Consider this listener:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;NotifyExternalCrm&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;ShouldBeDiscovered&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;ShouldQueue&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;shouldBeDiscovered&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;app&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'production'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key advantage is that the listener is never registered when the condition evaluates to false.&lt;/p&gt;

&lt;p&gt;Compared to placing environment checks inside the &lt;code&gt;handle()&lt;/code&gt; method:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nf"&gt;app&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'production'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Process event...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the new approach prevents unnecessary listener registration and job dispatching altogether.&lt;/p&gt;

&lt;p&gt;This results in cleaner code and more efficient event handling.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Easier Foreign Key Checks in Migrations
&lt;/h2&gt;

&lt;p&gt;Developers often write defensive migrations to avoid duplicate schema changes across environments.&lt;/p&gt;

&lt;p&gt;Laravel 13 introduces a dedicated helper for foreign key detection:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nc"&gt;Schema&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;hasForeignKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'orders'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'user_id'&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Create foreign key...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Previously, developers typically had to inspect foreign key definitions manually using schema metadata methods.&lt;/p&gt;

&lt;p&gt;The new API makes migrations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cleaner&lt;/li&gt;
&lt;li&gt;More readable&lt;/li&gt;
&lt;li&gt;Easier to maintain&lt;/li&gt;
&lt;li&gt;Safer to run repeatedly&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Laravel 13 may not be the most dramatic set of releases, but they deliver meaningful quality-of-life improvements.&lt;/p&gt;

&lt;p&gt;Highlights include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Bus::bulk()&lt;/code&gt; for lightweight mass job dispatching&lt;/li&gt;
&lt;li&gt;S3-backed caching through the storage driver&lt;/li&gt;
&lt;li&gt;Scheduler metadata with &lt;code&gt;withAttributes()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Conditional event listener discovery&lt;/li&gt;
&lt;li&gt;Simple foreign key existence checks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The common theme is clear: Laravel continues to invest in operational tooling, background processing, and developer productivity without adding unnecessary complexity.&lt;/p&gt;

&lt;p&gt;If you're upgrading to the latest version, the process remains simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer update laravel/framework
php artisan &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which of these features do you see making the biggest impact in your projects?&lt;/p&gt;

</description>
      <category>backend</category>
      <category>laravel</category>
      <category>news</category>
      <category>php</category>
    </item>
  </channel>
</rss>
