Laravel 8 New Features

  • Laravel 8 New Features

    Sharing is Caring... Show some love :)

    Laravel 8 is here with amazing new features to better improve our development processes with the framework.

    On September 6th, 2020, Laravel released the new version of Laravel shipped with lots of improvements, optimization, and the introduction of Laravel JetStream.

    In this article, we will look at what is new in Laravel 8 and Laravel 8 new features and how to get started with each of them in your new project.

    We will work through the current state of the framework and give you some tips and foundational knowledge to help you start using Laravel 8.

    By the way, if you’re just STARTING out with Laravel, I have created a Complete Laravel Guide just for you.

    We’ll cover the following:

    1. Introduction to JetStream
    2. Model Factory Classes
    3. Model Directory
    4. Migration Squashing
    5. Job Batching and Queue Improvements
    6. Improved Rate Limiting
    7. Maintenance Improvements 
    8. Dynamic Blade Components
    9. Tailwind Pagination Views
    10. Time Testing Helpers
    11. Improvements to artisan serve
    12. Event Listener Improvements

    Let’s get started:

    Before we delve in, if you’re a backend developer or looking at delving into this career path, join other developers to receive daily articles on backend development that will boost your productivity.

    What is new in Laravel 8

    Introduction to JetStream

    JetStream is one of the main feature added to the Laravel 8 new features

    JetStream is an application scaffolding for Laravel that provides a basic setup for any project including the famous Laravel Auth for Login, two-factor authentication, registration, email verification, etc.

    It also provides API support through Laravel Sanctum.

    Laravel JetStream is more like an improved version of the legacy Laravel Authentication process and UI.

    Getting Started with JetStream

    Let’s look at how to install and use JetStream in our project.

    Installation

    Installing via composer:

    composer require laravel/jetstream

    Install Jetstream With Livewire

    php artisan jetstream:install livewire

    Or, Install Jetstream With Inertia

    php artisan jetstream:install inertia

    The inertia and livewire are just different views components that come with JetStream, you can read more about Inertia and Livewire.

    You can also go through the installation process from the official documentation to understand even more.

    Finalizing Installation

    After installing the package and the UI component of your choice, you can finalize the installation by running the commands below.

    npm install && npm run dev
    
    php artisan migrate

    Build something with JetStream.

    Model Factory Classes

    In Laravel 8, the model factories have been completed rewritten as class-based and also improved to have first-class relationship support.

    ALSO READ  Motivational tips for backend developers

    The newly introduced HasFactory trait is very helpful and we can now access different model methods like:

    use App\Models\User;
    
    User::factory()->count(50)->create();

    For example, your User model might have an activated state that modifies one of its default attribute values. 

    You may define your state transformations using the base factory’s state method. 

    You may name your state method anything you like. After all, it’s just a typical PHP method:

    /**
     * Indicate that the user is activated.
     *
     * @return \Illuminate\Database\Eloquent\Factories\Factory
     */
    public function activated()
    {
        return $this->state([
            'account_status' => 'activated',
        ]);
    }

    After defining the state transformation method, we may use it like so:

    use App\Models\User;
    
    User::factory()->count(5)->activated()->create();

    You can learn more about model factory classes here.

    Model Directory

    The Laravel team has finally honored the request of developers around the world by introducing a new home for models.

    What this means is that by default Laravel Models will now be placed inside app/Models folder and every setup are done by default for Laravel to honor this new directory.

    Also, note that if the Models directory is not found, Laravel will default to use the previous apps folder as the home for models.

    Migration Squashing

    Have you ever build a Laravel project that has more than a hundred migration files and noticed how boated the migration folder becomes?

    Well, Laravel 8 introduces Migration Squashing which will simply “Squash” or convert the migrations into a single file and save up hundreds of files in a folder.

    To get started, simply run the following commands if your project is already running into numerous migrations.

    php artisan schema:dump
    
    // Dump the current database schema and prune all existing migrations...
    
    php artisan schema:dump --prune

    What these commands will do is to generate a Schema file inside database/schema directory housing all your migrations.

    When you create new migrations and run the php artisan migrate command, Laravel will execute the Schema file first before running any other migrations that are not part of the migration squash.

    Interesting isn’t it 🙂

    Job Batching and Queue Improvements

    I have been looking at ways I can execute many jobs at once and still perform some actions at different stages of the process.

    Well, Laravel 8 just introduced exactly what I have been looking for.

    With the new Job Batching feature, I can execute multiple jobs and perform actions on completion.

    ALSO READ  Vue.js for backend developers

    Let’s look at how it works:

    use App\Jobs\SendPost;
    use App\Podcast;
    use Illuminate\Bus\Batch;
    use Illuminate\Support\Facades\Bus;
    use Throwable;
    
    $batch = Bus::batch([
        new SendPost(Post::find(1)),
        new SendPost(Post::find(2)),
        new SendPost(Post::find(3)),
        new SendPost(Post::find(4)),
        new SendPost(Post::find(5)),
    ])->then(function (Batch $batch) {
        // All jobs completed successfully...
        $this->emailAdminOnCompletion();
    })->catch(function (Batch $batch, Throwable $e) {
        // First batch job failure detected...
        $this->emailAdminOnAnyError();
    })->finally(function (Batch $batch) {
        // The batch has finished executing...
        $this->emailAdminOnDone();
    })->dispatch();

    Looking at the script above, with the new batch method of the Job class, I sent out 5 different Post at the same time and still perform different actions at different stages of the Job.

    With the introduction of the new methods, a lot of improvements have been made to the Queue class, you can read more about it.

    Improved Rate Limiting

    If all you do mostly with Laravel is write APIs like me, you might have had a hard time with Rate Limiting for your API middleware.

    Laravel 8 comes with an improved Rate Limiting feature which is more flexible and easy to use with your API middleware.

    Laravel comes with the RateLimiter facade which comes with lots of useful methods.

    Let’s take a look at it:

    use Illuminate\Cache\RateLimiting\Limit;
    use Illuminate\Support\Facades\RateLimiter;
    
    RateLimiter::for('global', function (Request $request) {
        return Limit::perMinute(1000);
    });

    The for method accepts a rate limiter name and a closure that returns the limit configuration that should apply to routes that are assigned this rate limiter.

    RateLimiter::for('uploads', function (Request $request) {
        return $request->user()->admin()
                    ? Limit::none()
                    : Limit::perMinute(100);
    });

    You can build rate-limiting dynamically based on the incoming requests or authenticated user as shown above.

    There are lots you could do with RateLimiter, take a look at them here.

    Take a break and join other backend developers to receive our Laravel tips to boost your productivity.

    Maintenance Improvements 

    Using php artisan down command to activate maintenance mode and set up “Allow IPs” is no longer supported.

    Instead of using IPs, Laravel 8 introduces secret token-based access.

    You simply generate a token when turning on maintenance mode and anyone with the token can still access the web pages.

    Let’s see how:

    // Turning on maintenance 
    php artisan down --secret="1630542a-246b-4b66-afa1-dd72a4c43515"

    Accessing the web pages in maintenance mode.

    https://masteringbackend.com/1630542a-246b-4b66-afa1-dd72a4c43515

    How sweet 🙂 more on it here.

    Dynamic Blade Components

    Have you ever tried to render a component at runtime, well in a situation like this, Laravel introduces the dynamic-component component for just that?

    This component will be rendered based on the values or variable passed at runtime.

    <x-dynamic-component :component="$componentName" class="mt-4" />

    Laravel also introduces lots of cool new blade components you can simply reuse in your project with just a simple artisan command instead of creating from scratch.

    ALSO READ  Laravel one to one relationship with example

    You can explore all of it here.

    Tailwind Pagination Views

    Sad news for Bootstrap fans.

    Tailwind CSS is now the default style for Laravel 8 pagination.

    The main reason for choosing Tailwind is because of how highly customizable, a low-level CSS framework gives you all the building blocks you need to build designs.

    The good news for Bootstrap fans is that Bootstrap 3 and 4 views are still available,  you only have to switch.

    Time Testing Helpers

    Every developer has a thing about TDD or Testing generally.

    Like how will you be writing Code to Test your Code 🙂

    Anyways, Laravel tends to improve an important aspect of Testing with Date and Times.

    When writing test cases that involve the use of times and dates, Laravel 8 introduces new DateTime helpers in Laravel’s Test suite.

    
    public function testTimeCanBeManipulated()
    {
        // Travel into the future...
        $this->travel(5)->milliseconds();
        $this->travel(5)->seconds();
        $this->travel(5)->minutes();
        $this->travel(5)->hours();
        $this->travel(5)->days();
        $this->travel(5)->weeks();
        $this->travel(5)->years();
    
        // Travel into the past...
        $this->travel(-5)->hours();
    
        // Travel to an explicit time...
        $this->travelTo(now()->subHours(6));
    
        // Return back to the present time...
        $this->travelBack();
    }

    You can use the above methods to manipulate the current time while writing your tests in Laravel.

    Happy Testing 🙂

    Improvements to Artisan Serve

    Our famous artisan serve command has received some improvements in this version.

    Let’s look at what it is:

    The Artisan serve command has been improved to include hot reloading even when an environment variable change has been detected in your .env file.

    Event Listener Improvements

    Laravel now supports closure based event listeners.

    And can be registered by only passing the closure to the Event::listen method.

    use App\Events\SendPost;
    use Illuminate\Support\Facades\Event;
    
    Event::listen(function (SendPost $event) {
        //
    });

    You can also mark the Closure based listener as queueable like so:

    use App\Events\SendPost;
    use function Illuminate\Events\queueable;
    use Illuminate\Support\Facades\Event;
    
    Event::listen(queueable(function (SendPost $event) {
        //
    }));

    You can also customise it using these different methods below like other jobs:

    Event::listen(queueable(function (SendPost $event) {
        //
    })->onConnection('redis')->onQueue('posts')->delay(now()->addSeconds(10)));

    Final thoughts

    Laravel 8 is out and parked with all these amazing new features, you should try it out now.

    We have also discussed in detail what is new in Laravel 8 and Laravel 8 new features.

    Of course, there’re breaking changes, support policy, and semantic versioning, you might want to take a look at all here.

    Start Learning Backend Dev. Now

    Stop waiting and start learning! Get my 10 tips on teaching yourself backend development.

    Don't worry. I'll never, ever spam you!

    Sharing is caring :)

    Start Learning Now
    Learning for all. Savings for you. Courses from $11.99

    Comments

    Newsletter

    Get the latest Backend Dev. jobs, events and curated articles straight to your inbox, once a week

    Start Learning Now
    Learning for all. Savings for you. Courses from $11.99
    Top 6 Recent Posts
    Start Learning Now
    Learning for all. Savings for you. Courses from $11.99