> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# June 2026 Laravel Updates

> Laravel ecosystem updates for June 2026, including Bus::bulk(), Postgres transaction poolers, MCP tools, artisan dev, and route metadata.

In June 2026, Laravel Cloud added Symfony application support and Forge introduced managed Valkey and object storage. The framework gained bulk job dispatch, Postgres pooler support, MCP client and server tools, and more.

Source: [Laravel June Product Updates](https://laravel.com/blog/laravel-june-product-updates)

***

## Laravel Framework

### Bus::bulk() — bulk job dispatch

`Bus::bulk()` inserts large groups of jobs with one database INSERT per queue and connection, eliminating the overhead of inserting each job separately.

```php theme={null}
use Illuminate\Support\Facades\Bus;

Bus::bulk([
    new ProcessOrder($order1),
    new ProcessOrder($order2),
    new ProcessOrder($order3),
    // Efficient even with thousands of jobs.
]);
```

### Postgres transaction pooler support

Laravel now supports transaction-mode Postgres connection poolers such as PgBouncer, AWS RDS Proxy, and Neon at the framework level.

```php theme={null}
'pgsql' => [
    'driver' => 'pgsql',
    'pooled' => true,
    // ...
],
```

<Info>
  Append `::direct` to the connection name to bypass the pooler for schema operations and DDL statements: `DB::connection('pgsql::direct')->statement('CREATE INDEX ...')`.
</Info>

Laravel automatically handles emulated prepares, Boolean binding, and other requirements of pooled connections.

### MCP client and server tools

Laravel AI agents can use tools from remote MCP servers over HTTP and from local MCP server classes. Schema conversion, wrapping, and invocation are automatic.

```php theme={null}
class MyAgent extends Agent
{
    public function tools(): array
    {
        return [
            McpClient::tools('https://mcp.example.com'),
            McpServer::tools(MyMcpServer::class),
        ];
    }
}
```

### artisan dev

The new `artisan dev` command runs the development server, queue worker, log tailing, and Vite together with color-coded output.

```bash theme={null}
php artisan dev
```

```php theme={null}
use Illuminate\Foundation\Console\DevCommands;

DevCommands::artisan('reverb:start', 'reverb')->orange();
DevCommands::register('stripe listen --forward-to ' . config('app.url'))->green();
```

<Tip>
  The command automatically detects npm, Yarn, pnpm, or Bun and provides an official Artisan convention to replace the traditional `composer dev` script.
</Tip>

### Route metadata

Attach arbitrary metadata to routes with `->metadata()`. Metadata is compatible with route caching, and group metadata is merged into child routes.

```php theme={null}
Route::metadata(['head' => ['robots' => ['noindex'], 'author' => 'Taylor']])
    ->group(function () {
        Route::get('/users', [UserController::class, 'index'])
            ->metadata(['head' => ['title' => 'Users']]);
    });

$request->route()->getMetadata('head.title');
$request->route()->getMetadata('head.author', 'Taylor');
```

### Non-retryable exception handlers

Prevent retries for invalid input and other permanent failures either on the exception itself or in `bootstrap/app.php`.

```php theme={null}
class InvalidInputException extends RuntimeException
{
    public function retry(): bool
    {
        return false;
    }
}

->withExceptions(function (Exceptions $exceptions) {
    $exceptions->dontRetry(InvalidInputException::class);
})
```

### schema:dump without migration data

Generate a structure-only dump without migration table rows:

```bash theme={null}
php artisan schema:dump --without-migration-data
```

### Timezone fix for between() and unlessBetween()

Schedules now use the correct timezone regardless of whether `timezone()` is called before or after `between()` or `unlessBetween()`.

```php theme={null}
$schedule->command('foo')->timezone('Europe/Rome')->between('10:00', '12:00');
$schedule->command('foo')->between('10:00', '12:00')->timezone('Europe/Rome');
```

### Other framework changes

* Queue attributes can be defined on traits used with `Bus::bulk()`
* MariaDB vector indexes are supported
* `attachFromStorage()` adds notification attachments from storage
* `Cache::rememberWithState()` provides stateful caching
* The `array` maintenance driver isolates state during parallel tests
* `whenFilledEnum()` conditionally handles enum-backed fields
* JSON Schema validation supports `anyOf`

***

## Inertia

* **`Client\Request::uri()`:** retrieves the client request URI
* **`target` on links:** supports values such as `target="_blank"`
* **Async forms:** the form component supports asynchronous submission
* **Page data in `titleCallback`:** title callbacks receive the current page

***

## Laravel Cloud and Laravel Forge

| Product           | Key updates                                                                                                                          |
| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| **Laravel Cloud** | Symfony 7.4 LTS and 8.x support on PHP 8.2–8.5, Stripe Projects deployment and billing, and per-member Slack and email notifications |
| **Laravel Forge** | Managed Valkey cache, managed object storage, and redesigned notification emails                                                     |
