{"id":5696,"date":"2020-09-17T12:28:20","date_gmt":"2020-09-17T12:28:20","guid":{"rendered":"https:\/\/www.fastcomet.com\/blog\/?p=5696"},"modified":"2025-12-17T19:10:17","modified_gmt":"2025-12-17T19:10:17","slug":"whats-new-in-laravel-8","status":"publish","type":"post","link":"https:\/\/www.fastcomet.com\/blog\/whats-new-in-laravel-8","title":{"rendered":"What&#8217;s New in Laravel 8"},"content":{"rendered":"\n<p class=\"has-drop-cap\">Six months after <a href=\"https:\/\/www.fastcomet.com\/blog\/laravel-7-0-is-here\" target=\"_blank\" rel=\"noreferrer noopener\">Laravel 7<\/a>, on September 8th, 2020, Laravel 8 was officially released \u2014 right on schedule. As always, the new version of the free, open-source PHP web framework comes with some exciting additions and a lot of quality improvements. In this article, we will make sure to go over the essential features of Laravel 8.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p class=\"h4\"><strong>Table of Contents:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list nav-list\">\n<li><a href=\"#additions\">Additions in Laravel 8<\/a>\n<ul class=\"wp-block-list\">\n<li><a href=\"#jetstream\">Laravel Jetstream<\/a><\/li>\n\n\n\n<li><a href=\"#models-directory\">Models Directory<\/a><\/li>\n\n\n\n<li><a href=\"#model-factory-classes\">Model Factory Classes<\/a><\/li>\n\n\n\n<li><a href=\"#dynamic-blade-components\">Dynamic Blade Components<\/a><\/li>\n\n\n\n<li><a href=\"#job-batching\">Job Batching<\/a><\/li>\n\n\n\n<li><a href=\"#migration-squashing\">Migration Squashing<\/a><\/li>\n\n\n\n<li><a href=\"#time-testing-helpers\">Time Testing Helpers<\/a><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><a href=\"#improvements\">Improvements in Laravel 8<\/a>\n<ul class=\"wp-block-list\">\n<li><a href=\"#improved-maintenance-mode\">Improved Maintenance Mode<\/a><\/li>\n\n\n\n<li><a href=\"#routing-namespace-updates\">Routing Namespace Updates<\/a><\/li>\n\n\n\n<li><a href=\"#improved-rate-limiting\">Improved Rate Limiting<\/a><\/li>\n\n\n\n<li><a href=\"#artisan-serve-improvements\">Artisan serve Improvements<\/a><\/li>\n\n\n\n<li><a href=\"#event-listener-improvements\">Event Listener Improvements<\/a><\/li>\n\n\n\n<li><a href=\"#tailwind-pagination-views\">Tailwind Pagination Views<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading h3\" id=\"additions\">Additions in Laravel 8<\/h2>\n\n\n\n<p>Starting with the additions in Laravel 8, we have Laravel Jetstream, job batching, new app\/models directory, etc. Let\u2019s skip the small talk and go right to the point.<\/p>\n\n\n\n<h3 class=\"wp-block-heading h4\" id=\"jetstream\">Laravel Jetstream<\/h3>\n\n\n\n<p>Laravel Jetstream is a new, beautifully designed application scaffolding for Laravel. It replaces and improves upon the UI scaffolding of previous versions of the PHP web framework. Laravel Jetstream includes login, registration, two-factor authentication, email verification, session management, optional team management, and API support via Laravel Sanctum. Those features make Laravel Jetstream a fitting starting point for your projects.&nbsp;&nbsp;<\/p>\n\n\n\n<p>Jetstream is designed via Tailwind CSS, offering you a choice between Inertia or Lifewire scaffolding.<\/p>\n\n\n\n<h3 class=\"wp-block-heading h4\" id=\"models-directory\">Models Directory<\/h3>\n\n\n\n<p>Due to the community\u2019s overwhelming demand, the default Laravel application scaffolding now has an app\/Models directory. It\u2019s to be the new home for Eloquent models, and all relevant generator commands are now updated to assume that models exist within that app\/Models directory (if it exists). If the directory doesn\u2019t exist, Laravel will assume that your models need to be placed within the app directory.<\/p>\n\n\n\n<h3 class=\"wp-block-heading h4\" id=\"model-factory-classes\">Model Factory Classes<\/h3>\n\n\n\n<p>Eloquent model factories can be qualified as improvements, but we decided to put them in the additions that come with Laravel 8. We do that because Eloquent model factories are now completely re-written as class-based factories, in addition to being improved by having first-class relationship support. Thanks to the <code>HasFactory<\/code> trait that is now available on generated models, the model factory may be used in the following way:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">use App\\Models\\User;<br><br>User::factory()-&gt;count(50)-&gt;create();<\/pre>\n\n\n\n<p>Model factories are now simple PHP classes, and thus state transformations can be written as class methods. What\u2019s more, you have the ability to include any additional helper classes that you need for your Eloquent model.<\/p>\n\n\n\n<p>So, in case your User model has a suspended state that modifies one of its default attribute values, you may define your state transformations using the base factory&#8217;s state method. You have the option to name your state method as you prefer. It\u2019s a typical PHP method, after all:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\/**<br>&nbsp;* Indicate that the user is suspended.<br>&nbsp;*<br>&nbsp;* @return \\Illuminate\\Database\\Eloquent\\Factories\\Factory<br>&nbsp;*\/<br>public function suspended()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;return $this-&gt;state([<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'account_status' =&gt; 'suspended',<br>&nbsp;&nbsp;&nbsp;&nbsp;]);<br>}<\/pre>\n\n\n\n<p>After defining the state transformation method, you may use it like so:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">use App\\Models\\User;<br><br>User::factory()-&gt;count(5)-&gt;suspended()-&gt;create();<\/pre>\n\n\n\n<p>As we already mentioned, Laravel 8&#8217;s model factories include first class support for relationships, and thus in case the User model has a posts relationship method, you can just&nbsp; run the following code if you wish to generate a user with three posts:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$users = User::factory()<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt;hasPosts(3, [<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'published' =&gt; false,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt;create();<\/pre>\n\n\n\n<p>With the idea to ease the upgrade process, the <a href=\"https:\/\/github.com\/laravel\/legacy-factories\">laravel\/legacy-factories<\/a> package was released to offer support for the previous iteration of model factories within Laravel 8.x.<\/p>\n\n\n\n<p>There are a lot more features included in Laravel\u2019s re-written factories. If you wish to learn about them, go ahead and visit the official <a href=\"https:\/\/laravel.com\/docs\/8.x\/database-testing#creating-factories\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">database testing documentation<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading h4\" id=\"dynamic-blade-components\">Dynamic Blade Components<\/h3>\n\n\n\n<p>There may be times when you need to render a component but be unaware of which exact component has to be rendered until runtime. In such cases, Laravel 8 now offers the option to use its built-in <code>dynamic-component<\/code> in order to render the component that\u2019s based on a runtime value or variable:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&lt;x-dynamic-component :component=\"$componentName\" class=\"mt-4\" \/&gt;<\/pre>\n\n\n\n<p>If you want to learn more about Blade components, you can consult the official <a href=\"https:\/\/laravel.com\/docs\/8.x\/blade#components\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Blade documentation<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading h4\" id=\"job-batching\">Job Batching<\/h3>\n\n\n\n<p>The job batching feature that Laravel 8 provides will allow you to execute a batch of jobs with ease. Additionally, you can perform a type of action after your chosen jobs are done executing. The main use of job batching is in combination with completion callbacks. You may use the <code>then<\/code>, <code>catch<\/code>, and <code>finally<\/code> methods in order to define completion callbacks for your batch. Each of those callbacks would receive an Illuminate\\Bus\\Batch instance when invoked.<\/p>\n\n\n\n<p>For examples and more thorough information around Job Batching, consider visiting <a href=\"https:\/\/laravel.com\/docs\/8.x\/queues#job-batching\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">the official queue documentation<\/a>.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading h4\" id=\"migration-squashing\">Migration Squashing<\/h3>\n\n\n\n<p>While building your application, you may accumulate an increasing number of migrations over time. That accumulation could potentially lead to the migration directory becoming overloaded with hundreds of migrations. If you use PostgreSQL or MariaDB, with Laravel 8, you now have the option to \u201csquash\u201d all migrations into a single SQL file. Execute the <code>schema:dump<\/code> command when you wish to get started with the process:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">php artisan schema:dump<br>\/\/ Dump the current database schema and prune all existing migrations...<br>php artisan schema:dump --prune<\/pre>\n\n\n\n<p>After you execute the command above, Laravel will write a \u201cschema\u201d file to your database\/schema directory. That will make it so when you attempt to migrate your database without any other migrations being executed, Laravel will first execute the schema file\u2019s SQL. Afterward, the framework will continue executing all remaining migrations, which were not part of that schema dump.<\/p>\n\n\n\n<h3 class=\"wp-block-heading h4\" id=\"time-testing-helpers\">Time Testing Helpers<\/h3>\n\n\n\n<p>While testing, you may sometimes have to modify time returned by helpers such as now or <code>Illuminate\\Support\\Carbon::now()<\/code>. With Laravel 8, you now have helpers that offer you manipulation of the current time like so:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">public function testTimeCanBeManipulated()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Travel into the future...<br>&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;travel(5)-&gt;milliseconds();<br>&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;travel(5)-&gt;seconds();<br>&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;travel(5)-&gt;minutes();<br>&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;travel(5)-&gt;hours();<br>&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;travel(5)-&gt;days();<br>&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;travel(5)-&gt;weeks();<br>&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;travel(5)-&gt;years();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Travel into the past...<br>&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;travel(-5)-&gt;hours();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Travel to an explicit time...<br>&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;travelTo(now()-&gt;subHours(6));<br><br>&nbsp;&nbsp;&nbsp;&nbsp;\/\/ Return back to the present time...<br>&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;travelBack();<br>}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading h3\" id=\"improvements\">Improvements in Laravel 8<\/h2>\n\n\n\n<p>We are finished covering the most significant additions to Laravel 8, now let\u2019s continue with the improvements that come with this new version of the framework.<\/p>\n\n\n\n<h3 class=\"wp-block-heading h4\" id=\"improved-maintenance-mode\">Improved Maintenance Mode<\/h3>\n\n\n\n<p>In previous Laravel releases, the <code>php artisan down<\/code> maintenance mode feature could be bypassed. You can do that by using an &#8220;allow list&#8221; of IP addresses allowed to access the application. That feature is now removed with the purpose of having a simpler &#8220;secret&#8221; \/ token solution.<\/p>\n\n\n\n<p>In maintenance mode, you may now use the <code>secret<\/code> option to specify a maintenance mode bypass token like so:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">php artisan down --secret=\"182302b-364a-4a88-ada1-bb72d5a62135\"<\/pre>\n\n\n\n<p>After you have placed the application in maintenance mode, you have the ability to navigate to the application URL that matches this token, and Laravel will issue a maintenance mode bypass cookie to your browser:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">https:\/\/example.com\/182302b-364a-4a88-ada1-bb72d5a62135<\/pre>\n\n\n\n<p>After you access this hidden route, you will be redirected to the \/ route of the application. When the cookie has been issued to your browser, you will have the capability to browse the application normally (as if it wasn\u2019t in maintenance mode).<\/p>\n\n\n\n<h3 class=\"wp-block-heading h4\" id=\"routing-namespace-updates\">Routing Namespace Updates<\/h3>\n\n\n\n<p>In previous Laravel releases, there was a <code>$namespace<\/code> property to go with the <code>RouteServiceProvider<\/code>. Said property\u2019s value would be automatically prefixed onto controller route definitions and calls to the <code>action<\/code> helper \/ <code>URL::action<\/code> method. In Laravel 8.x, that property is null by default, which means the framework will do no automatic namespace prefixing. So, in new Laravel 8.x applications, controller route definitions are to be defined using standard PHP callable syntax:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">use App\\Http\\Controllers\\UserController;<br><br>Route::get('\/users', [UserController::class, 'index']);<\/pre>\n\n\n\n<p>Calls to the action related methods should use the same callable syntax:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">action([UserController::class, 'index']);<br><br>return Redirect::action([UserController::class, 'index']);<\/pre>\n\n\n\n<p>In case you prefer the Laravel 7.x style controller route prefixing, all you have to do is simply add the <code>$namespace<\/code> property into your application&#8217;s <code>RouteServiceProvider<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading h4\" id=\"improved-rate-limiting\">Improved Rate Limiting<\/h3>\n\n\n\n<p>With Laravel 8, the rate limiter feature is now augmented with additional flexibility and power, while continuing to maintain backward compatibility with the previous release&#8217;s throttle middleware API.<\/p>\n\n\n\n<p>Rate limiters are defined using the <code>RateLimiter<\/code> facade&#8217;s <code>for<\/code> method. The <code>for<\/code> method accepts a rate limiter name and a Closure that returns the limit configuration. The configuration should apply to routes that are assigned this rate limiter:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">use Illuminate\\Cache\\RateLimiting\\Limit;<br>use Illuminate\\Support\\Facades\\RateLimiter;<br>RateLimiter::for('global', function (Request $request) {<br>&nbsp;&nbsp;&nbsp;&nbsp;return Limit::perMinute(1000);<br>});<\/pre>\n\n\n\n<p>Because rate limiter callbacks receive the incoming HTTP request instance, you may build the appropriate rate limit dynamically and based on the incoming request or the authenticated user:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">RateLimiter::for('uploads', function (Request $request) {<br>&nbsp;&nbsp;&nbsp;&nbsp;return $request-&gt;user()-&gt;vipCustomer()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;? Limit::none()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: Limit::perMinute(100);<br>});<\/pre>\n\n\n\n<p>In some cases, you may choose to segment rate limits by an arbitrary value. For example, you may want to allow users to access a specific route 100 times per minute per IP address. To accomplish this, you have to use the <code>by<\/code> method while building your rate limit:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">RateLimiter::for('uploads', function (Request $request) {<br>&nbsp;&nbsp;&nbsp;&nbsp;return $request-&gt;user()-&gt;vipCustomer()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;? Limit::none()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: Limit::perMinute(100)-&gt;by($request-&gt;ip());<br>});<\/pre>\n\n\n\n<p>Rate limiters may be attached to routes or route groups using the throttle <a href=\"https:\/\/laravel.com\/docs\/8.x\/middleware\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">middleware<\/a>. It accepts the name of the rate limiter you want to assign to the route:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Route::middleware(['throttle:uploads'])-&gt;group(function () {<br>&nbsp;&nbsp;&nbsp;&nbsp;Route::post('\/audio', function () {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/<br>&nbsp;&nbsp;&nbsp;&nbsp;});<br>&nbsp;&nbsp;&nbsp;&nbsp;Route::post('\/video', function () {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/<br>&nbsp;&nbsp;&nbsp;&nbsp;});<br>});<\/pre>\n\n\n\n<p>If you are interested in more information about rate limiting, go visit the official <a href=\"https:\/\/laravel.com\/docs\/8.x\/routing#rate-limiting\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">routing documentation<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading h4\" id=\"artisan-serve-improvements\">Artisan <code>serve<\/code> Improvements<\/h3>\n\n\n\n<p>Another improvement with Laravel 8 is for the Artisan <code>serve<\/code> command. Now it has automatic reloading whenever environment variable changes are detected within the local .env file. Prior to Laravel 8, the command had to be manually stopped and restarted.<\/p>\n\n\n\n<h3 class=\"wp-block-heading h4\" id=\"event-listener-improvements\">Event Listener Improvements<\/h3>\n\n\n\n<p>Closure based event listeners are also improved with the new version of the framework. Those may now be registered by simply passing the Closure to the <code>Event::listen<\/code> method. Laravel inspects the Closure to determine the specific type of event the listener handles:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">use App\\Events\\PodcastProcessed;<br>use Illuminate\\Support\\Facades\\Event;<br>Event::listen(function (PodcastProcessed $event) {<br>&nbsp;&nbsp;&nbsp;&nbsp;\/\/<br>});<\/pre>\n\n\n\n<p>Additionally, Closure based event listeners can be marked as queueable by using the <code>Illuminate\\Events\\queueable<\/code> function:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">use App\\Events\\PodcastProcessed;<br>use function Illuminate\\Events\\queueable;<br>use Illuminate\\Support\\Facades\\Event;<br>Event::listen(queueable(function (PodcastProcessed $event) {<br>&nbsp;&nbsp;&nbsp;&nbsp;\/\/<br>}));<\/pre>\n\n\n\n<p>Similar to queued jobs, you have the option to use the <code>onConnection<\/code>, <code>onQueue<\/code>, and <code>delay<\/code> methods to customize the execution of the queued listener:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Event::listen(queueable(function (PodcastProcessed $event) {<br>&nbsp;&nbsp;&nbsp;&nbsp;\/\/<br>})-&gt;onConnection('redis')-&gt;onQueue('podcasts')-&gt;delay(now()-&gt;addSeconds(10)));<\/pre>\n\n\n\n<p>If you wish to handle anonymous queued listener failures, you have the capability to provide a Closure to the <code>catch<\/code> method while defining the <code>queueable<\/code> listener:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">use App\\Events\\PodcastProcessed;<br>use function Illuminate\\Events\\queueable;<br>use Illuminate\\Support\\Facades\\Event;<br>use Throwable;<br>Event::listen(queueable(function (PodcastProcessed $event) {<br>&nbsp;&nbsp;&nbsp;&nbsp;\/\/<br>})-&gt;catch(function (PodcastProcessed $event, Throwable $e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;\/\/ The queued listener failed...<br>}));<\/pre>\n\n\n\n<h3 class=\"wp-block-heading h4\" id=\"tailwind-pagination-views\">Tailwind Pagination Views<\/h3>\n\n\n\n<p>Last but not least, the Laravel paginator has now been updated to use the <a href=\"https:\/\/tailwindcss.com\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Tailwind CSS<\/a> framework by default. Tailwind CSS framework is a highly customizable, low-level CSS framework. It provides all the needed building blocks for building various designs without having opinionated styles that you have to fight in order to override. It goes without a doubt \u2014 Bootstrap 3 and 4 views are still available.<\/p>\n\n\n\n<h2 class=\"wp-block-heading h3\">Conclusion<\/h2>\n\n\n\n<p>With each new release, Laravel becomes more and more comprehensive. After <a href=\"https:\/\/www.fastcomet.com\/blog\/laravel-6-0-is-here\" target=\"_blank\" rel=\"noreferrer noopener\">Laravel 6<\/a>, the framework follows semver and releases a major version every six months. Laravel definitely keeps making things easier when it comes to creating web applications and we can\u2019t wait for the next release, even though we just got that fresh Laravel 8.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Six months after Laravel 7, on September 8th, 2020, Laravel 8 was officially released \u2014 right on schedule. As always, the new version of the free, open-source PHP web framework comes with some exciting additions and a lot of quality improvements. In this article, we will make sure to go over the essential features of [&hellip;]<\/p>\n","protected":false},"author":13,"featured_media":5695,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4724],"tags":[210,4599,42,103,78],"class_list":["post-5696","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-webdev","tag-laravel","tag-laravel-8","tag-opensource","tag-php","tag-update"],"featured_image_src":"https:\/\/www.fastcomet.com\/blog\/wp-content\/uploads\/2020\/09\/laravel8.0.png","author_info":{"display_name":"Joseph","author_link":"https:\/\/www.fastcomet.com\/blog\/author\/joseph"},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Laravel 8 \u2014 Additions and Improvements | FastComet<\/title>\n<meta name=\"description\" content=\"The new Laravel 8 continues the improvements made in Laravel 7.x. Version 8 ships with cool new features as well as some changes to the queue system.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.fastcomet.com\/blog\/whats-new-in-laravel-8\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Laravel 8 \u2014 Additions and Improvements | FastComet\" \/>\n<meta property=\"og:description\" content=\"The new Laravel 8 continues the improvements made in Laravel 7.x. Version 8 ships with cool new features as well as some changes to the queue system.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.fastcomet.com\/blog\/whats-new-in-laravel-8\" \/>\n<meta property=\"og:site_name\" content=\"FastComet Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-09-17T12:28:20+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-12-17T19:10:17+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.fastcomet.com\/blog\/wp-content\/uploads\/2020\/09\/laravel8.0.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"620\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Joseph\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Joseph\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Laravel 8 \u2014 Additions and Improvements | FastComet","description":"The new Laravel 8 continues the improvements made in Laravel 7.x. Version 8 ships with cool new features as well as some changes to the queue system.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.fastcomet.com\/blog\/whats-new-in-laravel-8","og_locale":"en_US","og_type":"article","og_title":"Laravel 8 \u2014 Additions and Improvements | FastComet","og_description":"The new Laravel 8 continues the improvements made in Laravel 7.x. Version 8 ships with cool new features as well as some changes to the queue system.","og_url":"https:\/\/www.fastcomet.com\/blog\/whats-new-in-laravel-8","og_site_name":"FastComet Blog","article_published_time":"2020-09-17T12:28:20+00:00","article_modified_time":"2025-12-17T19:10:17+00:00","og_image":[{"width":1024,"height":620,"url":"https:\/\/www.fastcomet.com\/blog\/wp-content\/uploads\/2020\/09\/laravel8.0.png","type":"image\/png"}],"author":"Joseph","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Joseph","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.fastcomet.com\/blog\/whats-new-in-laravel-8#article","isPartOf":{"@id":"https:\/\/www.fastcomet.com\/blog\/whats-new-in-laravel-8"},"author":{"name":"Joseph","@id":"https:\/\/www.fastcomet.com\/blog\/#\/schema\/person\/4f2c9600f49c872b8d56996ee3b95035"},"headline":"What&#8217;s New in Laravel 8","datePublished":"2020-09-17T12:28:20+00:00","dateModified":"2025-12-17T19:10:17+00:00","mainEntityOfPage":{"@id":"https:\/\/www.fastcomet.com\/blog\/whats-new-in-laravel-8"},"wordCount":1601,"commentCount":0,"image":{"@id":"https:\/\/www.fastcomet.com\/blog\/whats-new-in-laravel-8#primaryimage"},"thumbnailUrl":"https:\/\/www.fastcomet.com\/blog\/wp-content\/uploads\/2020\/09\/laravel8.0.png","keywords":["Laravel","laravel 8","opensource","php","update"],"articleSection":["Development"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.fastcomet.com\/blog\/whats-new-in-laravel-8#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.fastcomet.com\/blog\/whats-new-in-laravel-8","url":"https:\/\/www.fastcomet.com\/blog\/whats-new-in-laravel-8","name":"Laravel 8 \u2014 Additions and Improvements | FastComet","isPartOf":{"@id":"https:\/\/www.fastcomet.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.fastcomet.com\/blog\/whats-new-in-laravel-8#primaryimage"},"image":{"@id":"https:\/\/www.fastcomet.com\/blog\/whats-new-in-laravel-8#primaryimage"},"thumbnailUrl":"https:\/\/www.fastcomet.com\/blog\/wp-content\/uploads\/2020\/09\/laravel8.0.png","datePublished":"2020-09-17T12:28:20+00:00","dateModified":"2025-12-17T19:10:17+00:00","author":{"@id":"https:\/\/www.fastcomet.com\/blog\/#\/schema\/person\/4f2c9600f49c872b8d56996ee3b95035"},"description":"The new Laravel 8 continues the improvements made in Laravel 7.x. Version 8 ships with cool new features as well as some changes to the queue system.","breadcrumb":{"@id":"https:\/\/www.fastcomet.com\/blog\/whats-new-in-laravel-8#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.fastcomet.com\/blog\/whats-new-in-laravel-8"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.fastcomet.com\/blog\/whats-new-in-laravel-8#primaryimage","url":"https:\/\/www.fastcomet.com\/blog\/wp-content\/uploads\/2020\/09\/laravel8.0.png","contentUrl":"https:\/\/www.fastcomet.com\/blog\/wp-content\/uploads\/2020\/09\/laravel8.0.png","width":1024,"height":620,"caption":"Laravel 8 - Additions and Improvements"},{"@type":"BreadcrumbList","@id":"https:\/\/www.fastcomet.com\/blog\/whats-new-in-laravel-8#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.fastcomet.com\/blog"},{"@type":"ListItem","position":2,"name":"What&#8217;s New in Laravel 8"}]},{"@type":"WebSite","@id":"https:\/\/www.fastcomet.com\/blog\/#website","url":"https:\/\/www.fastcomet.com\/blog\/","name":"FastComet Blog","description":"FastComet Web Hosting Blog","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.fastcomet.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.fastcomet.com\/blog\/#\/schema\/person\/4f2c9600f49c872b8d56996ee3b95035","name":"Joseph","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.fastcomet.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/1aa84dc2a6398ed73c957bd1de58806d12d44e2956744ed1ae9b435d57822ab7?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1aa84dc2a6398ed73c957bd1de58806d12d44e2956744ed1ae9b435d57822ab7?s=96&d=mm&r=g","caption":"Joseph"},"description":"Joseph is part of the FastComet Marketing team. With years of content writing experience behind him, it's one of his favorite activities. Joseph takes part in the SEO of the FastComet website and blog. His goal is to write comprehensive posts and guides, always aiming to help our clients with essential information. Joseph also has a thirst for knowledge and improvement, which makes the hosting environment a perfect place for him.","sameAs":["https:\/\/www.fastcomet.com\/"],"url":"https:\/\/www.fastcomet.com\/blog\/author\/joseph"}]}},"_links":{"self":[{"href":"https:\/\/www.fastcomet.com\/blog\/wp-json\/wp\/v2\/posts\/5696","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.fastcomet.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fastcomet.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fastcomet.com\/blog\/wp-json\/wp\/v2\/users\/13"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fastcomet.com\/blog\/wp-json\/wp\/v2\/comments?post=5696"}],"version-history":[{"count":11,"href":"https:\/\/www.fastcomet.com\/blog\/wp-json\/wp\/v2\/posts\/5696\/revisions"}],"predecessor-version":[{"id":10989,"href":"https:\/\/www.fastcomet.com\/blog\/wp-json\/wp\/v2\/posts\/5696\/revisions\/10989"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.fastcomet.com\/blog\/wp-json\/wp\/v2\/media\/5695"}],"wp:attachment":[{"href":"https:\/\/www.fastcomet.com\/blog\/wp-json\/wp\/v2\/media?parent=5696"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fastcomet.com\/blog\/wp-json\/wp\/v2\/categories?post=5696"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fastcomet.com\/blog\/wp-json\/wp\/v2\/tags?post=5696"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}