Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Перевод] Внешний интерфейс приложения #9

Open
wants to merge 2 commits into
base: 9.x
Choose a base branch
from
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
6 changes: 5 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
- [x] [Установка](./docs/installation.md)
- [x] [Конфигурирование](./docs/configuration.md)
- [x] [Структура каталогов](./docs/structure.md)
- [ ] [Frontend](./docs/frontend.md)
- [x] [Стартовые комплекты](./docs/starter-kits.md)
- [x] [Развертывание](./docs/deployment.md)
- #### Архитектурные концепции
Expand All @@ -35,6 +36,7 @@
- [x] [HTTP-ответы](./docs/responses.md)
- [x] [HTML-шаблоны](./docs/views.md)
- [x] [Шаблонизатор Blade](./docs/blade.md)
- [ ] [Asset Bundling](./docs/vite.md)
- [x] [Генерация URL-адресов](./docs/urls.md)
- [x] [Сессия HTTP](./docs/session.md)
- [x] [Валидация](./docs/validation.md)
Expand All @@ -45,7 +47,6 @@
- [x] [Трансляция событий](./docs/broadcasting.md)
- [x] [Кеш приложения](./docs/cache.md)
- [x] [Коллекции](./docs/collections.md)
- [x] [Компиляция веб-активов с помощью Mix](./docs/mix.md)
- [x] [Контракты](./docs/contracts.md)
- [x] [События](./docs/events.md)
- [x] [Файловое хранилище](./docs/filesystem.md)
Expand Down Expand Up @@ -79,6 +80,7 @@
- [x] [Мутаторы и типизация](./docs/eloquent-mutators.md)
- [x] [Ресурсы API](./docs/eloquent-resources.md)
- [x] [Сериализация](./docs/eloquent-serialization.md)
- [ ] [Фабрики](./docs/eloquent-factories.md)
- #### Тестирование
- [x] [Начало работы](./docs/testing.md)
- [x] [Тесты HTTP](./docs/http-tests.md)
Expand All @@ -96,8 +98,10 @@
- [x] [*Homestead*](./docs/homestead.md) – официальный образ Vagrant для приложений Laravel.
- [x] [*Horizon*](./docs/horizon.md) – панель управления и конфигурация очередей, использующих Redis.
- [ ] [*Jetstream*](https://jetstream.laravel.com) – красиво оформленный каркас приложений. Включает в себя Fortify и Sanctum.
- [x] [*Mix*](./docs/mix.md) – гибкий API для определения шагов сборки Webpack; упрощает компиляцию и минимизацию файлов CSS и JavaScript.
- [ ] [*Octane*](./docs/octane.md) – повышает производительность вашего приложения с использованием мощных серверов [Swoole](https://swoole.co.uk) и [RoadRunner](https://roadrunner.dev)
- [ ] [*Passport*](./docs/passport.md) – реализация сервера OAuth2 для вашего приложения Laravel на основе [League OAuth2](https://github.com/thephpleague/oauth2-server).
- [ ] [*Pint*](./docs/pint.md) – is an opinionated PHP code style fixer for minimalists.
- [x] [*Sail*](./docs/sail.md) – CLI для взаимодействия со средой разработки Docker.
- [x] [*Sanctum*](./docs/sanctum.md) – легковесная система аутентификации для SPA (одностраничных приложений), мобильных приложений и простых API на основе токенов. Управление токенами API, аутентификация сессии. Не содержит никаких шаблонов. Используется в Laravel Jetstream.
- [x] [*Scout*](./docs/scout.md) – «простое» решение на основе драйверов для добавления полнотекстового поиска моделям Eloquent.
Expand Down
108 changes: 72 additions & 36 deletions docs/artisan.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
- [Генерация команд](#generating-commands)
- [Структура команды](#command-structure)
- [Анонимные команды](#closure-commands)
- [Изолируемые команды](#isolatable-commands)
- [Определение вводимых данных](#defining-input-expectations)
- [Аргументы](#arguments)
- [Параметры](#options)
Expand Down Expand Up @@ -60,7 +61,8 @@ Laravel Tinker – это мощный REPL для фреймворка Laravel,
composer require laravel/tinker
```

> {tip} Ищете графический интерфейс для взаимодействия с приложением Laravel? Зацените [Tinkerwell](https://tinkerwell.app)!
> **Примечание**\
> Ищете графический интерфейс для взаимодействия с приложением Laravel? Зацените [Tinkerwell](https://tinkerwell.app)!

<a name="usage"></a>
#### Использование
Expand All @@ -77,7 +79,8 @@ php artisan tinker
php artisan vendor:publish --provider="Laravel\Tinker\TinkerServiceProvider"
```

> {note} Глобальный помощник `dispatch` и метод `dispatch` класса `Dispatchable` зависят от "garbage collection" для помещения задания в очередь. Следовательно, при использовании Tinker вы должны использовать `Bus::dispatch` или `Queue::push` для отправки заданий.
> **Предупреждение**\
> Глобальный помощник `dispatch` и метод `dispatch` класса `Dispatchable` зависят от "garbage collection" для помещения задания в очередь. Следовательно, при использовании Tinker вы должны использовать `Bus::dispatch` или `Queue::push` для отправки заданий.

<a name="command-allow-list"></a>
#### Список разрешенных команд
Expand Down Expand Up @@ -154,7 +157,8 @@ php artisan make:command SendEmails
}
}

> {tip} Хорошей практикой повторного использования кода считается создание «простых» консольных команд с делегированием своих задач службам приложения. В приведенном примере мы внедряем класс службы для выполнения «затратной» отправки электронных писем.
> **Примечание**\
> Хорошей практикой повторного использования кода считается создание «простых» консольных команд с делегированием своих задач службам приложения. В приведенном примере мы внедряем класс службы для выполнения «затратной» отправки электронных писем.

<a name="closure-commands"></a>
### Анонимные команды
Expand Down Expand Up @@ -200,6 +204,55 @@ php artisan make:command SendEmails
// ...
})->purpose('Send a marketing email to a user');

<a name="isolatable-commands"></a>
### Изолируемые команды

> **Предупреждение**\
> Чтобы использовать этот функционал, ваше приложение должно использовать в качестве драйвера кеша по умолчанию `memcached`, `redis`, `dynamodb`, `database`, `file`, `array`. Кроме того, все серверы должны обмениваться данными с одним и тем же сервером центрального кэша.

Иногда необходимо гарантировать, что только один экземпляр команды может выполняться одновременно. Для этого вы можете реализовать интерфейс `Illuminate\Contracts\Console\Isolatable` в своем классе команд:

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Contracts\Console\Isolatable;

class SendEmails extends Command implements Isolatable
{
// ...
}

Когда команда помечена как `Isolatable`, Laravel автоматически добавит к команде параметр `--isolated`. Когда команда вызывается с этим параметром, то Laravel гарантирует, что никакие другие экземпляры этой команды еще не запущены. Laravel достигает этого, пытаясь получить атомарную блокировку, используя драйвер кеша вашего приложения по умолчанию. Если запущены другие экземпляры команды, то команда не будет выполняться; однако, команда все равно завершится с успешным кодом выхода:

```shell
php artisan mail:send 1 --isolated
```

Если вы хотите указать код состояния выхода, который должна возвращать команда, если она не может быть выполнена, то вы можете указать желаемый код состояния с помощью опции `isolated`:

```shell
php artisan mail:send 1 --isolated=12
```

<a name="lock-expiration-time"></a>
#### Время действия блокировки

По умолчанию время действия изоляционных блокировок истекает после завершения команды. Или, если команда прервана и не может быть завершена, блокировка истечет через один час. Однако вы можете настроить время истечения блокировки, определив метод `isolationLockExpiresAt` в вашей команде:

```php
/**
* Определить, когда истечет время действия блокировки изоляции команды.
*
* @return \DateTimeInterface|\DateInterval
*/
public function isolationLockExpiresAt()
{
return now()->addMinutes(5);
}
```

<a name="defining-input-expectations"></a>
## Определение вводимых данных

Expand Down Expand Up @@ -495,7 +548,8 @@ php artisan mail:send --id=1 --id=2

$bar->finish();

> {tip} Для получения дополнительной информации ознакомьтесь с [разделом документации компонента Symfony Progress Bar](https://symfony.com/doc/current/components/console/helpers/progressbar.html).
> **Примечание**\
> Для получения дополнительной информации ознакомьтесь с [разделом документации компонента Symfony Progress Bar](https://symfony.com/doc/current/components/console/helpers/progressbar.html).

<a name="registering-commands"></a>
## Регистрация команд
Expand Down Expand Up @@ -611,47 +665,29 @@ php artisan mail:send --id=1 --id=2
<a name="signal-handling"></a>
## Обработка сигналов

Компонент Symfony Console, на котором работает консоль Artisan, позволяет вам указать, какие [сигналы процесса](https://ru.wikipedia.org/wiki/Сигнал_(Unix)) (если есть) может обрабатывать ваша команда. Например, вы можете указать, что ваша команда может обрабатывать сигналы `SIGINT` и `SIGTERM`.

Для начала вы должны реализовать интерфейс `Symfony\Component\Console\Command\SignalableCommandInterface` в классе своей команды Artisan. Этот интерфейс требует от вас определения двух методов: `getSubscribedSignals` и `handleSignal`:

```php
<?php

use Symfony\Component\Console\Command\SignalableCommandInterface;

class StartServer extends Command implements SignalableCommandInterface
{
// ...

/**
* Получить список сигналов, обрабатываемых командой.
*
* @return array
*/
public function getSubscribedSignals(): array
{
return [SIGINT, SIGTERM];
}
Как вы, возможно, знаете, операционные системы позволяют отправлять сигналы запущенным процессам. Например, сигнал `SIGTERM` — это то, как операционные системы запрашивают завершение программы. Если вы хотите прослушивать сигналы в консольных командах Artisan и выполнять код при их появлении, вы можете использовать метод `trap`:

/**
* Обработка входящего сигнала.
* Выполнить консольную команду.
*
* @param int $signal
* @return void
* @return mixed
*/
public function handleSignal(int $signal): void
public function handle()
{
if ($signal === SIGINT) {
$this->stopServer();
$this->trap(SIGTERM, fn () => $this->shouldKeepRunning = false);

return;
while ($this->shouldKeepRunning) {
// ...
}
}
}
```

Метод `getSubscribedSignals` должен возвращать массив сигналов, которые может обработать ваша команда, в то время как метод `handleSignal` принимает сигнал и может реагировать на него в соответствии с определенной вами логикой.
Чтобы прослушивать несколько сигналов одновременно, вы можете передать массив сигналов методу `trap`:

$this->trap([SIGTERM, SIGQUIT], function ($signal) {
$this->shouldKeepRunning = false;

dump($signal); // SIGTERM / SIGQUIT
});

<a name="stub-customization"></a>
## Настройка заготовок
Expand Down
Loading