PHPackages                             phpsoftbox/inertia - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Framework](/categories/framework)
4. /
5. phpsoftbox/inertia

ActiveLibrary[Framework](/categories/framework)

phpsoftbox/inertia
==================

Inertia.js adapter for the PhpSoftBox framework

086↓90.5%PHP

Since Jun 17Pushed 3w agoCompare

[ Source](https://github.com/phpsoftbox/inertia)[ Packagist](https://packagist.org/packages/phpsoftbox/inertia)[ RSS](/packages/phpsoftbox-inertia/feed)WikiDiscussions master Synced yesterday

READMEChangelogDependenciesVersions (1)Used By (0)

Inertia
=======

[](#inertia)

Минимальный серверный адаптер Inertia.js для PhpSoftBox.

Возможности
-----------

[](#возможности)

- JSON‑ответы по `X-Inertia`.
- HTML‑ответы с root‑view для первого захода.
- Middleware для проверки версии ассетов и заголовка `Vary: X-Inertia`.
- Partial reload по `X-Inertia-Partial-*` headers.

Пример
------

[](#пример)

```
$response = $inertia->render('Home', [
    'title' => 'Inertia App',
]);
```

Partial reload
--------------

[](#partial-reload)

Компонент поддерживает partial reload на уровне top-level props. Фильтрация включается только для Inertia request, если `X-Inertia-Partial-Component` совпадает с компонентом, который рендерится.

Поддерживаемые headers:

- `X-Inertia-Partial-Data` — comma-separated список props, которые нужно вернуть;
- `X-Inertia-Partial-Except` — comma-separated список props, которые нужно исключить.

Если клиент отправил оба headers, `X-Inertia-Partial-Except` имеет приоритет. Для `X-Inertia-Partial-Data` page props фильтруются до вычисления closures, поэтому незапрошенные тяжелые props не будут вычисляться.

Метаданные страницы
-------------------

[](#метаданные-страницы)

Можно задавать `title`, `description`, `keywords` через сервис `PageMeta`. Данные попадут в `props.meta` и в HTML‑теги на первом рендере.

```
use PhpSoftBox\Inertia\Page\PageMeta;

$meta->setTitle('Панель управления')
    ->setDescription('Админ‑панель проекта')
    ->setKeywords(['admin', 'dashboard']);

return $inertia->render('Dashboard');
```

Breadcrumbs
-----------

[](#breadcrumbs)

```
use PhpSoftBox\Inertia\Page\Breadcrumbs;

$breadcrumbs
    ->add('Главная', '/')
    ->add('Пользователи', '/users')
    ->add('Профиль', null, true);

return $inertia->render('Users/Show');
```

Menu
----

[](#menu)

```
use PhpSoftBox\Inertia\Page\Menu;
use PhpSoftBox\Inertia\Page\MenuItem;
use PhpSoftBox\Inertia\Page\MenuMatchMode;

$menu = new Menu();
$menu->add(
    (new MenuItem('Dashboard', '/', 'dashboard', 'dashboard'))
        ->withMatchMode(MenuMatchMode::EQUALS),
);

$menu->add(
    (new MenuItem('Промо', null, 'promo', 'promo'))
        ->setChildren([
            new MenuItem('Промокоды', '/promo/promocodes', 'promocode', 'promocode'),
        ]),
);
```

Tabs
----

[](#tabs)

```
use PhpSoftBox\Inertia\Page\Tabs;

$tabs
    ->setActiveKey('profile')
    ->add('Профиль', 'profile', '/profile')
    ->add('Пароль', 'password', '/profile/password');

return $inertia->render('Profile/Show');
```

SSR
---

[](#ssr)

SSR опционален и выключен по умолчанию. Для интеграции можно использовать встроенный HTTP renderer или свой рендерер, реализующий `SsrRendererInterface`.

```
use PhpSoftBox\Inertia\Ssr\HttpSsrRenderer;

$renderer = new HttpSsrRenderer(
    url: 'http://node:13714/render',
    timeout: 2.0,
);
```

`HttpSsrRenderer` отправляет `InertiaPage` JSON POST-запросом на SSR endpoint и ожидает ответ формата `['head' => string[], 'body' => string]`. По умолчанию renderer работает в fail-open режиме: если SSR endpoint недоступен, он вернёт `null`, и Inertia отдаст обычный HTML shell.

Для строгого режима передайте `failSilently: false`.

В конфиге Inertia:

```
use PhpSoftBox\Inertia\Area\InertiaAreaConfig;

return [
    'ssr' => env('INERTIA_SSR', false),

    'areas' => [
        'default' => 'web',

        'web' => new InertiaAreaConfig(
            pathPrefixes: ['/'],
            ssr: true,
            shared: [
                'app' => [
                    'area' => 'web',
                ],
            ],
        ),

        'admin' => new InertiaAreaConfig(
            pathPrefixes: ['/admin'],
            ssr: false,
            shared: [
                'app' => [
                    'area' => 'admin',
                ],
            ],
        ),
    ],
];
```

Если SSR включён и доступен, view получает переменную `$ssr`: `['head' => string[], 'body' => string]`. Дефолтный view в AppBackend уже умеет вставлять эти данные.

### Areas

[](#areas)

Areas позволяют централизованно разделять публичную часть, админку, кабинет или tenant‑области по host/path и задавать для них свои Inertia-настройки.

`InertiaAreaConfig` поддерживает:

- `hosts` — список host или URL, например `admin.example.local`;
- `paths` — точные пути;
- `pathPrefixes` — префиксы путей, где более длинный prefix приоритетнее;
- `ssr` — `true`, `false` или `null`, если нужно использовать базовую настройку;
- `shared` — area-specific props.

### Host-based areas

[](#host-based-areas)

Для разделения публичной части и админки по доменам настройте areas через `hosts`. Это удобнее, чем path-prefix, если приложение живёт на нескольких поддоменах:

```
use PhpSoftBox\Inertia\Area\InertiaAreaConfig;

return [
    'areas' => [
        'default' => 'web',

        'web' => new InertiaAreaConfig(
            hosts: ['www.example.com', 'docs.example.com'],
            shared: [
                'app' => [
                    'area' => 'web',
                ],
            ],
        ),

        'admin' => new InertiaAreaConfig(
            hosts: ['admin.example.com'],
            ssr: false,
            shared: [
                'app' => [
                    'area' => 'admin',
                ],
            ],
        ),
    ],
];
```

Доступ к такой area лучше защищать отдельным auth middleware, например `AreaAccessMiddleware` из `phpsoftbox/auth`, с тем же именем area:

```
use PhpSoftBox\Auth\Middleware\AreaAccessDeniedMode;
use PhpSoftBox\Auth\Middleware\AreaAccessRule;

new AreaAccessRule(
    area: 'admin',
    permission: 'admin.access',
    deniedMode: AreaAccessDeniedMode::NotFound,
)
```

Area-specific shared-data можно расширять отдельными провайдерами:

```
use PhpSoftBox\Inertia\Area\AreaSharedDataProviderInterface;

final class AdminSharedDataProvider implements AreaSharedDataProviderInterface
{
    public function area(): string
    {
        return 'admin';
    }

    public function share(ServerRequestInterface $request): array
    {
        return [
            'admin' => [
                'sidebar' => [],
            ],
        ];
    }
}
```

`shared` из `InertiaAreaConfig` и данные из `AreaSharedDataProviderInterface`объединяются рекурсивно. Provider применяется позже и поэтому может дополнить или переопределить значения из конфига.

```
'admin' => new InertiaAreaConfig(
    pathPrefixes: ['/admin'],
    ssr: false,
    shared: [
        'app' => [
            'area' => 'admin',
            'name' => 'Admin Panel',
        ],
    ],
),
```

```
final class AdminSharedDataProvider implements AreaSharedDataProviderInterface
{
    public function area(): string
    {
        return 'admin';
    }

    public function share(ServerRequestInterface $request): array
    {
        return [
            'app' => [
                'theme' => 'compact',
            ],
            'admin' => [
                'sidebar' => [],
            ],
        ];
    }
}
```

Итоговые props будут содержать:

```
[
    'app' => [
        'area' => 'admin',
        'name' => 'Admin Panel',
        'theme' => 'compact',
    ],
    'admin' => [
        'sidebar' => [],
    ],
]
```

Если provider вернёт уже существующий ключ, он заменит значение из конфига:

```
return [
    'app' => [
        'name' => 'Runtime Admin',
    ],
];
```

В этом случае итоговое `app.name` будет `Runtime Admin`.

###  Health Score

23

—

LowBetter than 26% of packages

Maintenance62

Regular maintenance activity

Popularity12

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity11

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

### Community

Maintainers

![](https://www.gravatar.com/avatar/0279d150240c97d210034878b0467462246dc14d29b5618157ff6a8be49a50e3?d=identicon)[inspector-who](/maintainers/inspector-who)

---

Top Contributors

[![inspector-who](https://avatars.githubusercontent.com/u/6973963?v=4)](https://github.com/inspector-who "inspector-who (1 commits)")

### Embed Badge

![Health badge](/badges/phpsoftbox-inertia/health.svg)

```
[![Health](https://phpackages.com/badges/phpsoftbox-inertia/health.svg)](https://phpackages.com/packages/phpsoftbox-inertia)
```

###  Alternatives

[laravel/dusk

Laravel Dusk provides simple end-to-end testing and browser automation.

1.9k39.6M298](/packages/laravel-dusk)[nineinchnick/edatatables

Grid widget for the Yii Framework, wrapper for the DataTables jQuery plugin

173.2k](/packages/nineinchnick-edatatables)[link-cloud/fast-hyperf

LinkCloud Fast Hyperf

241.2k1](/packages/link-cloud-fast-hyperf)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
