Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/guide/ru/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
- [Compare](built-in-rules-compare.md)
- [Composite](built-in-rules-composite.md)
- [Each](built-in-rules-each.md)
- [File](built-in-rules-file.md)
- [Nested](built-in-rules-nested.md)
- [Required](built-in-rules-required.md)
- [StopOnError](built-in-rules-stop-on-error.md)
Expand Down
126 changes: 68 additions & 58 deletions docs/guide/ru/built-in-rules-callback.md
Original file line number Diff line number Diff line change
@@ -1,23 +1,26 @@
# `Callback` - a wrapper around `callable`
# `Callback` - обертка вокруг `вызываемого выражения`

This rule allows validation of the current property value (but not limited to it) with an arbitrary condition within a
callable. The benefit is that there is no need to create a separate custom
rule and handler.
Это правило позволяет проверять текущее значение свойства (но не только его) с помощью произвольного условия внутри

A condition can be within:
вызываемой функции. Преимущество заключается в том, что нет необходимости
создавать отдельное пользовательское правило и обработчик.

- Standalone callable function.
- Callable class.
- DTO (data transfer object) method.
Условие может находиться в:

The downside of using standalone functions and DTO methods is a lack of
reusability. So they are mainly useful for some specific non-repetitive
conditions. Reusability can be achieved with callable classes, but depending
on other factors (the need for additional parameters for example), it might
be a good idea to create a full-fledged [custom
rule](creating-custom-rules.md) with a separate handler instead.
- Отдельная вызываемая функция.
- Вызываемый класс.
- Метод DTO (объекта передачи данных).

The callback function signature is the following:
Недостатком использования отдельных функций и методов DTO является
отсутствие возможности повторного использования. Поэтому они в основном
полезны в определенных не повторяющихся конкретных ситуациях. Повторное
использование можно обеспечить с помощью вызываемых классов, но в
зависимости от других факторов (например, необходимости дополнительных
параметров) может оказаться целесообразным вместо этого создать полноценное
[пользовательское правило](creating-custom-rules.md) с отдельным
обработчиком.

Сигнатура функции обратного вызова выглядит следующим образом:

```php
use Yiisoft\Validator\Result;
Expand All @@ -29,14 +32,15 @@ function (mixed $value, Callback $rule, ValidationContext $context): Result;

где:

- `$value` is the validated value;
- `$rule` is a reference to the original `Callback` rule;
- `$value` проверяемое значение;
- `$rule` это ссылка на исходное `Callback` правило;
- `$context` контекст валидации;
- returned value is a validation result instance with or without errors.
- возвращаемое значение представляет собой экземпляр результата проверки,
содержащий или не содержащий ошибки.

## Using as a function
## Использование как функции

An example of passing a standalone callable function to a `Callback` rule:
Пример передачи вызываемой функции в правило `Callback`:

```php
use Yiisoft\Validator\Result;
Expand All @@ -45,21 +49,22 @@ use Yiisoft\Validator\ValidationContext;

new Callback(
static function (mixed $value, Callback $rule, ValidationContext $context): Result {
// The actual validation code.
// Фактический код проверки.

return new Result();
},
);
```

## Examples
## Примеры

### Value validation
### Проверка значения

`Callback` rule can be used to add validation missing in built-in rules for
a single property's value. Below is the example verifying that a value is a
valid [YAML](https://en.wikipedia.org/wiki/YAML) string (additionally
requires `yaml` PHP extension):
Правило `Callback` можно использовать для добавления проверки, отсутствующей
во встроенных правилах, для значения одного свойства. Ниже приведен пример,
подтверждающий, что значение является допустимой строкой
[YAML](https://en.wikipedia.org/wiki/YAML) (дополнительно требуется `yaml`
модуль для PHP):

```php
use Exception;
Expand Down Expand Up @@ -89,13 +94,13 @@ new Callback(
);
```

> **Note:** Processing untrusted user input with `yaml_parse()` can be dangerous with certain settings. Please refer to
> [`yaml_parse()` docs](https://www.php.net/manual/en/function.yaml-parse.php) for more details.
> **Примечание:** Обработка непроверенного пользовательского ввода с помощью `yaml_parse()` может быть опасной при определенных настройках.
> Для получения более подробной информации обратитесь к [документации `yaml_parse()`](https://www.php.net/manual/en/function.yaml-parse.php).

### Usage of validation context for validating multiple properties depending on each other
### Использование контекста валидации для проверки нескольких свойств, зависящих друг от друга

In the example below, the 3 angles are validated as degrees to form a valid
triangle:
В приведенном ниже примере три угла проверяются на соответствие
градусам,чтобы сформировался корректный треугольник:

```php
use Yiisoft\Validator\Result;
Expand Down Expand Up @@ -139,10 +144,10 @@ $rules = [
];
```

### Replacing boilerplate code with separate rules and `when`
### Замена шаблонного кода отдельными правилами и `when`

However, some cases of using validation context can lead to boilerplate
code:
Однако в некоторых случаях использование контекста валидации может привести
к появлению шаблонного кода:

```php
use Yiisoft\Validator\Result;
Expand Down Expand Up @@ -171,8 +176,9 @@ static function (mixed $value, Callback $rule, ValidationContext $context): Resu
};
```

They can be rewritten using multiple rules and conditional validation making
code more intuitive. We can use built-in rules where possible:
Их можно переписать, используя несколько правил и условную проверку, что
сделает код более интуитивно понятным. Можно использовать встроенные правила
там где это возможно:

```php
use Yiisoft\Validator\Rule\BooleanValue;
Expand All @@ -191,11 +197,12 @@ $rules = [
];
```

## Using as an object's method
## Использование в качестве метода объекта

### For property
### Для свойства

When using as a PHP attribute, set an object's method as a callback instead:
При использовании в качестве PHP-атрибута установите метод объекта в
качестве функции обратного вызова:

```php
use Exception;
Expand Down Expand Up @@ -232,17 +239,17 @@ final class Config {
}
```

The signature is the same as in a regular function. Note that there are no
restrictions on visibility levels and static modifiers, all of them can be
used (`public`, `protected`, `private`, `static`).
Сигнатура такая же, как и в обычной функции. Обратите внимание, что
ограничений на уровни видимости и статические модификаторы нет, все они
могут быть использованы (`public`, `protected`, `private`, `static`).

Using a `callback` argument instead of `method` with PHP attributes is
prohibited due to current PHP language restrictions (a callback can't be
inside a PHP attribute).
Использование аргумента `callback` вместо `method` с PHP-атрибутами
запрещено из-за текущих ограничений языка PHP (функция обратного вызова не
может находиться внутри PHP-атрибута).

### For the whole object
### Для всего объекта

It's also possible to check the whole object:
Также можно проверить весь объект:

```php
use Exception;
Expand Down Expand Up @@ -279,11 +286,12 @@ final class Config {
}
```

Note the use of property value (`$this->yaml`) instead of method argument (`$value`).
Обратите внимание на использование значения свойства ($this->yaml) вместо аргумента метода ($value).

## Using a callable class
## Использование вызываемого класса

A class that implements `__invoke()` can also be used as a callable:
Класс, реализующий метод `__invoke()`, также можно использовать как
вызываемый объект (callable):

```php
use Exception;
Expand Down Expand Up @@ -316,9 +324,10 @@ final class YamlCallback
}
```

The signature is the same as in a regular function.
Сигнатура такая же, как и в обычной функции.

Using in rules (note that a new instance must be passed, not a class name):
Использование в правилах (обратите внимание, что необходимо передать
экземпляр, а не имя класса):

```php
use Yiisoft\Validator\Rule\Callback;
Expand All @@ -328,11 +337,12 @@ $rules = [
];
```

## Shortcut for use with validator
## Сокращение при использовании в валидаторе

When using with the validator and default `Callback` rule settings, a rule
declaration can be omitted, so just including a callable is enough. It will
be normalized automatically before validation:
При использовании в валидаторе и настройках по умолчанию для `Callback`
правила, объявление правила можно опустить, поэтому достаточно просто
указать вызываемую функцию. Она будет автоматически нормализована перед
проверкой:

```php
use Exception;
Expand Down Expand Up @@ -364,7 +374,7 @@ $rules = [
$result = (new Validator())->validate($data, $rules);
```

Or it can be set within an array of other rules:
Или же его можно задать в массиве вместе с другими правилами:

```php
use Exception;
Expand Down
103 changes: 103 additions & 0 deletions docs/guide/ru/built-in-rules-file.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
# File

`File` checks that a value is a file and can validate its extension, MIME
type, and size.

Supported values:

- string file paths;
- `SplFileInfo` instances;
- [PSR-7] `UploadedFileInterface` instances.

Use `Each` for multiple files:

```php
use Yiisoft\Validator\Rule\Each;
use Yiisoft\Validator\Rule\File;

$rules = [
'attachments' => new Each(new File(extensions: ['pdf', 'txt'])),
];
```

For example, with a PSR-7 request:

```php
use Yiisoft\Validator\Rule\Each;
use Yiisoft\Validator\Rule\File;
use Yiisoft\Validator\Validator;

$uploadedFiles = $request->getUploadedFiles()['attachments'] ?? [];

$result = (new Validator())->validate(
['attachments' => $uploadedFiles],
['attachments' => new Each(new File(maxSize: 5_000_000))],
);
```

If your application works with native PHP `$_FILES` data directly, convert
it to supported values such as PSR-7 uploaded file objects before passing it
to the validator.

## Uploaded Files

`File` handles PSR-7 upload error codes. `UPLOAD_ERR_NO_FILE` is treated as
a missing value, so optional upload fields can use `skipOnEmpty`:

```php
use Yiisoft\Validator\Rule\File;

$rule = new File(skipOnEmpty: true);
```

Other upload error codes fail validation with `uploadFailedMessage`.

The rule does not prove that arbitrary string paths or `SplFileInfo` values
came from PHP's HTTP upload mechanism. Do not pass user-submitted paths
directly. Use PSR-7 uploaded file objects from a trusted request
implementation, or perform [upload provenance checks] before validating
filesystem paths.

## MIME Types

For filesystem-backed files, MIME type validation uses PHP's file
information facilities through `mime_content_type()`. If the MIME type can't
be determined, MIME validation fails.

For pathless PSR-7 uploads backed only by an in-memory stream, `File`
doesn't trust client-provided media type by default. If your application has
already decided that the client metadata is acceptable for this field,
enable it explicitly:

```php
use Yiisoft\Validator\Rule\File;

$rule = new File(
mimeTypes: ['text/plain'],
trustClientMediaType: true,
);
```

This option should be used with care because the client can send any media
type value.

## Size

For filesystem-backed uploads, size checks use the actual file size on
disk. For pathless streams, size checks use the PSR-7 upload size when
available. If a size constraint is configured and the size can't be
determined, validation fails.

`size` is mutually exclusive with `minSize` and `maxSize`. When both
`minSize` and `maxSize` are set, `minSize` must be less than or equal to
`maxSize`.

## Request Body Streams

`File` doesn't validate generic request body streams such as data read from
`php://input` for PUT requests. Convert such input to a supported value
first, or write a custom rule that validates your stream format and storage
flow.

[PSR-7]: https://www.php-fig.org/psr/psr-7/
[upload provenance checks]: https://www.php.net/manual/en/features.file-upload.post-method.php
4 changes: 2 additions & 2 deletions docs/guide/ru/built-in-rules-nested.md
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,7 @@ $rule = new Nested([
и `Each`. Если вам это необходимо, используйте явную форму конфигурации
(см. пример в разделе [Базовое использование]).

### Использование атрибутов
### Using PHP attributes

Правила и отношения можно объявлять через DTO с PHP атрибутами:

Expand Down Expand Up @@ -510,5 +510,5 @@ $data = [
[Базовое использование]: #базовое-использование-связь-один-к-одному
[JSFiddle]: https://jsfiddle.net/fys8uadr/
[Conditional validation]: conditional-validation.md
[Настройка правил с помощью PHP атрибутов]: configuring-rules-via-php-attributes.md
[Configuring rules via PHP attributes]: configuring-rules-via-php-attributes.md
[Использование валидатора]: using-validator.md
2 changes: 2 additions & 0 deletions docs/guide/ru/built-in-rules.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ Here is a list of all available built-in rules, divided by category.

### File rules

- [File](../../../src/Rule/File.php)
- [Image](../../../src/Rule/Image/Image.php)

### Date rules
Expand Down Expand Up @@ -86,6 +87,7 @@ Some rules also have guides in addition to PHPDoc:
- [Compare](built-in-rules-compare.md)
- [Composite](built-in-rules-composite.md)
- [Each](built-in-rules-each.md)
- [File](built-in-rules-file.md)
- [Nested](built-in-rules-nested.md)
- [Required](built-in-rules-required.md)
- [StopOnError](built-in-rules-stop-on-error.md)
Expand Down
Loading