PHPackages                             phpsoftbox/request - 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/request

ActiveLibrary[Framework](/categories/framework)

phpsoftbox/request
==================

Request component for the PhpSoftBox framework

0101↓81.3%PHP

Since Jun 17Pushed 2w agoCompare

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

READMEChangelogDependenciesVersions (1)Used By (0)

Request
=======

[](#request)

About
-----

[](#about)

`phpsoftbox/request` — тонкая оболочка над PSR‑7 запросом с удобными методами доступа к данным и встроенной валидацией через `phpsoftbox/validator`.

Ключевые возможности:

- единый доступ к query/body/cookies/files/attributes;
- валидация через `Request::validate()`, `RequestSchema` и `ApiSchema`;
- доступ к оригинальному PSR‑7 запросу через `psr()`.

Quick Start
-----------

[](#quick-start)

```
use PhpSoftBox\Request\Request;
use PhpSoftBox\Validator\Validator;

$request = new Request($psrRequest, new Validator());

$data = $request->validate([
    'email' => [
        new \PhpSoftBox\Validator\Rule\PresentValidation(),
        new \PhpSoftBox\Validator\Rule\FilledValidation(),
        (new \PhpSoftBox\Validator\Rule\StringValidation())->email(),
    ],
]);
```

RequestSchema
-------------

[](#requestschema)

Если удобнее держать правила в классе:

```
use PhpSoftBox\Request\RequestSchema;
use PhpSoftBox\Validator\Rule\FilledValidation;
use PhpSoftBox\Validator\Rule\PresentValidation;
use PhpSoftBox\Validator\Rule\StringValidation;

final class LoginRequest extends RequestSchema
{
    public function rules(): array
    {
        return [
            'login' => [new PresentValidation(), new FilledValidation(), new StringValidation()],
            'password' => [new PresentValidation(), new FilledValidation(), new StringValidation()],
        ];
    }
}
```

Далее в контроллере:

```
$schema = new LoginRequest($request);
$data = $schema->validate();
```

Внутри `RequestSchema` можно читать параметры текущего маршрута через helper `route()`:

- `$this->route()->has('param')` — проверит, передан ли route-параметр;
- `$this->route()->get('param', $default)` — вернет route-параметр или default;
- `$this->route()->require('param')` — вернет route-параметр или выбросит `MissingRouteParameterException`;
- `$this->route()->entity('param', Entity::class)` — вернет resolved entity или выбросит `UnexpectedRouteParameterException`;
- `$this->route()->entityOrNull('param', Entity::class)` — вернет resolved entity или null, если route-параметра нет;
- `$this->route()->key('param')` — вернет обязательный route key как `int|string`.

`entity()` нужен, когда схема зависит от текущего route-ресурса:

```
if ($this->route()->has('product')) {
    $product = $this->route()->entity('product', Product::class);

    if ($product->archived) {
        // rules for archived product update
    }
}
```

`key()` принимает сырой route key или resolved entity. Для entity класс проверяется через `instanceof`, а ключ берется через явный extractor. Если entity реализует ORM `EntityInterface`, extractor можно не передавать: будет использован `id()`.

```
final class ShipmentProductsRequest extends RequestSchema
{
    public function rules(): array
    {
        return [
            'product_ids' => [
                ExistsValidation::make()
                    ->table('shipment_products')
                    ->column('product_id')
                    ->where('shipment_id', $this->route()->key('shipment', Shipment::class))
                    ->all(),
            ],
        ];
    }
}
```

Для кастомного объекта или нестандартного ключа передайте extractor. Если route-параметр остался сырым scalar key, extractor не вызывается:

```
$this->route()->key('shipment', Shipment::class, static fn (Shipment $shipment): int => $shipment->id());
$this->route()->key('product');
```

### PhpStorm meta

[](#phpstorm-meta)

Если PhpStorm не выводит тип `entity()` / `entityOrNull()` из PHPDoc `@template`, можно добавить в корень проекта `.phpstorm.meta.php`:

```
