What's New in Laravel 9 - Features & Updates
Tags: laravel, laravel9, php, webdev
Published: 2022-03-01 05:24:33

**Laravel v9** is scheduled to be released around September of 2021, but the Laravel Crew decided to push this release back to January of 2022. Now Laravel has been released on 8 February 2022. The new version of the Laravel framework has been shipped with a variety of robust features and updates. Laravel 9 continues the improvements made in Laravel 8 by introducing support for Symfony 6.0 components, Symfony Mailer, Flysystem 3.0, improved <code>route:list</code> output, a Laravel Scout database driver, new Eloquent <code>accessor/mutator</code> syntax, implicit route bindings via Enums, and a variety of other bug fixes and usability improvements. Laravel 9.x requires a minimum PHP version of 8.0 and Flysystem 3.x.

Laravel 9 is the subsequent long-term support version (LTS) and will accept bug fixes until February 2024 and security fixes until February 2025. Here are some of the significant features that I want to share with you.

## Flysystem 3.x
Laravel 9.x upgrades our upstream Flysystem dependency to Flysystem 3.x. Flysystem powers all of the filesystem interactions offered by the Storage facade.

## Improved Eloquent Accessors/Mutators
Improved Eloquent <code>accessors/mutators</code> was contributed by Taylor Otwell. Laravel 9.x provides a new way to define Eloquent accessors and mutators. In Laravel 9.x you can specify an accessor and mutator utilizing a single, non-prefixed method by type-hinting a return type of <code>Illuminate\Database\Eloquent\Casts\Attribute</code>:

```
use Illuminate\Database\Eloquent\Casts\Attribute;

public function name(): Attribute
{
    return new Attribute(
        get: fn ($value) => strtoupper($value),
        set: fn ($value) => $value,
    );
}
```


## Enum Eloquent Attribute Casting

Eloquent now allows you to cast your attribute values to PHP enums. To accomplish this, you may specify the attribute and enum you wish to cast in your model's $casts property array:

```
use App\Enums\ServerStatus;

/**
 * The attributes that should be cast.
 *
 * @var array
 */
protected $casts = [
    'status' => ServerStatus::class,
];
```

Once you have defined the cast on your model, the specified attribute will be automatically cast to and from an <code>enum</code> when you interact with the attribute:

```
if ($server->status == ServerStatus::provisioned) {
    $server->status = ServerStatus::ready;

    $server->save();
}
```

## Slot Name Shortcut

In previous releases of Laravel, slot names were provided using a name attribute on the x-slot tag:

```
<x-alert>
    <x-slot name="title">
        Server Error
    </x-slot>

    <strong>Whoops!</strong> Something went wrong!
</x-alert>
```

However, beginning in Laravel 9.x, you may specify the slot's name using a convenient, shorter syntax:

```
<x-slot:title>
    Server Error
</x-slot>
```

## Controller Route Groups
Now you can utilize the controller method to define the common controller for all of the routes within the group. Then, when defining the routes, you only need to provide the controller method that they invoke:

```
use App\Http\Controllers\OrderController;

Route::controller(OrderController::class)->group(function () {
    Route::get('/orders/{id}', 'show');
    Route::post('/orders', 'store');
});
```

## Laravel Scout Database Engine

If your application interacts with small to medium-sized databases or has a light workload, Now you can use Scout's "database" engine instead of a dedicated search service such as Algolia or MeiliSerach. The database engine will use where like clauses and full-text indexes when filtering results from your existing database to determine the applicable search results for your query.

## Improved Ignition Exception Page
Spatie Ignition open-source exception debug page has been redesigned from the ground up. The new, improved Ignition ships with Laravel 9.x and it includes light/dark themes, customizable "open in editor" functionality, and many more.

## Implicit Route Bindings With Enums
PHP 8.1 introduces support for Enums. Laravel 9.x presents the ability to type-hint an Enum on your route definition and Laravel will only invoke the route if that route segment is a valid Enum value in the URI. Otherwise, an HTTP <code>404</code> response will be returned automatically. For example, given the following Enum:

```
enum Category: string
{
    case Fruits = 'fruits';
    case People = 'people';
}
```

Now, You can define a route that will only be invoked if the <code>{category}</code> route segment is fruits or people. Otherwise, an HTTP <code>404</code> response will be returned:

```
Route::get('/categories/{category}', function (Category $category) {
    return $category->value;
});
```

Above are some main features and updates of Laravel 9.x, If you want to explore more about Laravel 9, you can visit this [link](https://laravel.com/docs/9.x/releases).

For More News & Updates, Follow me on [Twitter/iamSumyyaKhan](https://twitter.com/iamSumyyaKhan).