Filament v4 Unified Schema API: Forms &amp; Infolists | Mohamed Said        [  ![Mohamed Said](https://cdn.msaied.com/01KT78WE565VEMM3PSNQAAB0MH.png)   Mohamed Said Laravel Backend Engineer  ](https://www.msaied.com) [ Home ](https://www.msaied.com) [ Projects ](https://www.msaied.com/projects) [ Articles  ](https://www.msaied.com/articles) [ Certificates ](https://www.msaied.com/certificates) [ Contact ](https://www.msaied.com#contact-section) 

       [  ](https://github.com/EG-Mohamed)       

 [ Home ](https://www.msaied.com) [ Projects ](https://www.msaied.com/projects) [ Articles ](https://www.msaied.com/articles) [ Certificates ](https://www.msaied.com/certificates) [ Contact ](https://www.msaied.com#contact-section) 

  [ home ](https://www.msaied.com)    [ articles ](https://www.msaied.com/articles)    Filament v4 Schema-Based Forms, Infolists, and the Unified Schema API        On this page       1. [  Why Filament v4 Rewrote the Component Model ](#why-filament-v4-rewrote-the-component-model)
2. [  The Schema Component Tree ](#the-schema-component-tree)
3. [  Extracting a Shared Schema Method ](#extracting-a-shared-schema-method)
4. [  Schema Components in Custom Pages and Widgets ](#schema-components-in-custom-pages-and-widgets)
5. [  What Actually Breaks When Upgrading ](#what-actually-breaks-when-upgrading)
6. [  Namespace changes ](#namespace-changes)
7. [  -&gt;columns() on Section ](#code-gtcolumnscode-on-codesectioncode)
8. [  Custom field getChildComponents() ](#custom-field-codegetchildcomponentscode)
9. [  Takeaways ](#takeaways)

  ![Filament v4 Schema-Based Forms, Infolists, and the Unified Schema API](https://cdn.msaied.com/360/11c59afcba98933101f65c6357f5cd1c.png)

  #filament   #laravel   #filament-v4   #admin-panel  

 Filament v4 Schema-Based Forms, Infolists, and the Unified Schema API 
=======================================================================

     4 Jul 2026      3 min read    ![Mohamed Said](https://cdn.msaied.com/01KT78WE565VEMM3PSNQAAB0MJ.jpg)  Mohamed Said  

       Table of contents

  9 sections  

1. [  01   Why Filament v4 Rewrote the Component Model  ](#why-filament-v4-rewrote-the-component-model)
2. [  02   The Schema Component Tree  ](#the-schema-component-tree)
3. [  03   Extracting a Shared Schema Method  ](#extracting-a-shared-schema-method)
4. [  04   Schema Components in Custom Pages and Widgets  ](#schema-components-in-custom-pages-and-widgets)
5. [  05   What Actually Breaks When Upgrading  ](#what-actually-breaks-when-upgrading)
6. [  06   Namespace changes  ](#namespace-changes)
7. [  07   -&gt;columns() on Section  ](#code-gtcolumnscode-on-codesectioncode)
8. [  08   Custom field getChildComponents()  ](#custom-field-codegetchildcomponentscode)
9. [  09   Takeaways  ](#takeaways)

       Why Filament v4 Rewrote the Component Model
-------------------------------------------

In Filament v3 you maintained two parallel trees: `form(Form $form)` returned `$form->schema([...])` and `infolist(Infolist $infolist)` returned `$infolist->schema([...])`. The components were different classes even when they displayed the same data — a `TextInput` for editing, a `TextEntry` for viewing. Filament v4 collapses this into a **unified Schema API** where a single component tree can render in both contexts, and dedicated entry components are first-class citizens alongside field components.

---

The Schema Component Tree
-------------------------

Every layout wrapper — `Section`, `Grid`, `Tabs`, `Fieldset` — now lives under `Filament\Schemas\Components\` and is shared between forms and infolists. You import them once and use them everywhere.

```php
use Filament\Schemas\Components\Section;
use Filament\Schemas\Components\Grid;
use Filament\Forms\Components\TextInput;
use Filament\Infolists\Components\TextEntry;

public static function form(Form $form): Form
{
    return $form->schema([
        Section::make('Identity')
            ->schema([
                Grid::make(2)->schema([
                    TextInput::make('name')->required(),
                    TextInput::make('email')->email()->required(),
                ]),
            ]),
    ]);
}

public static function infolist(Infolist $infolist): Infolist
{
    return $infolist->schema([
        Section::make('Identity')
            ->schema([
                Grid::make(2)->schema([
                    TextEntry::make('name'),
                    TextEntry::make('email'),
                ]),
            ]),
    ]);
}

```

The `Section` and `Grid` imports are identical. Only the leaf components differ.

---

Extracting a Shared Schema Method
---------------------------------

Because layout wrappers are now the same class, you can extract the skeleton into a static helper and swap only the leaves.

```php
private static function identitySchema(array $fields): array
{
    return [
        Section::make('Identity')
            ->schema([
                Grid::make(2)->schema($fields),
            ]),
    ];
}

public static function form(Form $form): Form
{
    return $form->schema(self::identitySchema([
        TextInput::make('name')->required(),
        TextInput::make('email')->email()->required(),
    ]));
}

public static function infolist(Infolist $infolist): Infolist
{
    return $infolist->schema(self::identitySchema([
        TextEntry::make('name'),
        TextEntry::make('email'),
    ]));
}

```

This pattern eliminates the structural duplication that plagued v3 resources with large schemas.

---

Schema Components in Custom Pages and Widgets
---------------------------------------------

Custom pages that previously called `$this->form->fill()` now use `HasForms` or `HasInfolists` traits alongside the schema builder. The `$this->form(...)` and `$this->infolist(...)` calls accept the same unified component classes.

```php
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Schemas\Components\Section;

class EditProfilePage extends Page
{
    use InteractsWithForms;

    public function form(Form $form): Form
    {
        return $form
            ->schema([
                Section::make()->schema([
                    TextInput::make('bio')->columnSpanFull(),
                ]),
            ])
            ->statePath('data');
    }
}

```

---

What Actually Breaks When Upgrading
-----------------------------------

### Namespace changes

Any import of `Filament\Forms\Components\Section` or `Filament\Forms\Components\Grid` must move to `Filament\Schemas\Components\`. A project-wide find-and-replace handles most of it.

### `->columns()` on `Section`

In v3 you called `->columns(2)` on `Section` directly. In v4 you wrap children in `Grid::make(2)` instead. The old shorthand still works as a compatibility shim in early v4 releases, but the canonical approach is explicit `Grid`.

### Custom field `getChildComponents()`

If you built custom layout components by extending `Filament\Forms\Components\Component`, the base class has moved. Extend `Filament\Schemas\Components\Component` instead and implement `getChildComponents()` as before.

---

Takeaways
---------

- Layout components (`Section`, `Grid`, `Tabs`) are now shared across forms and infolists under `Filament\Schemas\Components\`.
- Leaf components (`TextInput`, `TextEntry`) remain context-specific but sit inside the same tree.
- Extracting a shared schema skeleton method removes structural duplication across `form()` and `infolist()`.
- The main upgrade cost is namespace replacement and swapping `->columns()` shortcuts for explicit `Grid` wrappers.
- Custom layout components must extend the new base class in `Filament\Schemas\Components\`.

 Found this useful?

          [  ](https://twitter.com/intent/tweet?url=https%3A%2F%2Fwww.msaied.com%2Farticles%2Ffilament-v4-schema-based-forms-infolists-and-the-unified-schema-api-2&text=Filament+v4+Schema-Based+Forms%2C+Infolists%2C+and+the+Unified+Schema+API) [  ](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fwww.msaied.com%2Farticles%2Ffilament-v4-schema-based-forms-infolists-and-the-unified-schema-api-2) 

 Frequently Asked Questions 
----------------------------

  3 questions  

     Q01  Can I use a single component for both editing and viewing in Filament v4?        Not for leaf components — TextInput is still edit-only and TextEntry is view-only. The unification applies to layout wrappers like Section and Grid, which are now the same class in both contexts. 

      Q02  Do I need to update every resource immediately after upgrading to Filament v4?        Filament v4 ships compatibility shims for the most common v3 form namespace imports, so many resources continue to work. However, the shims are not guaranteed across minor releases, so migrating namespaces early is strongly recommended. 

      Q03  Where should custom layout components extend from in Filament v4?        Extend Filament\Schemas\Components\Component instead of the old Filament\Forms\Components\Component. The API for getChildComponents() and childComponents() remains the same. 

  Continue reading

 More Articles 
---------------

 [ View all    ](https://www.msaied.com/articles) 

 [ ![DDD Value Objects and DTOs in Laravel Without the Bloat](https://cdn.msaied.com/450/41688537085b86f102fd8c219a35319f.png) laravel ddd php 

### DDD Value Objects and DTOs in Laravel Without the Bloat

Learn how to implement domain-driven value objects and data transfer objects in Laravel using PHP 8.3 readonly...

  ![Mohamed Said](https://cdn.msaied.com/01KT78WE565VEMM3PSNQAAB0MJ.jpg)  Mohamed Said 

 21 Jul 2026     1 min read  

  Read    

 ](https://www.msaied.com/articles/ddd-value-objects-and-dtos-in-laravel-without-the-bloat) [ ![Laravel + Python FastAPI: Image OCR Demo](https://cdn.msaied.com/447/5f3d87146fbf19957973cbc88c6c0155.png) Laravel Python FastAPI 

### Laravel + Python FastAPI: Image OCR Demo

Learn how to call a Python image OCR script from Laravel using FastAPI as the bridge. This premium tutorial wa...

  ![Mohamed Said](https://cdn.msaied.com/01KT78WE565VEMM3PSNQAAB0MJ.jpg)  Mohamed Said 

 20 Jul 2026     3 min read  

  Read    

 ](https://www.msaied.com/articles/laravel-python-fastapi-image-ocr-demo) [ ![Scaffold Laravel Packages with the `laravel package` Command in Installer v5.31.0](https://cdn.msaied.com/449/522e744d3c7bae1f214c179a83ae5b88.png) Laravel Installer Package Development CLI 

### Scaffold Laravel Packages with the `laravel package` Command in Installer v5.31.0

Laravel Installer v5.31.0 introduces a `laravel package` command to scaffold packages from the CLI, automated...

  ![Mohamed Said](https://cdn.msaied.com/01KT78WE565VEMM3PSNQAAB0MJ.jpg)  Mohamed Said 

 20 Jul 2026     3 min read  

  Read    

 ](https://www.msaied.com/articles/scaffold-laravel-packages-with-the-laravel-package-command-in-installer-v5310) 

   [  ![Mohamed Said](https://cdn.msaied.com/01KT78WE565VEMM3PSNQAAB0MH.png)   Mohamed Said Laravel Backend Engineer  ](https://www.msaied.com)Senior Backend Engineer specializing in Laravel, scalable SaaS platforms, APIs, and cloud infrastructure. I build secure, high-performance web applications that help businesses grow.

Explore

- [Home](https://www.msaied.com)
- [Projects](https://www.msaied.com/projects)
- [Articles](https://www.msaied.com/articles)
- [Certificates](https://www.msaied.com/certificates)
- [Contact](https://www.msaied.com#contact-section)

Connect

- [   hello@msaied.com ](mailto:hello@msaied.com)
- [   +20 109 461 9204 ](tel:+201094619204)

© 2026 Mohamed Said. All rights reserved.

 [  ](https://github.com/EG-Mohamed) [  ](https://www.linkedin.com/in/msaiedm/) [  ](https://wa.me/201094619204) [  ](mailto:hello@msaied.com) [  ](https://drive.google.com/file/u/0/d/1MF20IPRJyzfy32mhEutjL5EpSls0w2Q8/view)
