├── .gitattributes ├── .github └── FUNDING.yml ├── .gitignore ├── CONTRIBUTING.md ├── README.md ├── assets └── images │ └── github.com_laravel_docs_compare_0f41346...e0d247d.png └── docs ├── artisan.md ├── authentication.md ├── authorization.md ├── billing.md ├── blade.md ├── broadcasting.md ├── cache.md ├── cashier-paddle.md ├── collections.md ├── configuration.md ├── console-tests.md ├── container.md ├── contracts.md ├── contributions.md ├── controllers.md ├── csrf.md ├── database-testing.md ├── database.md ├── deployment.md ├── documentation.md ├── dusk.md ├── eloquent-collections.md ├── eloquent-factories.md ├── eloquent-mutators.md ├── eloquent-relationships.md ├── eloquent-resources.md ├── eloquent-serialization.md ├── eloquent.md ├── encryption.md ├── envoy.md ├── errors.md ├── events.md ├── facades.md ├── filesystem.md ├── fortify.md ├── frontend.md ├── hashing.md ├── helpers.md ├── homestead.md ├── horizon.md ├── http-client.md ├── http-tests.md ├── img ├── breeze-register.png ├── horizon-example.png ├── notification-example-2.png ├── releases-1.png ├── releases-2.png ├── releases-3.png ├── releases-4.png ├── releases-5.gif └── telescope-example.png ├── installation.md ├── license.md ├── lifecycle.md ├── localization.md ├── logging.md ├── mail.md ├── middleware.md ├── migrations.md ├── mix-old.md ├── mix.md ├── mocking.md ├── notifications.md ├── octane.md ├── packages.md ├── pagination.md ├── passport.md ├── passwords.md ├── pint.md ├── providers.md ├── queries.md ├── queues.md ├── rate-limiting.md ├── readme.md ├── redis.md ├── releases.md ├── requests.md ├── responses.md ├── routing.md ├── sail.md ├── sanctum.md ├── scheduling.md ├── scout.md ├── seeding.md ├── session.md ├── socialite.md ├── starter-kits.md ├── structure.md ├── telescope.md ├── testing.md ├── upgrade.md ├── urls.md ├── valet.md ├── validation.md ├── verification.md ├── views.md └── vite.md /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | *.md linguist-documentation 4 | LICENSE export-ignore 5 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | custom: # rustam_gimranov@mail.ru 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /advanced/ 2 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Содействие в переводе документации 2 | 3 | ## Процесс актуализации документации (основного репозитория без ответвлений «донора») 4 | 5 | > Раздел, описывающий поток действий, для их дальнейшей автоматизации. 6 | 7 | Процесс актуализации состоит из трех этапов: 8 | 9 | 1. **Прямое сравнение изменений** двух коммитов, сделанных в основном репозитории оригинала документации. 10 | - На странице коммитов интересующей ветки (например, https://github.com/russsiq/laravel-docs-ru/commits/8.x) ищем последний коммит, содержащий фразу `[compare] xxxxxxx..yyyyyyy`. Копируем часть `yyyyyyy` (например, `0f41346`). 11 | - На странице коммитов оригинала документации (например, https://github.com/laravel/docs/commits/8.x) копируем 7 символов последнего коммита (например, `e0d247d`). 12 | - Переходим на страницу https://github.com/laravel/docs/compare/0f41346...e0d247d#files_bucket 13 | 2. **Внесение изменений** в виде переведенных строк в соответствующую ветку текущего репозитория. 14 | ![Comparing changes](./assets/images/github.com_laravel_docs_compare_0f41346...e0d247d.png) 15 | - Копируем название файла, нажав кнопку, выделенную голубым кружком. 16 | - Переходим в редактор и с помощью комбинации клавиш Ctrl+P переходим к редактируемому файлу. 17 | - Переходим в браузер и копируем содержимое `[range](#method-range)` измененной строки `165`. 18 | - Переходим в редактор и с помощью комбинации клавиш Ctrl+G переходим к редактируемой строке. 19 | - Вносим необходимые изменения в каждый файл, попутно выполняя переводы на русский язык. 20 | 3. **Фиксация изменений** с помощью системы контроля версий, пометив коммит в уже знакомом формате `[compare] 0f41346..e0d247d` 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Документация Laravel 9.x 2 | 3 | Вольный перевод репозитория документации [**laravel/docs**](https://github.com/laravel/docs/tree/9.x) ветка 9.x на русский язык. Актуализация с основным репозиторием документации Laravel осуществляется не реже одного раза в месяц. Орфографические, пунктуационные и грубые смысловые ошибки исправляются по мере их выявления. 4 | 5 | > Перевод документации [Laravel ветка 8.x](https://github.com/russsiq/laravel-docs-ru/tree/8.x). 6 | 7 | 8 | ### Содержание документации 9 | 10 | > Перед чтением документации ознакомьтесь с [соглашением по переводу](https://github.com/russsiq/translation-agreements). 11 | 12 | Разделы, помеченные галочками, уже имеют актуализированные переводы **полностью на русском языке**. 13 | 14 | - #### Пролог 15 | - [x] [Примечания к релизу](./docs/releases.md) 16 | - [x] [Руководство по обновлению](./docs/upgrade.md) 17 | - [x] [Рекомендации по участию](./docs/contributions.md) 18 | - #### Начало 19 | - [x] [Установка](./docs/installation.md) 20 | - [x] [Конфигурирование](./docs/configuration.md) 21 | - [x] [Структура каталогов](./docs/structure.md) 22 | - [ ] [Внешний интерфейс приложения](./docs/frontend.md) 23 | - [x] [Стартовые комплекты](./docs/starter-kits.md) 24 | - [x] [Развертывание](./docs/deployment.md) 25 | - #### Архитектурные концепции 26 | - [x] [Жизненный цикл запроса](./docs/lifecycle.md) 27 | - [x] [Контейнер служб](./docs/container.md) 28 | - [x] [Поставщики служб](./docs/providers.md) 29 | - [x] [Фасады](./docs/facades.md) 30 | - #### Основы 31 | - [x] [Маршрутизация](./docs/routing.md) 32 | - [x] [Посредники](./docs/middleware.md) 33 | - [x] [Предотвращение атак CSRF](./docs/csrf.md) 34 | - [x] [Контроллеры](./docs/controllers.md) 35 | - [x] [HTTP-запросы](./docs/requests.md) 36 | - [x] [HTTP-ответы](./docs/responses.md) 37 | - [x] [HTML-шаблоны](./docs/views.md) 38 | - [x] [Шаблонизатор Blade](./docs/blade.md) 39 | - [ ] [Объединение веб-активов](./docs/vite.md) 40 | - [x] [Генерация URL-адресов](./docs/urls.md) 41 | - [x] [Сессия HTTP](./docs/session.md) 42 | - [x] [Валидация](./docs/validation.md) 43 | - [x] [Обработка ошибок](./docs/errors.md) 44 | - [x] [Логирование](./docs/logging.md) 45 | - #### Продвинутое руководство 46 | - [x] [Консоль Artisan](./docs/artisan.md) 47 | - [x] [Трансляция событий](./docs/broadcasting.md) 48 | - [x] [Кеш приложения](./docs/cache.md) 49 | - [x] [Коллекции](./docs/collections.md) 50 | - [x] [Контракты](./docs/contracts.md) 51 | - [x] [События](./docs/events.md) 52 | - [x] [Файловое хранилище](./docs/filesystem.md) 53 | - [x] [Глобальные помощники](./docs/helpers.md) 54 | - [x] [HTTP-клиент](./docs/http-client.md) 55 | - [x] [Локализация интерфейса](./docs/localization.md) 56 | - [x] [Почтовые отправления](./docs/mail.md) 57 | - [x] [Уведомления](./docs/notifications.md) 58 | - [x] [Разработка пакетов](./docs/packages.md) 59 | - [x] [Очереди](./docs/queues.md) 60 | - [x] [Ограничители частоты](./docs/rate-limiting.md) 61 | - [x] [Планирование задач](./docs/scheduling.md) 62 | - #### Безопасность 63 | - [x] [Аутентификация](./docs/authentication.md) 64 | - [x] [Авторизация](./docs/authorization.md) 65 | - [x] [Подтверждение адреса электронной почты](./docs/verification.md) 66 | - [x] [Шифрование](./docs/encryption.md) 67 | - [x] [Хеширование](./docs/hashing.md) 68 | - [x] [Сброс пароля](./docs/passwords.md) 69 | - #### База данных 70 | - [x] [Начало работы](./docs/database.md) 71 | - [x] [Построитель запросов](./docs/queries.md) 72 | - [x] [Постраничная навигация](./docs/pagination.md) 73 | - [x] [Миграции](./docs/migrations.md) 74 | - [x] [Наполнение фиктивными данными](./docs/seeding.md) 75 | - [x] [Использование Redis](./docs/redis.md) 76 | - #### Eloquent ORM 77 | - [x] [Начало работы](./docs/eloquent.md) 78 | - [x] [Отношения](./docs/eloquent-relationships.md) 79 | - [x] [Коллекции](./docs/eloquent-collections.md) 80 | - [x] [Мутаторы и типизация](./docs/eloquent-mutators.md) 81 | - [x] [Ресурсы API](./docs/eloquent-resources.md) 82 | - [x] [Сериализация](./docs/eloquent-serialization.md) 83 | - [ ] [Фабрики](./docs/eloquent-factories.md) 84 | - #### Тестирование 85 | - [x] [Начало работы](./docs/testing.md) 86 | - [x] [Тесты HTTP](./docs/http-tests.md) 87 | - [x] [Тесты консольных команд](./docs/console-tests.md) 88 | - [x] [Браузерные тесты](./docs/dusk.md) 89 | - [x] [База данных](./docs/database-testing.md) 90 | - [x] [Имитация](./docs/mocking.md) 91 | - #### Пакеты 92 | - [x] [*Breeze*](./docs/starter-kits.md#laravel-breeze) – легковесная реализация аутентификации Laravel для ознакомления с функционалом. Включает простые шаблоны Blade, стилизованные с помощью Tailwind CSS. Содержит маршруты для публикации. 93 | 94 | 95 | - [x] [*Dusk*](./docs/dusk.md) – автоматизация поведения браузера и тестирование с использованием ChromeDriver. 96 | - [x] [*Envoy*](./docs/envoy.md) – инструмент для запуска задач, выполняемых на удаленных серверах. Задачи определяются в файле `Envoy.blade.php` в корне приложения с использованием директив шаблонизатора Blade. 97 | - [x] [*Fortify*](./docs/fortify.md) – серверная реализация аутентификации Laravel. Не содержит никаких шаблонов. Используется в Laravel Jetstream. 98 | - [x] [*Homestead*](./docs/homestead.md) – официальный образ Vagrant для приложений Laravel. 99 | - [x] [*Horizon*](./docs/horizon.md) – панель управления и конфигурация очередей, использующих Redis. 100 | - [ ] [*Jetstream*](https://jetstream.laravel.com) – красиво оформленный каркас приложений. Включает в себя Fortify и Sanctum. 101 | - [x] [*Mix*](./docs/mix.md) – гибкий API для определения шагов сборки Webpack; упрощает компиляцию и минимизацию файлов CSS и JavaScript. 102 | - [ ] [*Octane*](./docs/octane.md) – повышает производительность вашего приложения с использованием мощных серверов [Swoole](https://swoole.co.uk) и [RoadRunner](https://roadrunner.dev) 103 | - [ ] [*Passport*](./docs/passport.md) – реализация сервера OAuth2 для вашего приложения Laravel на основе [League OAuth2](https://github.com/thephpleague/oauth2-server). 104 | - [ ] [*Pint*](./docs/pint.md) – is an opinionated PHP code style fixer for minimalists. 105 | - [x] [*Sail*](./docs/sail.md) – CLI для взаимодействия со средой разработки Docker. 106 | - [x] [*Sanctum*](./docs/sanctum.md) – легковесная система аутентификации для SPA (одностраничных приложений), мобильных приложений и простых API на основе токенов. Управление токенами API, аутентификация сессии. Не содержит никаких шаблонов. Используется в Laravel Jetstream. 107 | - [x] [*Scout*](./docs/scout.md) – «простое» решение на основе драйверов для добавления полнотекстового поиска моделям Eloquent. 108 | - [x] [*Socialite*](./docs/socialite.md) – аутентификация через провайдеров OAuth: Facebook, Twitter, LinkedIn, Google, GitHub, GitLab и Bitbucket. 109 | - [x] [*Telescope*](./docs/telescope.md) – панель управления, отображающая записи о произошедших в приложении событиях. 110 | - [ ] [*Valet*](./docs/valet.md) – окружение разработки приложений Laravel для пользователей macOS. 111 | - [Документация API](https://laravel.com/api/9.x/) 112 | 113 | 114 | ### Содействие переводу 115 | 116 | Официальная документация Laravel доступна только на английском языке. Для получения дополнительной информации о том, как вы можете внести свой вклад в перевод документации Laravel на русский язык, пожалуйста, прочтите [Содействие в переводе документации](CONTRIBUTING.md). 117 | 118 | 119 | ### Лицензия 120 | 121 | Ссылка на [лицензию](https://github.com/laravel/docs/blob/9.x/license.md) оригинала документации **laravel/docs**. 122 | 123 | Текущий перевод документации распространяется по лицензии [MIT](LICENSE). 124 | -------------------------------------------------------------------------------- /assets/images/github.com_laravel_docs_compare_0f41346...e0d247d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russsiq/laravel-docs-ru/9589e83b94b8c70e2bbd27fa885608e30a369d55/assets/images/github.com_laravel_docs_compare_0f41346...e0d247d.png -------------------------------------------------------------------------------- /docs/console-tests.md: -------------------------------------------------------------------------------- 1 | # Laravel 9 · Тестирование · Тесты консольных команд 2 | 3 | - [Введение](#introduction) 4 | - [Утверждения кодов выхода](#success-failure-expectations) 5 | - [Ожидания ввода / вывода](#input-output-expectations) 6 | 7 | 8 | ## Введение 9 | 10 | Помимо упрощенного HTTP-тестирования, Laravel предлагает простой API для тестирования [пользовательских консольных команд](artisan.md) вашего приложения. 11 | 12 | 13 | ## Утверждения кодов выхода 14 | 15 | Для начала давайте рассмотрим, как делать утверждения относительно кода выхода / возврата команды Artisan. Для этого мы будем использовать метод `artisan` для вызова команды Artisan из нашего теста. Затем мы будем использовать метод `assertExitCode` для подтверждения, что команда завершилась с указанным кодом выхода: 16 | 17 | /** 18 | * Тестирование консольной команды. 19 | * 20 | * @return void 21 | */ 22 | public function test_console_command() 23 | { 24 | $this->artisan('inspire')->assertExitCode(0); 25 | } 26 | 27 | Вы можете использовать метод `assertNotExitCode` для подтверждения, что команда не была завершена с указанным кодом выхода: 28 | 29 | $this->artisan('inspire')->assertNotExitCode(1); 30 | 31 | Конечно, все команды терминала обычно завершаются с кодом состояния `0` в случаях успешного завершения, и с ненулевым кодом выхода в противных случаях. Поэтому для удобства вы можете использовать утверждения `assertSuccessful` и `assertFailed` для подтверждения, что команда завершилась с успешным кодом выхода или нет: 32 | 33 | $this->artisan('inspire')->assertSuccessful(); 34 | 35 | $this->artisan('inspire')->assertFailed(); 36 | 37 | 38 | ## Ожидания ввода / вывода 39 | 40 | Laravel позволяет вам легко «имитировать» ввод пользователем в консольных командах, используя метод `expectsQuestion`. Кроме того, вы можете указать код выхода / возврата и текст, который вы ожидаете получить от консольной команды, используя методы `assertExitCode` и `expectsOutput`. Например, рассмотрим следующую консольную команду: 41 | 42 | Artisan::command('question', function () { 43 | $name = $this->ask('What is your name?'); 44 | 45 | $language = $this->choice('Which language do you prefer?', [ 46 | 'PHP', 47 | 'Ruby', 48 | 'Python', 49 | ]); 50 | 51 | $this->line('Your name is '.$name.' and you prefer '.$language.'.'); 52 | }); 53 | 54 | Вы можете протестировать эту команду с помощью следующего теста, который использует методы `expectsQuestion`, `expectsOutput`, `doesntExpectOutput`, `expectsOutputToContain`, `doesntExpectOutputToContain` и `assertExitCode`: 55 | 56 | /** 57 | * Тестирование консольной команды. 58 | * 59 | * @return void 60 | */ 61 | public function test_console_command() 62 | { 63 | $this->artisan('question') 64 | ->expectsQuestion('What is your name?', 'Taylor Otwell') 65 | ->expectsQuestion('Which language do you prefer?', 'PHP') 66 | ->expectsOutput('Your name is Taylor Otwell and you prefer PHP.') 67 | ->doesntExpectOutput('Your name is Taylor Otwell and you prefer Ruby.') 68 | ->expectsOutputToContain('Taylor Otwell') 69 | ->doesntExpectOutputToContain('you prefer Ruby') 70 | ->assertExitCode(0); 71 | } 72 | 73 | 74 | #### Ожидания подтверждения 75 | 76 | При написании команды, которая ожидает подтверждения в виде ответа «да» или «нет», вы можете использовать метод `expectsConfirmation`: 77 | 78 | $this->artisan('module:import') 79 | ->expectsConfirmation('Do you really wish to run this command?', 'no') 80 | ->assertExitCode(1); 81 | 82 | 83 | #### Таблица ожиданий 84 | 85 | Если ваша команда отображает таблицу информации с использованием метода `table` Artisan, может быть обременительно записывать ожидаемые результаты для всей таблицы. Вместо этого вы можете использовать метод `expectsTable`. Этот метод принимает заголовки таблицы в качестве первого аргумента и данные таблицы в качестве второго аргумента: 86 | 87 | $this->artisan('users:all') 88 | ->expectsTable([ 89 | 'ID', 90 | 'Email', 91 | ], [ 92 | [1, 'taylor@example.com'], 93 | [2, 'abigail@example.com'], 94 | ]); 95 | -------------------------------------------------------------------------------- /docs/contributions.md: -------------------------------------------------------------------------------- 1 | # Laravel 9 · Рекомендации по участию 2 | 3 | - [Отчеты об ошибках](#bug-reports) 4 | - [Вопросы поддержки](#support-questions) 5 | - [Обсуждение разработки ядра](#core-development-discussion) 6 | - [Какую ветку выбрать при запросах слияния?](#which-branch) 7 | - [Скомпилированные ресурсы исходников](#compiled-assets) 8 | - [Уязвимости безопасности](#security-vulnerabilities) 9 | - [Стиль кодирования](#coding-style) 10 | - [PHPDoc](#phpdoc) 11 | - [StyleCI](#styleci) 12 | - [Нормы поведения](#code-of-conduct) 13 | 14 | 15 | ## Отчеты об ошибках 16 | 17 | Чтобы стимулировать активное сотрудничество, Laravel настоятельно рекомендует запросы на слияние, а не только отчеты об ошибках. Запросы на слияние будут рассматриваться только в том случае, если они помечены как «ready for review» (не в состоянии «draft») и для нового функционала пройдены все тесты. Устаревшие неактивные запросы на слияние, оставшиеся в состоянии «draft», будут закрыты через несколько дней. 18 | 19 | Однако, если вы отправляете отчет об ошибке, ваш тикет о проблеме должен содержать заголовок и четкое описание проблемы. Вы также должны включить как можно больше релевантной информации и образец кода, демонстрирующий проблему. Цель отчета об ошибке – упростить для вас и окружающих воспроизведение ошибки и разработать исправления. 20 | 21 | Помните, отчеты об ошибках создаются в надежде, что другие с той же проблемой смогут сотрудничать с вами при ее решении. Не ожидайте, что отчет об ошибке автоматически сподвигнет на какие-либо действия или что другие будут прыгать, чтобы исправить ее. Создание отчета об ошибке поможет вам и другим начать работу по устранению проблемы. Если хотите внести свой вклад, то вы можете помочь, исправив [любые ошибки, перечисленные в нашем трекере тикетов ошибок](https://github.com/issues?q=is%3Aopen+is%3Aissue+label%3Abug+user%3Alaravel). Вы должны пройти аутентификацию в GitHub, чтобы просмотреть все проблемы Laravel. 22 | 23 | В управлении исходным кодом Laravel используется GitHub, и для каждого проекта есть репозитории: 24 | 25 | 26 | 27 | - [Приложение Laravel](https://github.com/laravel/laravel) 28 | - [Логотипы Laravel](https://github.com/laravel/art) 29 | - [Документация Laravel](https://github.com/laravel/docs) 30 | - [Пакет Laravel Dusk](https://github.com/laravel/dusk) 31 | - [Пакет Laravel Cashier Stripe](https://github.com/laravel/cashier) 32 | - [Пакет Laravel Cashier Paddle](https://github.com/laravel/cashier-paddle) 33 | - [Пакет Laravel Echo](https://github.com/laravel/echo) 34 | - [Пакет Laravel Envoy](https://github.com/laravel/envoy) 35 | - [Фреймворк Laravel](https://github.com/laravel/framework) 36 | - [Пакет Laravel Homestead](https://github.com/laravel/homestead) 37 | - [Скрипты для сборки Laravel Homestead](https://github.com/laravel/settler) 38 | - [Пакет Laravel Horizon](https://github.com/laravel/horizon) 39 | - [Пакет Laravel Jetstream](https://github.com/laravel/jetstream) 40 | - [Пакет Laravel Passport](https://github.com/laravel/passport) 41 | - [Пакет Laravel Pint](https://github.com/laravel/pint) 42 | - [Пакет Laravel Sail](https://github.com/laravel/sail) 43 | - [Пакет Laravel Sanctum](https://github.com/laravel/sanctum) 44 | - [Пакет Laravel Scout](https://github.com/laravel/scout) 45 | - [Пакет Laravel Socialite](https://github.com/laravel/socialite) 46 | - [Пакет Laravel Telescope](https://github.com/laravel/telescope) 47 | - [Исходники официального сайта Laravel](https://github.com/laravel/laravel.com-next) 48 | 49 | 50 | 51 | 52 | ## Вопросы поддержки 53 | 54 | Трекеры с тикетами проблем Laravel на GitHub не предназначены для предоставления помощи или поддержки Laravel. Вместо этого используйте один из следующих каналов: 55 | 56 | 57 | 58 | - [Обсуждения на GitHub](https://github.com/laravel/framework/discussions) 59 | - [Форум Laracasts](https://laracasts.com/discuss) 60 | - [Форум Laravel.io](https://laravel.io/forum) 61 | - [StackOverflow](https://stackoverflow.com/questions/tagged/laravel) 62 | - [Discord](https://discord.gg/laravel) 63 | - [Larachat](https://larachat.co) 64 | - [IRC](https://web.libera.chat/?nick=artisan&channels=#laravel) 65 | 66 | 67 | 68 | 69 | ## Обсуждение разработки ядра 70 | 71 | Вы можете предлагать новый функционал или улучшения существующего поведения Laravel в репозитории фреймворка Laravel на [доске обсуждений GitHub](https://github.com/laravel/framework/discussions). Если вы предлагаете новый функционал, то пожалуйста, будьте готовы реализовать по крайней мере часть кода, который потребуется для его завершения. 72 | 73 | Неформальное обсуждение ошибок, нового функционала и реализаций существующего происходит на канале `#internals` сервера [Laravel Discord](https://discord.gg/laravel). Тейлор Отвелл, сопровождающий Laravel, обычно присутствует на канале в будние дни с 8:00 до 17:00 (UTC-06:00 или Америка / Чикаго) и от случая к случаю – в остальное время. 74 | 75 | 76 | ## Какую ветку выбрать при запросах слияния? 77 | 78 | **Все** исправления ошибок следует отправлять в последнюю версию, которая поддерживает исправления ошибок (в настоящее время `9.x`). Исправления ошибок **никогда** не следует отправлять в ветку `master`, если они не исправляют функционал, которой присутствует только в следующем релизе. 79 | 80 | **Минорный** функционал, **полностью обратно совместимый** с текущим релизом, может быть отправлен в последнюю стабильную ветку (в настоящее время `9.x`). 81 | 82 | **Мажорные** новые функции или функции с критическими изменениями всегда следует отправлять в ветку `master`, содержащую предстоящий выпуск. 83 | 84 | 85 | ## Скомпилированные ресурсы исходников 86 | 87 | Если вы отправляете изменение, которое повлияет на скомпилированные файлы, например, касательно файлов в `resources/css` или `resources/js` репозитория `laravel/laravel`, то не включайте в коммит эти скомпилированные файлы. Из-за большого размера они не могут быть реально рассмотрены сопровождающим. Это может быть использовано как способ внедрения вредоносного кода в Laravel. Чтобы предотвратить это, все скомпилированные файлы будут сгенерированы и включены в коммит сопровождающими Laravel. 88 | 89 | 90 | ## Уязвимости безопасности 91 | 92 | Если вы обнаружите уязвимость в системе безопасности Laravel, отправьте электронное письмо Тейлору Отвеллу по адресу taylor@laravel.com. Все уязвимости безопасности будут незамедлительно устранены. 93 | 94 | 95 | ## Стиль кодирования 96 | 97 | Laravel следует стандарту кодирования [PSR-2](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md) и стандарту автозагрузки [PSR- 4](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md). 98 | 99 | 100 | ### PHPDoc 101 | 102 | Ниже приведен пример валидного блока документации Laravel. Обратите внимание, что за атрибутом `@param` идут два пробела, тип аргумента, еще два пробела и, наконец, имя переменной: 103 | 104 | /** 105 | * Register a binding with the container. 106 | * 107 | * @param string|array $abstract 108 | * @param \Closure|string|null $concrete 109 | * @param bool $shared 110 | * @return void 111 | * 112 | * @throws \Exception 113 | */ 114 | public function bind($abstract, $concrete = null, $shared = false) 115 | { 116 | // 117 | } 118 | 119 | 120 | ### StyleCI 121 | 122 | Не волнуйтесь, если стиль вашего кода не идеален! [StyleCI](https://styleci.io/) автоматически объединит любые исправления стиля после слияния вашего запроса с репозиторием Laravel. Это позволяет нам сосредоточиться на содержании вашего вклада, а не на стиле кода. 123 | 124 | 125 | ## Нормы поведения 126 | 127 | Кодекс поведения Laravel основан на кодексе поведения Ruby. О любых нарушениях кодекса поведения можно сообщить Тейлору Отвеллу (taylor@laravel.com): 128 | 129 | 130 | 131 | - Участники будут терпимо относиться к противоположным взглядам. 132 | - Участники должны гарантировать, что их язык и действия не содержат личных нападок и пренебрежительных личных замечаний. 133 | - Толкуя слова и действия других, участники всегда должны исходить из добрых намерений. 134 | - Не допускается поведение, которое можно обоснованно считать преследованием. 135 | 136 | 137 | -------------------------------------------------------------------------------- /docs/csrf.md: -------------------------------------------------------------------------------- 1 | # Laravel 9 · Предотвращение атак CSRF 2 | 3 | - [Введение](#csrf-introduction) 4 | - [Предотвращение запросов от CSRF](#preventing-csrf-requests) 5 | - [Исключение URI из защиты от CSRF](#csrf-excluding-uris) 6 | - [Токен X-CSRF](#csrf-x-csrf-token) 7 | - [Токен X-XSRF](#csrf-x-xsrf-token) 8 | 9 | 10 | ## Введение 11 | 12 | Межсайтовая подделка запроса – это разновидность вредоносного эксплойта, при котором неавторизованные команды выполняются от имени аутентифицированного пользователя. К счастью, Laravel позволяет легко защитить ваше приложение от [Межсайтовой подделки запроса](https://ru.wikipedia.org/wiki/Межсайтовая_подделка_запроса) ([Сross Site Request Forgery](https://en.wikipedia.org/wiki/Cross-site_request_forgery) – CSRF). 13 | 14 | 15 | #### Объяснение уязвимости 16 | 17 | Если вы не знакомы с Межсайтовой подделкой запросов, то давайте обсудим пример того, как можно использовать эту уязвимость. Представьте, что ваше приложение имеет маршрут `/user/email`, который принимает `POST`-запрос для изменения адреса электронной почты аутентифицированного пользователя. Скорее всего, этот маршрут ожидает, что поле ввода `email` будет содержать адрес электронной почты, который пользователь хотел бы начать использовать. 18 | 19 | Без защиты от CSRF вредоносный веб-сайт может создать HTML-форму, которая указывает на маршрут вашего приложения `/user/email` и отправляет собственный адрес электронной почты злоумышленника: 20 | 21 | ```blade 22 |
23 | 24 |
25 | 26 | 29 | ``` 30 | 31 | Если вредоносный веб-сайт автоматически отправляет форму при загрузке страницы, злоумышленнику нужно только подтолкнуть ничего не подозревающего пользователя вашего приложения посетить свой веб-сайт, и его адрес электронной почты будет изменен в вашем приложении. 32 | 33 | Чтобы предотвратить эту уязвимость, нам необходимо проверять каждый входящий запрос `POST`, `PUT`, `PATCH` или `DELETE` на секретное значение сессии, к которому вредоносное приложение не может получить доступ. 34 | 35 | 36 | ## Предотвращение запросов от CSRF 37 | 38 | Laravel автоматически генерирует «токен» CSRF для каждой активной [пользовательской сессии](session.md), управляемой приложением. Этот токен используется для проверки того, что аутентифицированный пользователь действительно является лицом, выполняющим запросы к приложению. Поскольку этот токен хранится в сессии пользователя и изменяется каждый раз при повторном создании сессии, вредоносное приложение не может получить к нему доступ. 39 | 40 | К CSRF-токену текущей сессии можно получить доступ через сессию запроса или с помощью глобального помощника `csrf_token`: 41 | 42 | use Illuminate\Http\Request; 43 | 44 | Route::get('/token', function (Request $request) { 45 | $token = $request->session()->token(); 46 | 47 | $token = csrf_token(); 48 | 49 | // ... 50 | }); 51 | 52 | Каждый раз, когда вы создаете HTML-форму запросов «POST» «PUT», «PATCH» или «DELETE» в своем приложении, вы должны включать в форму скрытое поле `_token`, чтобы посредник защиты от CSRF смог выполнить проверку запроса. Для удобства вы можете использовать директиву `@csrf` Blade для создания скрытого поля ввода, содержащего этот токен: 53 | 54 | ```blade 55 |
56 | @csrf 57 | 58 | 59 | 60 |
61 | ``` 62 | 63 | [Посредник](middleware.md) `App\Http\Middleware\VerifyCsrfToken`, который по умолчанию стоит в группе посредников `web`, автоматически проверяет соответствие токена во входном запросе и токен, хранящийся в сессии. Когда эти два токена совпадают, мы знаем, что запрос инициирует аутентифицированный пользователь. 64 | 65 | 66 | ### CSRF-токены и SPA-приложения 67 | 68 | Если вы создаете SPA, который использует Laravel в качестве серверной части API, вам следует обратиться к [документации Laravel Sanctum](sanctum.md) для получения информации об аутентификации с помощью вашего API и защите от уязвимостей CSRF. 69 | 70 | 71 | ### Исключение URI из защиты от CSRF 72 | 73 | По желанию можно исключить набор URI из защиты от CSRF. Например, если вы используете [Stripe](https://stripe.com) для обработки платежей и используете их систему веб-хуков, то вам нужно будет исключить маршрут обработчика веб-хуков Stripe из защиты от CSRF, поскольку Stripe не будет знать, какой токен CSRF отправить вашим маршрутам. 74 | 75 | Как правило, вы должны размещать эти виды маршрутов вне группы посредников `web`, которую `App\Providers\RouteServiceProvider` применяет ко всем маршрутам в файле `routes/web.php`. Однако, вы также можете исключить маршруты, добавив их URI в свойство `$except` посредника `VerifyCsrfToken`: 76 | 77 | **Примечание**\ 98 | > Для удобства посредник CSRF автоматически отключается для всех маршрутов при [выполнение тестов](testing.md). 99 | 100 | 101 | ## Токен X-CSRF 102 | 103 | В дополнение к проверке токена CSRF в качестве параметра POST-запроса посредник `App\Http\Middleware\VerifyCsrfToken` также проверяет заголовок запроса `X-CSRF-TOKEN`. Вы можете, например, сохранить токен в HTML-теге `meta`: 104 | 105 | ```blade 106 | 107 | ``` 108 | 109 | Затем, вы можете указать библиотеке, такой как jQuery, автоматически добавлять токен во все заголовки запросов. Это обеспечивает простую и удобную защиту от CSRF для ваших приложений с использованием устаревшей технологии JavaScript на основе AJAX: 110 | 111 | ```js 112 | $.ajaxSetup({ 113 | headers: { 114 | 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') 115 | } 116 | }); 117 | ``` 118 | 119 | 120 | ## Токен X-XSRF 121 | 122 | Laravel хранит текущий токен CSRF в зашифрованном файле Cookies `XSRF-TOKEN`, который содержится в каждом ответе, генерируемым фреймворком. Вы можете использовать значение Cookies для установки заголовка запроса `X-XSRF-TOKEN`. 123 | 124 | Этот файл Cookies, в первую очередь, отправляется для удобства разработчика, поскольку некоторые фреймворки и библиотеки JavaScript, такие как Angular и Axios, автоматически помещают его значение в заголовок `X-XSRF-TOKEN` в запросах с одним и тем же источником. 125 | 126 | > **Примечание**\ 127 | > По умолчанию файл `resources/js/bootstrap.js` включает HTTP-библиотеку Axios, которая автоматически отправляет заголовок `X-XSRF-TOKEN`. 128 | -------------------------------------------------------------------------------- /docs/database-testing.md: -------------------------------------------------------------------------------- 1 | # Laravel 9 · Тестирование · База данных 2 | 3 | - [Введение](#introduction) 4 | - [Сброс базы данных после каждого теста](#resetting-the-database-after-each-test) 5 | - [Фабрики моделей](#model-factories) 6 | - [Запуск наполнителей](#running-seeders) 7 | - [Доступные утверждения](#available-assertions) 8 | 9 | 10 | ## Введение 11 | 12 | Laravel предлагает множество полезных инструментов и утверждений, чтобы упростить тестирование приложений, управляемых базой данных. Кроме того, фабрики моделей и наполнители Laravel позволяют безболезненно создавать записи тестовой базы данных с использованием моделей и отношений Eloquent вашего приложения. Мы обсудим все эти мощные функции в текущей документации. 13 | 14 | 15 | ### Сброс базы данных после каждого теста 16 | 17 | Прежде чем продолжить, давайте обсудим, как сбрасывать вашу базу данных после каждого из ваших тестов, чтобы данные из предыдущего теста не мешали последующим тестам. Включенный в Laravel трейт `Illuminate\Foundation\Testing\RefreshDatabase` позаботится об этом за вас. Просто используйте трейт в своем тестовом классе: 18 | 19 | get('/'); 39 | 40 | // ... 41 | } 42 | } 43 | 44 | Трейт `Illuminate\Foundation\Testing\RefreshDatabase` не мигрирует вашу базу данных, если ваша схема обновлена. Вместо этого он будет выполнять тест только в транзакции базы данных. Следовательно, любые записи, добавленные в базу данных тестом, не использующими этот трейт, могут по-прежнему существовать в базе данных. 45 | 46 | Если вы хотите полностью сбросить базу данных с помощью миграции, то вы можете вместо этого использовать трейт `Illuminate\Foundation\Testing\DatabaseMigrations`. Однако использование трейта `DatabaseMigrations` значительно медленнее, чем использование трейта `RefreshDatabase`. 47 | 48 | 49 | ## Фабрики моделей 50 | 51 | При тестировании вам может потребоваться вставить несколько записей в вашу базу данных перед выполнением теста. Вместо того, чтобы вручную указывать значение каждого столбца при создании этих тестовых данных, Laravel позволяет вам определять набор атрибутов по умолчанию для каждой из ваших [моделей Eloquent](eloquent.md), используя [фабрики моделей](eloquent-factories.md). 52 | 53 | Чтобы узнать больше о создании и использовании фабрик моделей, обратитесь к полной [документации фабрики моделей](eloquent-factories.md). После того, как вы определили фабрику модели, вы можете использовать фабрику в своем тесте для создания моделей: 54 | 55 | use App\Models\User; 56 | 57 | public function test_models_can_be_instantiated() 58 | { 59 | $user = User::factory()->create(); 60 | 61 | // ... 62 | } 63 | 64 | 65 | ## Запуск наполнителей 66 | 67 | Если вы хотите использовать [наполнители базы данных](seeding.md) для наполнения вашей базы данных во время функционального тестирования, то вы можете вызвать метод `seed`. По умолчанию метод `seed` будет запускать `DatabaseSeeder`, который должен запускать все другие ваши наполнители. Как вариант, вы можете передать конкретное имя класса-наполнителя методу `seed`: 68 | 69 | seed(); 92 | 93 | // Запустить конкретный наполнитель ... 94 | $this->seed(OrderStatusSeeder::class); 95 | 96 | // ... 97 | 98 | // Запустить массив определенных наполнителей ... 99 | $this->seed([ 100 | OrderStatusSeeder::class, 101 | TransactionStatusSeeder::class, 102 | // ... 103 | ]); 104 | } 105 | } 106 | 107 | В качестве альтернативы вы можете указать Laravel автоматически заполнять базу данных перед каждым тестом, использующим трейт `RefreshDatabase`. Вы можете добиться этого, определив свойство `$seed` в вашем базовом тестовом классе: 108 | 109 | 139 | ## Доступные утверждения 140 | 141 | Laravel содержит несколько утверждений базы данных для ваших функциональных тестов [PHPUnit](https://phpunit.de/). Мы обсудим каждое из этих утверждений ниже. 142 | 143 | 144 | #### assertDatabaseCount 145 | 146 | Утверждение о том, что таблица в базе данных содержит указанное количество записей: 147 | 148 | $this->assertDatabaseCount('users', 5); 149 | 150 | 151 | #### assertDatabaseHas 152 | 153 | Утверждение о том, что таблица в базе данных содержит записи, соответствующие переданным ключ / значение ограничениям запроса: 154 | 155 | $this->assertDatabaseHas('users', [ 156 | 'email' => 'sally@example.com', 157 | ]); 158 | 159 | 160 | #### assertDatabaseMissing 161 | 162 | Утверждение о том, что таблица в базе данных не содержит записей, соответствующих переданным ключ / значение ограничениям запроса: 163 | 164 | $this->assertDatabaseMissing('users', [ 165 | 'email' => 'sally@example.com', 166 | ]); 167 | 168 | 169 | #### assertSoftDeleted 170 | 171 | Метод `assertSoftDeleted` используется для утверждения того, что переданная модель Eloquent была «программно удалена»: 172 | 173 | $this->assertSoftDeleted($user); 174 | 175 | 176 | #### assertNotSoftDeleted 177 | 178 | Метод `assertSoftDeleted` используется для утверждения того, что переданная модель Eloquent не была «программно удалена»: 179 | 180 | $this->assertNotSoftDeleted($user); 181 | 182 | 183 | #### assertModelExists 184 | 185 | Утверждение о том, что переданная модель существует в базе данных: 186 | 187 | use App\Models\User; 188 | 189 | $user = User::factory()->create(); 190 | 191 | $this->assertModelExists($user); 192 | 193 | 194 | #### assertModelMissing 195 | 196 | Утверждение о том, что переданная модель не существует в базе данных: 197 | 198 | use App\Models\User; 199 | 200 | $user = User::factory()->create(); 201 | 202 | $user->delete(); 203 | 204 | $this->assertModelMissing($user); 205 | -------------------------------------------------------------------------------- /docs/deployment.md: -------------------------------------------------------------------------------- 1 | # Laravel 9 · Развертывание 2 | 3 | - [Введение](#introduction) 4 | - [Требования к серверу](#server-requirements) 5 | - [Конфигурация сервера](#server-configuration) 6 | - [Nginx](#nginx) 7 | - [Оптимизация](#optimization) 8 | - [Оптимизация автозагрузчика](#autoloader-optimization) 9 | - [Оптимизация загрузки конфигурации](#optimizing-configuration-loading) 10 | - [Оптимизация загрузки маршрута](#optimizing-route-loading) 11 | - [Оптимизация загрузки шаблонов](#optimizing-view-loading) 12 | - [Режим отладки](#debug-mode) 13 | - [Развертывание с помощью Forge / Vapor](#deploying-with-forge-or-vapor) 14 | 15 | 16 | ## Введение 17 | 18 | Когда вы будете готовы развернуть свое приложение Laravel в эксплуатационном окружении, вы должны сделать несколько важных вещей, чтобы убедиться, что ваше приложение работает максимально эффективно. В этой документации мы рассмотрим несколько отличных отправных точек, чтобы убедиться, что ваше приложение Laravel развернуто правильно. 19 | 20 | 21 | ## Требования к серверу 22 | 23 | Фреймворк Laravel имеет несколько системных требований. Вы должны убедиться, что ваш веб-сервер имеет следующую минимальную версию PHP и расширения: 24 | 25 | 26 | 27 | - PHP >= 8.0 28 | - Расширение PHP BCMath 29 | - Расширение PHP Ctype 30 | - Расширение PHP cURL 31 | - Расширение PHP DOM 32 | - Расширение PHP Fileinfo 33 | - Расширение PHP JSON 34 | - Расширение PHP Mbstring 35 | - Расширение PHP OpenSSL 36 | - Расширение PHP PCRE 37 | - Расширение PHP PDO 38 | - Расширение PHP Tokenizer 39 | - Расширение PHP XML 40 | 41 | 42 | 43 | 44 | ## Конфигурация сервера 45 | 46 | 47 | ### Nginx 48 | 49 | Если вы развертываете свое приложение на сервере, на котором работает Nginx, то вы можете использовать следующий конфигурационный файл в качестве отправной точки для настройки веб-сервера. Скорее всего, этот файл нужно будет настроить в зависимости от конфигурации вашего сервера. **Если вам нужна помощь в управлении вашим сервером, рассмотрите возможность использования собственной службы управления и развертывания серверов Laravel, такой как [Laravel Forge](https://forge.laravel.com).** 50 | 51 | Убедитесь, что, как и в конфигурации ниже, ваш веб-сервер направляет все запросы в файл `public/index.php` вашего приложения. Вы никогда не должны пытаться переместить файл `index.php` в корень вашего проекта, поскольку обслуживание приложения из корня проекта откроет доступ ко многим конфиденциальным файлам конфигурации из общедоступной сети Интернет: 52 | 53 | ```nginx 54 | server { 55 | listen 80; 56 | listen [::]:80; 57 | server_name example.com; 58 | root /srv/example.com/public; 59 | 60 | add_header X-Frame-Options "SAMEORIGIN"; 61 | add_header X-Content-Type-Options "nosniff"; 62 | 63 | index index.php; 64 | 65 | charset utf-8; 66 | 67 | location / { 68 | try_files $uri $uri/ /index.php?$query_string; 69 | } 70 | 71 | location = /favicon.ico { access_log off; log_not_found off; } 72 | location = /robots.txt { access_log off; log_not_found off; } 73 | 74 | error_page 404 /index.php; 75 | 76 | location ~ \.php$ { 77 | fastcgi_pass unix:/var/run/php/php8.0-fpm.sock; 78 | fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; 79 | include fastcgi_params; 80 | } 81 | 82 | location ~ /\.(?!well-known).* { 83 | deny all; 84 | } 85 | } 86 | ``` 87 | 88 | 89 | ## Оптимизация 90 | 91 | 92 | ### Оптимизация автозагрузчика 93 | 94 | При развертывании в эксплуатационном окружении, убедитесь, что вы оптимизировали файл автозагрузчика классов Composer, чтобы он мог быстро найти нужный файл для загрузки конкретного класса: 95 | 96 | ```shell 97 | composer install --optimize-autoloader --no-dev 98 | ``` 99 | 100 | > **Примечание**\ 101 | > Помимо оптимизации автозагрузчика, вы всегда должны обязательно включать файл `composer.lock` в репозиторий системы управления версиями вашего проекта. Зависимости вашего проекта могут быть установлены намного быстрее, если присутствует файл `composer.lock`. 102 | 103 | 104 | ### Оптимизация загрузки конфигурации 105 | 106 | При развертывании вашего приложения в эксплуатационном окружении, вы должны убедиться, что вы выполнили команду `config:cache` Artisan в процессе развертывания: 107 | 108 | ```shell 109 | php artisan config:cache 110 | ``` 111 | 112 | Эта команда объединит все файлы конфигурации Laravel в один кешированный файл, что значительно сократит количество обращений, которые фреймворк должен совершить к файловой системе при загрузке значений вашей конфигурации. 113 | 114 | > **Предупреждение**\ 115 | > Если вы выполняете команду `config:cache` в процессе развертывания, вы должны быть уверены, что вызываете функцию `env` только из ваших файлов конфигурации. После кеширования конфигурации файл `.env` не будет загружаться, и все вызовы функции `env` для переменных файла `.env` вернут `null`. 116 | 117 | 118 | ### Оптимизация загрузки маршрута 119 | 120 | Если вы создаете большое приложение с множеством маршрутов, вам следует убедиться, что вы выполнили команду `route:cache` Artisan в процессе развертывания: 121 | 122 | ```shell 123 | php artisan route:cache 124 | ``` 125 | 126 | Эта команда сокращает регистрации всех маршрутов до одного вызова метода в кешированном файле, повышая производительность при регистрации сотен маршрутов. 127 | 128 | 129 | ### Оптимизация загрузки шаблонов 130 | 131 | При развертывании вашего приложения в эксплуатационном окружении, вы должны убедиться, что вы выполнили команду `view:cache` Artisan в процессе развертывания: 132 | 133 | ```shell 134 | php artisan view:cache 135 | ``` 136 | 137 | Эта команда предварительно скомпилирует все ваши шаблоны Blade, чтобы они не компилировались во время запроса, повышая производительность каждого запроса, возвращающего шаблоном. 138 | 139 | 140 | ## Режим отладки 141 | 142 | Параметр отладки `debug` в конфигурационном файле `config/app.php` определяет, сколько информации об ошибке фактически отображается пользователю. По умолчанию для этого параметра задано значение переменной окружения `APP_DEBUG`, которая хранится в файле `.env` вашего приложения. 143 | 144 | **В вашем эксплуатационном окружении это значение всегда должно быть `false`. Если значение для переменной `APP_DEBUG` установлено как `true`, то вы рискуете раскрыть конфиденциальные значения конфигурации конечным пользователям вашего приложения.** 145 | 146 | 147 | ## Развертывание с помощью Forge / Vapor 148 | 149 | 150 | #### Laravel Forge 151 | 152 | Если вы не совсем готовы управлять конфигурацией своего собственного сервера или вам неудобно настраивать все различные службы, необходимые для запуска надежного приложения Laravel, то [Laravel Forge](https://forge.laravel.com) – замечательная альтернатива. 153 | 154 | Laravel Forge может создавать серверы на различных поставщиках инфраструктуры, таких как DigitalOcean, Linode, AWS и других. Кроме того, Forge устанавливает и управляет всеми инструментами, необходимыми для создания надежных приложений Laravel, таких как Nginx, MySQL, Redis, Memcached, Beanstalk и других. 155 | 156 | > **Примечание**\ 157 | > Хотите полное руководство по развертыванию с помощью Laravel Forge? Посетите [Laravel Bootcamp](https://bootcamp.laravel.com/deploying) и серии видео о Forge, [доступные на Laracasts](https://laracasts.com/series/learn-laravel-forge-2022-edition). 158 | 159 | 160 | #### Laravel Vapor 161 | 162 | Если вам нужна полностью бессерверная платформа развертывания с автоматическим масштабированием, настроенная для Laravel, ознакомьтесь с [Laravel Vapor](https://vapor.laravel.com). Laravel Vapor – это платформа для бессерверного развертывания Laravel, работающая на AWS. Запустите свою инфраструктуру Laravel на Vapor и влюбитесь в масштабируемую простоту бессерверной архитектуры. Laravel Vapor настроен создателями Laravel для бесперебойной работы с фреймворком, поэтому вы можете продолжать писать свои приложения Laravel точно так, как вы привыкли. 163 | -------------------------------------------------------------------------------- /docs/documentation.md: -------------------------------------------------------------------------------- 1 | - ## Prologue 2 | - [Release Notes](/docs/{{version}}/releases) 3 | - [Upgrade Guide](/docs/{{version}}/upgrade) 4 | - [Contribution Guide](/docs/{{version}}/contributions) 5 | - ## Getting Started 6 | - [Installation](/docs/{{version}}/installation) 7 | - [Configuration](/docs/{{version}}/configuration) 8 | - [Directory Structure](/docs/{{version}}/structure) 9 | - [Frontend](/docs/{{version}}/frontend) 10 | - [Starter Kits](/docs/{{version}}/starter-kits) 11 | - [Deployment](/docs/{{version}}/deployment) 12 | - ## Architecture Concepts 13 | - [Request Lifecycle](/docs/{{version}}/lifecycle) 14 | - [Service Container](/docs/{{version}}/container) 15 | - [Service Providers](/docs/{{version}}/providers) 16 | - [Facades](/docs/{{version}}/facades) 17 | - ## The Basics 18 | - [Routing](/docs/{{version}}/routing) 19 | - [Middleware](/docs/{{version}}/middleware) 20 | - [CSRF Protection](/docs/{{version}}/csrf) 21 | - [Controllers](/docs/{{version}}/controllers) 22 | - [Requests](/docs/{{version}}/requests) 23 | - [Responses](/docs/{{version}}/responses) 24 | - [Views](/docs/{{version}}/views) 25 | - [Blade Templates](/docs/{{version}}/blade) 26 | - [Asset Bundling](/docs/{{version}}/vite) 27 | - [URL Generation](/docs/{{version}}/urls) 28 | - [Session](/docs/{{version}}/session) 29 | - [Validation](/docs/{{version}}/validation) 30 | - [Error Handling](/docs/{{version}}/errors) 31 | - [Logging](/docs/{{version}}/logging) 32 | - ## Digging Deeper 33 | - [Artisan Console](/docs/{{version}}/artisan) 34 | - [Broadcasting](/docs/{{version}}/broadcasting) 35 | - [Cache](/docs/{{version}}/cache) 36 | - [Collections](/docs/{{version}}/collections) 37 | - [Contracts](/docs/{{version}}/contracts) 38 | - [Events](/docs/{{version}}/events) 39 | - [File Storage](/docs/{{version}}/filesystem) 40 | - [Helpers](/docs/{{version}}/helpers) 41 | - [HTTP Client](/docs/{{version}}/http-client) 42 | - [Localization](/docs/{{version}}/localization) 43 | - [Mail](/docs/{{version}}/mail) 44 | - [Notifications](/docs/{{version}}/notifications) 45 | - [Package Development](/docs/{{version}}/packages) 46 | - [Queues](/docs/{{version}}/queues) 47 | - [Rate Limiting](/docs/{{version}}/rate-limiting) 48 | - [Task Scheduling](/docs/{{version}}/scheduling) 49 | - ## Security 50 | - [Authentication](/docs/{{version}}/authentication) 51 | - [Authorization](/docs/{{version}}/authorization) 52 | - [Email Verification](/docs/{{version}}/verification) 53 | - [Encryption](/docs/{{version}}/encryption) 54 | - [Hashing](/docs/{{version}}/hashing) 55 | - [Password Reset](/docs/{{version}}/passwords) 56 | - ## Database 57 | - [Getting Started](/docs/{{version}}/database) 58 | - [Query Builder](/docs/{{version}}/queries) 59 | - [Pagination](/docs/{{version}}/pagination) 60 | - [Migrations](/docs/{{version}}/migrations) 61 | - [Seeding](/docs/{{version}}/seeding) 62 | - [Redis](/docs/{{version}}/redis) 63 | - ## Eloquent ORM 64 | - [Getting Started](/docs/{{version}}/eloquent) 65 | - [Relationships](/docs/{{version}}/eloquent-relationships) 66 | - [Collections](/docs/{{version}}/eloquent-collections) 67 | - [Mutators / Casts](/docs/{{version}}/eloquent-mutators) 68 | - [API Resources](/docs/{{version}}/eloquent-resources) 69 | - [Serialization](/docs/{{version}}/eloquent-serialization) 70 | - [Factories](/docs/{{version}}/eloquent-factories) 71 | - ## Testing 72 | - [Getting Started](/docs/{{version}}/testing) 73 | - [HTTP Tests](/docs/{{version}}/http-tests) 74 | - [Console Tests](/docs/{{version}}/console-tests) 75 | - [Browser Tests](/docs/{{version}}/dusk) 76 | - [Database](/docs/{{version}}/database-testing) 77 | - [Mocking](/docs/{{version}}/mocking) 78 | - ## Packages 79 | - [Breeze](/docs/{{version}}/starter-kits#laravel-breeze) 80 | - [Cashier (Stripe)](/docs/{{version}}/billing) 81 | - [Cashier (Paddle)](/docs/{{version}}/cashier-paddle) 82 | - [Dusk](/docs/{{version}}/dusk) 83 | - [Envoy](/docs/{{version}}/envoy) 84 | - [Fortify](/docs/{{version}}/fortify) 85 | - [Homestead](/docs/{{version}}/homestead) 86 | - [Horizon](/docs/{{version}}/horizon) 87 | - [Jetstream](https://jetstream.laravel.com) 88 | - [Mix](/docs/{{version}}/mix) 89 | - [Octane](/docs/{{version}}/octane) 90 | - [Passport](/docs/{{version}}/passport) 91 | - [Pint](/docs/{{version}}/pint) 92 | - [Sail](/docs/{{version}}/sail) 93 | - [Sanctum](/docs/{{version}}/sanctum) 94 | - [Scout](/docs/{{version}}/scout) 95 | - [Socialite](/docs/{{version}}/socialite) 96 | - [Telescope](/docs/{{version}}/telescope) 97 | - [Valet](/docs/{{version}}/valet) 98 | - [API Documentation](/api/9.x) 99 | -------------------------------------------------------------------------------- /docs/eloquent-collections.md: -------------------------------------------------------------------------------- 1 | # Laravel 9 · Eloquent · Коллекции 2 | 3 | - [Введение](#introduction) 4 | - [Доступные методы](#available-methods) 5 | - [Пользовательские коллекции](#custom-collections) 6 | 7 | 8 | ## Введение 9 | 10 | Все методы Eloquent, которые возвращают более одного результата модели, будут возвращать экземпляры класса `Illuminate\Database\Eloquent\Collection`, включая результаты, полученные с помощью метода `get` или доступные через отношения. Объект коллекции Eloquent расширяет [базовую коллекцию](collections.md) Laravel, поэтому он естественным образом наследует десятки методов, использующих в работе текучий интерфейс с базовым массивом моделей Eloquent. Обязательно ознакомьтесь с документацией по коллекции Laravel, чтобы узнать все об этих полезных методах! 11 | 12 | Все коллекции также являются итераторами, что позволяет вам перебирать их, как если бы они были простыми массивами PHP: 13 | 14 | use App\Models\User; 15 | 16 | $users = User::where('active', 1)->get(); 17 | 18 | foreach ($users as $user) { 19 | echo $user->name; 20 | } 21 | 22 | Однако, как упоминалось ранее, коллекции намного мощнее массивов и предоставляют множество методов типа `map` / `reduce`, которые могут быть связаны с помощью интуитивно понятного интерфейса. Например, мы можем удалить все неактивные модели, а затем собрать имена оставшихся пользователей: 23 | 24 | $names = User::all()->reject(function ($user) { 25 | return $user->active === false; 26 | })->map(function ($user) { 27 | return $user->name; 28 | }); 29 | 30 | 31 | #### Преобразование коллекций Eloquent 32 | 33 | В то время как большинство методов коллекции Eloquent возвращают новый экземпляр коллекции Eloquent, методы `collapse`, `flatten`, `flip`, `keys`, `pluck` и `zip` возвращают экземпляр [базовой коллекции](collections.md ). Аналогично, если метод `map` возвращает коллекцию, не содержащую никаких моделей Eloquent, она будет преобразована в экземпляр базовой коллекции. 34 | 35 | 36 | ## Доступные методы 37 | 38 | Все коллекции Eloquent расширяют базовый класс [коллекций Laravel](collections.md#available-methods); поэтому они наследуют все мощные методы, предоставляемые классом базовой коллекции. 39 | 40 | Кроме того, класс `Illuminate\Database\Eloquent\Collection` содержит расширенный набор методов, помогающих управлять коллекциями моделей. Большинство методов возвращают экземпляры `Illuminate\Database\Eloquent\Collection`; однако некоторые методы, такие как `modelKeys`, возвращают экземпляр `Illuminate\Support\Collection`. 41 | 42 | 62 | 63 | 64 | 65 | - [append](#method-append) 66 | - [contains](#method-contains) 67 | - [diff](#method-diff) 68 | - [except](#method-except) 69 | - [find](#method-find) 70 | - [fresh](#method-fresh) 71 | - [intersect](#method-intersect) 72 | - [load](#method-load) 73 | - [loadMissing](#method-loadMissing) 74 | - [modelKeys](#method-modelKeys) 75 | - [makeVisible](#method-makeVisible) 76 | - [makeHidden](#method-makeHidden) 77 | - [only](#method-only) 78 | - [setVisible](#method-setVisible) 79 | - [setHidden](#method-setHidden) 80 | - [toQuery](#method-toquery) 81 | - [unique](#method-unique) 82 | 83 | 84 | 85 | 86 | #### `append($attributes)` 87 | 88 | Метод `append`используется для указания того, что атрибут должен быть [добавлен](eloquent-serialization.md#appending-values-to-json) для каждой модели в коллекции. Этот метод принимает один атрибут или массив атрибутов: 89 | 90 | $users->append('team'); 91 | 92 | $users->append(['team', 'is_admin']); 93 | 94 | 95 | #### `contains($key, $operator = null, $value = null)` 96 | 97 | Метод `contains` используется для определения того, содержится ли переданный экземпляр модели в коллекции. Этот метод принимает первичный ключ или экземпляр модели: 98 | 99 | $users->contains(1); 100 | 101 | $users->contains(User::find(1)); 102 | 103 | 104 | #### `diff($items)` 105 | 106 | Метод `diff` возвращает все модели, которых нет в переданной коллекции: 107 | 108 | use App\Models\User; 109 | 110 | $users = $users->diff(User::whereIn('id', [1, 2, 3])->get()); 111 | 112 | 113 | #### `except($keys)` 114 | 115 | Метод `except` возвращает все модели, у которых нет переданных первичных ключей: 116 | 117 | $users = $users->except([1, 2, 3]); 118 | 119 | 120 | #### `find($key)` 121 | 122 | Метод `find` возвращает модель, у которой есть первичный ключ, соответствующий переданному ключу. Если `$key` является экземпляром модели, `find` попытается вернуть модель, соответствующую первичному ключу. Если `$key` является массивом ключей, `find` вернет все модели, у которых есть первичный ключ в переданном массиве: 123 | 124 | $users = User::all(); 125 | 126 | $user = $users->find(1); 127 | 128 | 129 | #### `fresh($with = [])` 130 | 131 | Метод `fresh` извлекает из базы данных свежий экземпляр каждой модели в коллекции. Кроме того, будут загружены любые указанные отношения: 132 | 133 | $users = $users->fresh(); 134 | 135 | $users = $users->fresh('comments'); 136 | 137 | 138 | #### `intersect($items)` 139 | 140 | Метод `intersect` возвращает все модели, которые также присутствуют в переданной коллекции: 141 | 142 | use App\Models\User; 143 | 144 | $users = $users->intersect(User::whereIn('id', [1, 2, 3])->get()); 145 | 146 | 147 | #### `load($relations)` 148 | 149 | Метод `load` нетерпеливо загружает указанные отношения для всех моделей в коллекции: 150 | 151 | $users->load(['comments', 'posts']); 152 | 153 | $users->load('comments.author'); 154 | 155 | $users->load(['comments', 'posts' => fn ($query) => $query->where('active', 1)]); 156 | 157 | 158 | #### `loadMissing($relations)` 159 | 160 | Метод `loadMissing` нетерпеливо загружает указанные отношения для всех моделей в коллекции, если отношения еще не загружены: 161 | 162 | $users->loadMissing(['comments', 'posts']); 163 | 164 | $users->loadMissing('comments.author'); 165 | 166 | $users->loadMissing(['comments', 'posts' => fn ($query) => $query->where('active', 1)]); 167 | 168 | 169 | #### `modelKeys()` 170 | 171 | Метод `modelKeys` возвращает первичные ключи для всех моделей в коллекции: 172 | 173 | $users->modelKeys(); 174 | 175 | // [1, 2, 3, 4, 5] 176 | 177 | 178 | #### `makeVisible($attributes)` 179 | 180 | Метод `makeVisible` [делает видимыми атрибуты](eloquent-serialization.md#hiding-attributes-from-json), которые обычно «скрыты» для каждой модели коллекции: 181 | 182 | $users = $users->makeVisible(['address', 'phone_number']); 183 | 184 | 185 | #### `makeHidden($attributes)` 186 | 187 | Метод `makeHidden` [скрывает атрибуты](eloquent-serialization.md#hiding-attributes-from-json), которые обычно «видны» для каждой модели в коллекции: 188 | 189 | $users = $users->makeHidden(['address', 'phone_number']); 190 | 191 | 192 | #### `only($keys)` 193 | 194 | Метод `only` возвращает все модели с указанными первичными ключами: 195 | 196 | $users = $users->only([1, 2, 3]); 197 | 198 | 199 | #### `setVisible($attributes)` 200 | 201 | Метод `setVisible` [временно переопределяет](eloquent-serialization.md#temporarily-modifying-attribute-visibility) все видимые атрибуты каждой модели в коллекции: 202 | 203 | $users = $users->setVisible(['id', 'name']); 204 | 205 | 206 | #### `setHidden($attributes)` 207 | 208 | Метод `setHidden` [временно переопределяет](eloquent-serialization.md#temporarily-modifying-attribute-visibility) все скрытые атрибуты каждой модели в коллекции: 209 | 210 | $users = $users->setHidden(['email', 'password', 'remember_token']); 211 | 212 | 213 | #### `toQuery()` 214 | 215 | Метод `toQuery` возвращает экземпляр построителя запросов Eloquent, содержащий ограничение `whereIn` для первичных ключей модели коллекции: 216 | 217 | use App\Models\User; 218 | 219 | $users = User::where('status', 'VIP')->get(); 220 | 221 | $users->toQuery()->update([ 222 | 'status' => 'Administrator', 223 | ]); 224 | 225 | 226 | #### `unique($key = null, $strict = false)` 227 | 228 | Метод `unique` возвращает все уникальные модели в коллекции. Все модели того же типа с тем же первичным ключом, что и другая модель в коллекции, удаляются: 229 | 230 | $users = $users->unique(); 231 | 232 | 233 | ## Пользовательские коллекции 234 | 235 | Если вы хотите использовать пользовательский класс `Collection` при взаимодействии с конкретной моделью, вы можете определить метод `newCollection` модели: 236 | 237 | 12 | ## Введение 13 | 14 | При создании API-интерфейсов с использованием Laravel вам часто нужно преобразовывать свои модели и отношения в массивы или JSON. Eloquent включает удобные методы для выполнения этих преобразований, а также для управления тем, какие атрибуты включаются в сериализованное представление ваших моделей. 15 | 16 | > **Примечание**\ 17 | > Чтобы получить еще более надежный способ обработки JSON-сериализации модели Eloquent и коллекции, ознакомьтесь с документацией на [Ресурсы API Eloquent](eloquent-resources.md). 18 | 19 | 20 | ## Сериализация моделей и коллекций 21 | 22 | 23 | ### Сериализация в массивы 24 | 25 | Чтобы преобразовать модель и ее загруженные [отношения](eloquent-relationships.md) в массив, вы должны использовать метод `toArray`. Этот метод является рекурсивным, поэтому все атрибуты и все отношения (включая отношения отношений) будут преобразованы в массивы: 26 | 27 | use App\Models\User; 28 | 29 | $user = User::with('roles')->first(); 30 | 31 | return $user->toArray(); 32 | 33 | Метод `attributesToArray` используется для преобразования атрибутов модели в массив, но не его отношений: 34 | 35 | $user = User::first(); 36 | 37 | return $user->attributesToArray(); 38 | 39 | Вы также можете преобразовать целые [коллекции](eloquent-collections.md) моделей в массивы, вызвав метод `toArray` экземпляра коллекции: 40 | 41 | $users = User::all(); 42 | 43 | return $users->toArray(); 44 | 45 | 46 | ### Сериализация в JSON 47 | 48 | Чтобы преобразовать модель в JSON, вы должны использовать метод `toJson`. Как и `toArray`, метод `toJson` является рекурсивным, поэтому все атрибуты и отношения будут преобразованы в JSON. Вы также можете указать любые параметры кодировки JSON, которые [поддерживаются PHP](https://www.php.net/manual/ru/function.json-encode.php): 49 | 50 | use App\Models\User; 51 | 52 | $user = User::find(1); 53 | 54 | return $user->toJson(); 55 | 56 | return $user->toJson(JSON_PRETTY_PRINT); 57 | 58 | В качестве альтернативы вы можете преобразовать модель или коллекцию в строку, которая автоматически вызовет метод `toJson` модели или коллекции: 59 | 60 | return (string) User::find(1); 61 | 62 | Поскольку модели и коллекции преобразуются в JSON при преобразовании в строку, вы можете возвращать объекты Eloquent непосредственно из маршрутов или контроллеров вашего приложения. Laravel автоматически сериализует ваши модели и коллекции Eloquent в JSON, когда они возвращаются из маршрутов или контроллеров: 63 | 64 | Route::get('users', function () { 65 | return User::all(); 66 | }); 67 | 68 | 69 | #### Отношения 70 | 71 | Когда модель Eloquent преобразуется в JSON, ее загруженные отношения автоматически включаются в качестве атрибутов в объект JSON. Кроме того, хотя методы-отношения Eloquent определены с использованием имен методов в «верблюжьей нотации», атрибут JSON отношения будет в «змеиной нотации». 72 | 73 | 74 | ## Скрытие атрибутов из JSON 75 | 76 | По желанию можно исключить атрибуты, такие как пароли, содержащиеся в массиве модели или представлении JSON. Для этого добавьте в модель свойство `$hidden`. Атрибуты, перечисленные в массиве свойств `$hidden`, не будут включены в сериализованное представление модели: 77 | 78 | **Примечание**\ 95 | > Чтобы скрыть отношения, добавьте имя метода-отношения к свойству `$hidden` модели Eloquent. 96 | 97 | В качестве альтернативы вы можете использовать свойство `visible` для определения «разрешенного списка» атрибутов, которые должны быть включены в массив модели и представление JSON. Все атрибуты, отсутствующие в массиве `$visible`, будут скрыты при преобразовании модели в массив или JSON: 98 | 99 | 116 | #### Временное изменение видимости атрибута 117 | 118 | По желанию можно сделать некоторые обычно скрытые атрибуты видимыми на конкретном экземпляре модели, для этого используйте метод `makeVisible`. Метод `makeVisible` возвращает экземпляр модели: 119 | 120 | return $user->makeVisible('attribute')->toArray(); 121 | 122 | Аналогично, если вы хотите скрыть некоторые атрибуты, которые обычно видны, то вы можете использовать метод `makeHidden`: 123 | 124 | return $user->makeHidden('attribute')->toArray(); 125 | 126 | Если вы хотите временно переопределить все видимые или скрытые атрибуты, то вы можете использовать методы `setVisible` и `setHidden` соответственно: 127 | 128 | return $user->setVisible(['id', 'name'])->toArray(); 129 | 130 | return $user->setHidden(['email', 'password', 'remember_token'])->toArray(); 131 | 132 | 133 | ## Добавление значений в JSON 134 | 135 | Иногда при преобразовании моделей в массивы или JSON вы можете добавить атрибуты, которым нет соответствующего столбца в вашей базе данных. Для этого сначала определите [аксессоры](eloquent-mutators.md) для значения: 136 | 137 | 'yes', 155 | ); 156 | } 157 | } 158 | 159 | После создания аксессора добавьте имя атрибута к свойству `appends` модели. Обратите внимание, что на имена атрибутов обычно ссылаются в «змеиной нотации», даже если аксессор определяется с помощью «верблюжьей нотации»: 160 | 161 | 180 | #### Добавление во время запроса 181 | 182 | Во время выполнения скрипта вы можете указать экземпляру модели добавить дополнительные атрибуты с помощью метода `append`. Или вы можете использовать метод `setAppends`, чтобы переопределить весь массив добавленных свойств для конкретного экземпляра модели: 183 | 184 | return $user->append('is_admin')->toArray(); 185 | 186 | return $user->setAppends(['is_admin'])->toArray(); 187 | 188 | 189 | ## Сериализация Даты 190 | 191 | 192 | #### Настройка формата даты по умолчанию 193 | 194 | Вы можете настроить формат сериализации по умолчанию для всех дат вашей модели, переопределив метод `serializeDate` вашей модели. Этот метод не влияет на форматирование дат для их сохранения в базе данных: 195 | 196 | /** 197 | * Подготовить дату для сериализации массива / JSON. 198 | * 199 | * @param \DateTimeInterface $date 200 | * @return string 201 | */ 202 | protected function serializeDate(DateTimeInterface $date) 203 | { 204 | return $date->format('Y-m-d'); 205 | } 206 | 207 | 208 | #### Настройка формата даты для каждого атрибута 209 | 210 | Вы можете настроить формат сериализации отдельных атрибутов даты, указав формат даты при [объявлении типизации](eloquent-mutators.md#attribute-casting) модели: 211 | 212 | protected $casts = [ 213 | 'birthday' => 'date:Y-m-d', 214 | 'joined_at' => 'datetime:Y-m-d H:00', 215 | ]; 216 | -------------------------------------------------------------------------------- /docs/encryption.md: -------------------------------------------------------------------------------- 1 | # Laravel 9 · Шифрование 2 | 3 | - [Введение](#introduction) 4 | - [Конфигурирование](#configuration) 5 | - [Использование шифровальщика](#using-the-encrypter) 6 | 7 | 8 | ## Введение 9 | 10 | Сервисы шифрования Laravel предоставляют простой и удобный интерфейс для шифрования и дешифрования текста через OpenSSL с использованием шифрования AES-256 и AES-128. Все зашифрованные значения Laravel подписываются с использованием кода аутентификации сообщения (MAC), поэтому их базовое значение не может быть изменено или подделано после шифрования. 11 | 12 | 13 | ## Конфигурирование 14 | 15 | Перед использованием шифровальщика Laravel вы должны установить параметр `key` в конфигурационном файле `config/app.php`. Это значение конфигурации управляется переменной окружения `APP_KEY`. Вы должны использовать команду `php artisan key:generate` для генерации значения этой переменной, поскольку команда `key:generate` будет использовать безопасный генератор случайных байтов PHP для создания криптографически безопасного ключа для вашего приложения. Обычно значение переменной среды `APP_KEY` генерируется для вас во время [установки Laravel](installation.md). 16 | 17 | 18 | ## Использование шифровальщика 19 | 20 | 21 | #### Шифрование значения 22 | 23 | Вы можете зашифровать значение, используя метод `encryptString` фасада `Crypt`. Все значения будут зашифрованы с использованием OpenSSL и шифра `AES-256-CBC`. Кроме того, все зашифрованные значения подписываются кодом аутентификации сообщения (MAC). Встроенный код аутентификации сообщений предотвратит расшифровку любых значений, которые были подделаны злоумышленниками: 24 | 25 | user()->fill([ 45 | 'token' => Crypt::encryptString($request->token), 46 | ])->save(); 47 | } 48 | } 49 | 50 | 51 | #### Расшифровка значения 52 | 53 | Вы можете расшифровать значения, используя метод `decryptString` фасада `Crypt`. Если значение не может быть правильно расшифровано, например, когда код аутентификации сообщения недействителен, будет выброшено исключение `Illuminate\Contracts\Encryption\DecryptException`: 54 | 55 | use Illuminate\Contracts\Encryption\DecryptException; 56 | use Illuminate\Support\Facades\Crypt; 57 | 58 | try { 59 | $decrypted = Crypt::decryptString($encryptedValue); 60 | } catch (DecryptException $e) { 61 | // 62 | } 63 | -------------------------------------------------------------------------------- /docs/envoy.md: -------------------------------------------------------------------------------- 1 | # Laravel 9 · Пакет Laravel Envoy 2 | 3 | - [Введение](#introduction) 4 | - [Установка](#installation) 5 | - [Написание задач](#writing-tasks) 6 | - [Определение задач](#defining-tasks) 7 | - [Множество серверов](#multiple-servers) 8 | - [Предстартовая подготовка](#setup) 9 | - [Переменные](#variables) 10 | - [Истории](#stories) 11 | - [Хуки](#completion-hooks) 12 | - [Выполнение задач](#running-tasks) 13 | - [Подтверждение выполнения задачи](#confirming-task-execution) 14 | - [Уведомления](#notifications) 15 | - [Slack](#slack) 16 | - [Discord](#discord) 17 | - [Telegram](#telegram) 18 | - [Microsoft Teams](#microsoft-teams) 19 | 20 | 21 | ## Введение 22 | 23 | [**Laravel Envoy**](https://github.com/laravel/envoy) – это инструмент для выполнения общих задач, запускаемых на ваших удаленных серверах. Используя синтаксис в стиле [Blade](blade.md), вы можете легко настроить задачи для развертывания, команд Artisan и многое другое. В настоящее время Envoy поддерживает только операционные системы Mac и Linux. Однако поддержка Windows достижима с помощью [WSL2](https://docs.microsoft.com/en-us/windows/wsl/install-win10). 24 | 25 | 26 | ## Установка 27 | 28 | Для начала установите Envoy с помощью менеджера пакетов Composer в свой проект: 29 | 30 | ```shell 31 | composer require laravel/envoy --dev 32 | ``` 33 | 34 | После установки исполняемый файл Envoy будет доступен в каталоге вашего приложения `vendor/bin`: 35 | 36 | ```shell 37 | php vendor/bin/envoy 38 | ``` 39 | 40 | 41 | ## Написание задач 42 | 43 | 44 | ### Определение задач 45 | 46 | Задачи – это основной «строительный блок» Envoy. Задачи определяются командами оболочки, выполняемыми на ваших удаленных серверах при вызове задачи. Например, вы можете определить задачу, которая выполнит команду `php artisan queue:restart` обработчика очереди на серверах вашего приложения. 47 | 48 | Все ваши задачи Envoy должны быть определены в файле `Envoy.blade.php` в корне вашего приложения. Например: 49 | 50 | ```blade 51 | @servers(['web' => ['user@192.168.1.1'], 'workers' => ['user@192.168.1.2']]) 52 | 53 | @task('restart-queues', ['on' => 'workers']) 54 | cd /home/user/example.com 55 | php artisan queue:restart 56 | @endtask 57 | ``` 58 | 59 | Как видите, в верхней части файла объявлен массив `@servers`, что позволяет вам ссылаться на эти серверы с помощью параметра `on` в определениях ваших задач. Объявление `@servers` всегда следует размещать в одной строке. В определениях `@task` вы должны поместить команды оболочки, которые должны выполняться на ваших серверах при вызове задачи. 60 | 61 | 62 | #### Локальные задачи 63 | 64 | Вы можете принудительно запустить сценарий на вашем локальном компьютере, указав IP-адрес сервера как `127.0.0.1`: 65 | 66 | ```blade 67 | @servers(['localhost' => '127.0.0.1']) 68 | ``` 69 | 70 | 71 | #### Импорт задач Envoy 72 | 73 | Используя директиву `@import`, вы можете импортировать другие файлы Envoy для добавления дополнительных историй и задач. После того, как файлы были импортированы, вы можете выполнять задачи, содержащиеся в них, как если бы они были определены в вашем собственном файле Envoy: 74 | 75 | ```blade 76 | @import('vendor/package/Envoy.blade.php') 77 | ``` 78 | 79 | 80 | ### Множество серверов 81 | 82 | Envoy позволяет легко запускать задачу на нескольких серверах. Во-первых, добавьте необходимые серверы в объявление `@servers`. Каждому серверу должно быть присвоено уникальное имя. После определения дополнительных серверов, вы можете использовать каждый из них в массиве задачи `on`: 83 | 84 | ```blade 85 | @servers(['web-1' => '192.168.1.1', 'web-2' => '192.168.1.2']) 86 | 87 | @task('deploy', ['on' => ['web-1', 'web-2']]) 88 | cd /home/user/example.com 89 | git pull origin {{ $branch }} 90 | php artisan migrate --force 91 | @endtask 92 | ``` 93 | 94 | 95 | #### Параллельное выполнение 96 | 97 | По умолчанию задачи будут выполняться на каждом сервере поочередно. Другими словами, задача должна завершится на первом сервере, прежде чем будет выполнена на втором. Если вы хотите запустить задачу на нескольких серверах параллельно, то добавьте параметр `parallel` в определение задачи: 98 | 99 | ```blade 100 | @servers(['web-1' => '192.168.1.1', 'web-2' => '192.168.1.2']) 101 | 102 | @task('deploy', ['on' => ['web-1', 'web-2'], 'parallel' => true]) 103 | cd /home/user/example.com 104 | git pull origin {{ $branch }} 105 | php artisan migrate --force 106 | @endtask 107 | ``` 108 | 109 | 110 | ### Предстартовая подготовка 111 | 112 | По желанию можно выполнить произвольный PHP-код перед запуском ваших задач Envoy. Вы можете использовать директиву `@setup` для определения блока PHP-кода, который должен быть выполнен перед вашими задачами: 113 | 114 | ```php 115 | @setup 116 | $now = new DateTime; 117 | @endsetup 118 | ``` 119 | 120 | Если вам нужны другие файлы PHP перед выполнением вашей задачи, то вы можете использовать директиву `@include` в верхней части вашего файла `Envoy.blade.php`: 121 | 122 | ```blade 123 | @include('vendor/autoload.php') 124 | 125 | @task('restart-queues') 126 | # ... 127 | @endtask 128 | ``` 129 | 130 | 131 | ### Переменные 132 | 133 | При необходимости вы можете передать аргументы задачам Envoy, указав их в командной строке при вызове Envoy: 134 | 135 | ```shell 136 | php vendor/bin/envoy run deploy --branch=master 137 | ``` 138 | 139 | Вы можете получить доступ к параметрам ваших задач, используя [синтаксис «вывода» Blade](blade.md#displaying-data). Вы также можете определять операторы `if` и циклы Blade в своих задачах. Например, давайте проверим наличие переменной `$branch` перед выполнением команды `git pull`: 140 | 141 | ```blade 142 | @servers(['web' => ['user@192.168.1.1']]) 143 | 144 | @task('deploy', ['on' => 'web']) 145 | cd /home/user/example.com 146 | 147 | @if ($branch) 148 | git pull origin {{ $branch }} 149 | @endif 150 | 151 | php artisan migrate --force 152 | @endtask 153 | ``` 154 | 155 | 156 | ### Истории 157 | 158 | Истории группируют набор задач под одним удобным названием. Например, вы можете сгруппировать запуск задач `update-code` и `install-dependencies`, перечислив их имена в определении истории `deploy`: 159 | 160 | ```blade 161 | @servers(['web' => ['user@192.168.1.1']]) 162 | 163 | @story('deploy') 164 | update-code 165 | install-dependencies 166 | @endstory 167 | 168 | @task('update-code') 169 | cd /home/user/example.com 170 | git pull origin master 171 | @endtask 172 | 173 | @task('install-dependencies') 174 | cd /home/user/example.com 175 | composer install 176 | @endtask 177 | ``` 178 | 179 | После написания история, вы можете запустить ее так же, как вы запускаете отдельную задачу: 180 | 181 | ```shell 182 | php vendor/bin/envoy run deploy 183 | ``` 184 | 185 | 186 | ### Хуки 187 | 188 | При запуске задач и историй инициализируется ряд хуков. Envoy поддерживает следующие типы хуков: `@before`,`@after`, `@error`, `@success` и `@finished`. Весь код в этих хуках интерпретируется как PHP и выполняется локально, а не на удаленных серверах, с которыми взаимодействуют ваши задачи. 189 | 190 | Вы можете определить столько хуков, сколько захотите. Они будут выполняться в том порядке, в котором они указаны в вашем скрипте Envoy. 191 | 192 | 193 | #### Директива хука`@before` 194 | 195 | Перед выполнением каждой задачи будут выполняться все хуки `@before`, зарегистрированные в вашем сценарии Envoy. Хуки `@before` получат имя задачи, которая будет выполняться: 196 | 197 | ```blade 198 | @before 199 | if ($task === 'deploy') { 200 | // ... 201 | } 202 | @endbefore 203 | ``` 204 | 205 | 206 | #### Директива хука `@after` 207 | 208 | После выполнения каждой задачи будут выполняться все хуки `@after`, зарегистрированные в вашем сценарии Envoy. Хуки `@after` получат имя запущенной задачи: 209 | 210 | ```blade 211 | @after 212 | if ($task === 'deploy') { 213 | // ... 214 | } 215 | @endafter 216 | ``` 217 | 218 | 219 | #### Директива хука `@error` 220 | 221 | После каждого сбоя задачи (выход с кодом состояния больше `0`) будут выполняться все хуки `@error`, зарегистрированные в вашем сценарии Envoy. Хуки `@error` получат имя запущенной задачи: 222 | 223 | ```blade 224 | @error 225 | if ($task === 'deploy') { 226 | // ... 227 | } 228 | @enderror 229 | ``` 230 | 231 | 232 | #### Директива хука `@success` 233 | 234 | Если все задачи выполнены без ошибок, то все хуки `@success`, зарегистрированные в вашем сценарии Envoy, будут выполнены: 235 | 236 | ```blade 237 | @success 238 | // ... 239 | @endsuccess 240 | ``` 241 | 242 | 243 | #### Директива хука `@finished` 244 | 245 | После выполнения всех задач (независимо от статуса выхода) будут выполнены все хуки `@finished`. Хуки `@finished` получат код состояния завершенной задачи, который может быть `null` или `integer`, большим или равным `0`: 246 | 247 | ```blade 248 | @finished 249 | if ($exitCode > 0) { 250 | // В одной из задач произошли ошибки ... 251 | } 252 | @endfinished 253 | ``` 254 | 255 | 256 | ## Выполнение задач 257 | 258 | Чтобы запустить задачу или историю, которая определена в файле `Envoy.blade.php` вашего приложения, выполните команду `run` Envoy, передав имя задачи или истории, которую вы хотите выполнить. Envoy выполнит задачу и отобразит вывод с ваших удаленных серверов во время выполнения задачи: 259 | 260 | ```shell 261 | php vendor/bin/envoy run deploy 262 | ``` 263 | 264 | 265 | ### Подтверждение выполнения задачи 266 | 267 | Если вы хотите получить запрос на подтверждение перед запуском конкретной задачи на своих серверах, вам следует добавить параметр `confirm` в директиву определения задачи. Этот параметр особенно полезен для деструктивных операций: 268 | 269 | ```blade 270 | @task('deploy', ['on' => 'web', 'confirm' => true]) 271 | cd /home/user/example.com 272 | git pull origin {{ $branch }} 273 | php artisan migrate 274 | @endtask 275 | ``` 276 | 277 | 278 | ## Уведомления 279 | 280 | 281 | ### Slack 282 | 283 | Envoy поддерживает отправку уведомлений в [Slack](https://slack.com) после выполнения каждой задачи. Директива `@slack` принимает WebHook URL и имя канала / пользователя. Вы можете получить WebHook URL, создав интеграцию «Incoming WebHooks» в панели управления Slack. 284 | 285 | Вы должны передать полный WebHook URL в качестве первого аргумента директивы `@slack`. Вторым аргументом, передаваемым директиве `@slack`, должно быть имя канала `#channel` или имя пользователя `@user`: 286 | 287 | ```blade 288 | @finished 289 | @slack('webhook-url', '#bots') 290 | @endfinished 291 | ``` 292 | 293 | По умолчанию уведомления Envoy отправляют сообщение в канал уведомлений с описанием выполненной задачи. Однако вы можете назначить свое сообщение, передав третий аргумент директиве `@slack`: 294 | 295 | ```blade 296 | @finished 297 | @slack('webhook-url', '#bots', 'Hello, Slack.') 298 | @endfinished 299 | ``` 300 | 301 | 302 | ### Discord 303 | 304 | Envoy также поддерживает отправку уведомлений в [Discord](https://discord.com) после выполнения каждой задачи. Директива `@discord` принимает WebHook URL и сообщение. Вы можете получить WebHook URL, создав «Webhook» в настройках сервера и выбрав канал, на который WebHook должен публиковать сообщения. Вы должны передать полный WebHook URL в директиву `@discord`: 305 | 306 | ```blade 307 | @finished 308 | @discord('discord-webhook-url') 309 | @endfinished 310 | ``` 311 | 312 | 313 | ### Telegram 314 | 315 | Envoy также поддерживает отправку уведомлений в [Telegram](https://telegram.org) после выполнения каждой задачи. Директива `@telegram` принимает идентификатор бота Telegram и идентификатор чата. Вы можете получить свой идентификатор бота, создав нового бота в [BotFather](https://t.me/botfather). Вы можете получить действительный идентификатор чата, используя [`@username_to_id_bot`](https://t.me/username_to_id_bot). Вы должны передать полный идентификатор бота и идентификатор чата в директиву `@telegram`: 316 | 317 | ```blade 318 | @finished 319 | @telegram('bot-id','chat-id') 320 | @endfinished 321 | ``` 322 | 323 | 324 | ### Microsoft Teams 325 | 326 | Envoy также поддерживает отправку уведомлений в [Microsoft Teams](https://www.microsoft.com/en-us/microsoft-teams) после выполнения каждой задачи. Директива `@microsoftTeams` принимает веб-хук Teams (обязательно), сообщение, цвет темы (по типу сообщения: успешно, информация, предупреждение, ошибка) и массив параметров. Вы можете получить веб-хук Teams, создав новый [входящий веб-хук](https://docs.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/add-incoming-webhook). В Teams API есть множество других атрибутов для настройки сообщения, например заголовок, сводка и разделы. Дополнительную информацию можно найти в [документации Microsoft Teams](https://docs.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/connectors-using?tabs=cURL#example-of-connector-message). Вы должны передать полный URL-адрес веб-хука в директиву `@microsoftTeams`: 327 | 328 | ```blade 329 | @finished 330 | @microsoftTeams('webhook-url') 331 | @endfinished 332 | ``` 333 | -------------------------------------------------------------------------------- /docs/frontend.md: -------------------------------------------------------------------------------- 1 | # Laravel 9 · Frontend 2 | 3 | - [Introduction](#introduction) 4 | - [Using PHP](#using-php) 5 | - [PHP & Blade](#php-and-blade) 6 | - [Livewire](#livewire) 7 | - [Starter Kits](#php-starter-kits) 8 | - [Using Vue / React](#using-vue-react) 9 | - [Inertia](#inertia) 10 | - [Starter Kits](#inertia-starter-kits) 11 | - [Bundling Assets](#bundling-assets) 12 | 13 | 14 | ## Introduction 15 | 16 | Laravel is a backend framework that provides all of the features you need to build modern web applications, such as [routing](/docs/{{version}}/routing), [validation](/docs/{{version}}/validation), [caching](/docs/{{version}}/cache), [queues](/docs/{{version}}/queues), [file storage](/docs/{{version}}/filesystem), and more. However, we believe it's important to offer developers a beautiful full-stack experience, including powerful approaches for building your application's frontend. 17 | 18 | There are two primary ways to tackle frontend development when building an application with Laravel, and which approach you choose is determined by whether you would like to build your frontend by leveraging PHP or by using JavaScript frameworks such as Vue and React. We'll discuss both of these options below so that you can make an informed decision regarding the best approach to frontend development for your application. 19 | 20 | 21 | ## Using PHP 22 | 23 | 24 | ### PHP & Blade 25 | 26 | In the past, most PHP applications rendered HTML to the browser using simple HTML templates interspersed with PHP `echo` statements which render data that was retrieved from a database during the request: 27 | 28 | ```blade 29 |
30 | 31 | Hello, name; ?>
32 | 33 |
34 | ``` 35 | 36 | In Laravel, this approach to rendering HTML can still be achieved using [views](/docs/{{version}}/views) and [Blade](/docs/{{version}}/blade). Blade is an extremely light-weight templating language that provides convenient, short syntax for displaying data, iterating over data, and more: 37 | 38 | ```blade 39 |
40 | @foreach ($users as $user) 41 | Hello, {{ $user->name }}
42 | @endforeach 43 |
44 | ``` 45 | 46 | When building applications in this fashion, form submissions and other page interactions typically receive an entirely new HTML document from the server and the entire page is re-rendered by the browser. Even today, many applications may be perfectly suited to having their frontends constructed in this way using simple Blade templates. 47 | 48 | 49 | #### Growing Expectations 50 | 51 | However, as user expectations regarding web applications have matured, many developers have found the need to build more dynamic frontends with interactions that feel more polished. In light of this, some developers choose to begin building their application's frontend using JavaScript frameworks such as Vue and React. 52 | 53 | Others, preferring to stick with the backend language they are comfortable with, have developed solutions that allow the construction of modern web application UIs while still primarily utilizing their backend language of choice. For example, in the [Rails](https://rubyonrails.org/) ecosystem, this has spurred the creation of libraries such as [Turbo](https://turbo.hotwired.dev/) [Hotwire](https://hotwired.dev/), and [Stimulus](https://stimulus.hotwired.dev/). 54 | 55 | Within the Laravel ecosystem, the need to create modern, dynamic frontends by primarily using PHP has led to the creation of [Laravel Livewire](https://laravel-livewire.com) and [Alpine.js](https://alpinejs.dev/). 56 | 57 | 58 | ### Livewire 59 | 60 | [Laravel Livewire](https://laravel-livewire.com) is a framework for building Laravel powered frontends that feel dynamic, modern, and alive just like frontends built with modern JavaScript frameworks like Vue and React. 61 | 62 | When using Livewire, you will create Livewire "components" that render a discrete portion of your UI and expose methods and data that can be invoked and interacted with from your application's frontend. For example, a simple "Counter" component might look like the following: 63 | 64 | ```php 65 | count++; 78 | } 79 | 80 | public function render() 81 | { 82 | return view('livewire.counter'); 83 | } 84 | } 85 | ``` 86 | 87 | And, the corresponding template for the counter would be written like so: 88 | 89 | ```blade 90 |
91 | 92 |

{{ $count }}

93 |
94 | ``` 95 | 96 | As you can see, Livewire enables you to write new HTML attributes such as `wire:click` that connect your Laravel application's frontend and backend. In addition, you can render your component's current state using simple Blade expressions. 97 | 98 | For many, Livewire has revolutionized frontend development with Laravel, allowing them to stay within the comfort of Laravel while constructing modern, dynamic web applications. Typically, developers using Livewire will also utilize [Alpine.js](https://alpinejs.dev/) to "sprinkle" JavaScript onto their frontend only where it is needed, such as in order to render a dialog window. 99 | 100 | If you're new to Laravel, we recommend getting familiar with the basic usage of [views](/docs/{{version}}/views) and [Blade](/docs/{{version}}/blade). Then, consult the official [Laravel Livewire documentation](https://laravel-livewire.com/docs) to learn how to take your application to the next level with interactive Livewire components. 101 | 102 | 103 | ### Starter Kits 104 | 105 | If you would like to build your frontend using PHP and Livewire, you can leverage our Breeze or Jetstream [starter kits](/docs/{{version}}/starter-kits) to jump-start your application's development. Both of these starter kits scaffold your application's backend and frontend authentication flow using [Blade](/docs/{{version}}/blade) and [Tailwind](https://tailwindcss.com) so that you can simply start building your next big idea. 106 | 107 | 108 | ## Using Vue / React 109 | 110 | Although it's possible to build modern frontends using Laravel and Livewire, many developers still prefer to leverage the power of a JavaScript framework like Vue or React. This allows developers to take advantage of the rich ecosystem of JavaScript packages and tools available via NPM. 111 | 112 | However, without additional tooling, pairing Laravel with Vue or React would leave us needing to solve a variety of complicated problems such as client-side routing, data hydration, and authentication. Client-side routing is often simplified by using opinionated Vue / React frameworks such as [Nuxt](https://nuxtjs.org/) and [Next](https://nextjs.org/); however, data hydration and authentication remain complicated and cumbersome problems to solve when pairing a backend framework like Laravel with these frontend frameworks. 113 | 114 | In addition, developers are left maintaining two separate code repositories, often needing to coordinate maintenance, releases, and deployments across both repositories. While these problems are not insurmountable, we don't believe it's a productive or enjoyable way to develop applications. 115 | 116 | 117 | ### Inertia 118 | 119 | Thankfully, Laravel offers the best of both worlds. [Inertia](https://inertiajs.com) bridges the gap between your Laravel application and your modern Vue or React frontend, allowing you to build full-fledged, modern frontends using Vue or React while leveraging Laravel routes and controllers for routing, data hydration, and authentication — all within a single code repository. With this approach, you can enjoy the full power of both Laravel and Vue / React without crippling the capabilities of either tool. 120 | 121 | After installing Inertia into your Laravel application, you will write routes and controllers like normal. However, instead of returning a Blade template from your controller, you will return an Inertia page: 122 | 123 | ```php 124 | User::findOrFail($id) 144 | ]); 145 | } 146 | } 147 | ``` 148 | 149 | An Inertia page corresponds to a Vue or React component, typically stored within the `resources/js/Pages` directory of your application. The data given to the page via the `Inertia::render` method will be used to hydrate the "props" of the page component: 150 | 151 | ```vue 152 | 158 | 159 | 174 | ``` 175 | 176 | As you can see, Inertia allows you to leverage the full power of Vue or React when building your frontend, while providing a light-weight bridge between your Laravel powered backend and your JavaScript powered frontend. 177 | 178 | #### Server-Side Rendering 179 | 180 | If you're concerned about diving into Inertia because your application requires server-side rendering, don't worry. Inertia offers [server-side rendering support](https://inertiajs.com/server-side-rendering). And, when deploying your application via [Laravel Forge](https://forge.laravel.com), it's a breeze to ensure that Inertia's server-side rendering process is always running. 181 | 182 | 183 | ### Starter Kits 184 | 185 | If you would like to build your frontend using Inertia and Vue / React, you can leverage our Breeze or Jetstream [starter kits](/docs/{{version}}/starter-kits#breeze-and-inertia) to jump-start your application's development. Both of these starter kits scaffold your application's backend and frontend authentication flow using Inertia, Vue / React, [Tailwind](https://tailwindcss.com), and [Vite](https://vitejs.dev) so that you can start building your next big idea. 186 | 187 | 188 | ## Bundling Assets 189 | 190 | Regardless of whether you choose to develop your frontend using Blade and Livewire or Vue / React and Inertia, you will likely need to bundle your application's CSS into production ready assets. Of course, if you choose to build your application's frontend with Vue or React, you will also need to bundle your components into browser ready JavaScript assets. 191 | 192 | By default, Laravel utilizes [Vite](https://vitejs.dev) to bundle your assets. Vite provides lightning-fast build times and near instantaneous Hot Module Replacement (HMR) during local development. In all new Laravel applications, including those using our [starter kits](/docs/{{version}}/starter-kits), you will find a `vite.config.js` file that loads our light-weight Laravel Vite plugin that makes Vite a joy to use with Laravel applications. 193 | 194 | The fastest way to get started with Laravel and Vite is by beginning your application's development using [Laravel Breeze](/docs/{{version}}/starter-kits#laravel-breeze), our simplest starter kit that jump-starts your application by providing frontend and backend authentication scaffolding. 195 | 196 | > **Note** 197 | > For more detailed documentation on utilizing Vite with Laravel, please see our [dedicated documentation on bundling and compiling your assets](/docs/{{version}}/vite). 198 | -------------------------------------------------------------------------------- /docs/hashing.md: -------------------------------------------------------------------------------- 1 | # Laravel 9 · Хеширование 2 | 3 | - [Введение](#introduction) 4 | - [Конфигурирование](#configuration) 5 | - [Основы использования](#basic-usage) 6 | - [Хеширование паролей](#hashing-passwords) 7 | - [Проверка совпадения пароля с хешем](#verifying-that-a-password-matches-a-hash) 8 | - [Определение необходимости повторного хеширования пароля](#determining-if-a-password-needs-to-be-rehashed) 9 | 10 | 11 | ## Введение 12 | 13 | [Фасад](facades.md) `Hash` фреймворка Laravel обеспечивает безопасное хеширование Bcrypt и Argon2 для хранения паролей пользователей. Если вы используете каркас одного из [стартовых комплектов приложений Laravel](starter-kits.md), то для регистрации и аутентификации по умолчанию будет использоваться Bcrypt. 14 | 15 | Bcrypt – отличный выбор для хеширования паролей, потому что его «коэффициент работы» регулируется, а это означает, что время, необходимое для генерации хеш-кода, может быть увеличено по мере увеличения мощности оборудования. При хешировании паролей – чем медленнее, тем лучше. Чем больше времени требуется алгоритму для хеширования пароля, тем больше времени требуется злоумышленникам для создания «радужных таблиц» всех возможных строковых хеш-значений, которые могут использоваться в атаках. 16 | 17 | 18 | ## Конфигурирование 19 | 20 | Драйвер хеширования по умолчанию для вашего приложения настраивается в файле конфигурации `config/hashing.php`. В настоящее время существует несколько поддерживаемых драйверов: [Bcrypt](https://en.wikipedia.org/wiki/Bcrypt) и [Argon2](https://en.wikipedia.org/wiki/Argon2) (вариации Argon2i и Argon2id). 21 | 22 | 23 | ## Основы использования 24 | 25 | 26 | ### Хеширование паролей 27 | 28 | Вы можете хешировать пароль, вызвав метод `make` фасада `Hash`: 29 | 30 | user()->fill([ 51 | 'password' => Hash::make($request->newPassword) 52 | ])->save(); 53 | } 54 | } 55 | 56 | 57 | #### Регулировка коэффициента работы Bcrypt 58 | 59 | Если вы используете алгоритм Bcrypt, метод `make` позволяет вам управлять коэффициентом работы алгоритма с помощью параметра `rounds`; однако значение по умолчанию приемлемо для большинства приложений: 60 | 61 | $hashed = Hash::make('password', [ 62 | 'rounds' => 12, 63 | ]); 64 | 65 | 66 | #### Регулировка коэффициента работы Argon2 67 | 68 | Если вы используете алгоритм Argon2, метод `make` позволяет вам управлять коэффициентом работы алгоритма с помощью параметров `memory`, `time` и `threads`; однако значения по умолчанию приемлемы для большинства приложений: 69 | 70 | $hashed = Hash::make('password', [ 71 | 'memory' => 1024, 72 | 'time' => 2, 73 | 'threads' => 2, 74 | ]); 75 | 76 | > **Примечание**\ 77 | > Дополнительную информацию об этих параметрах можно найти в [официальной документации PHP](https://www.php.net/manual/ru/function.password-hash.php). 78 | 79 | 80 | ### Проверка совпадения пароля с хешем 81 | 82 | Метод `check` фасада `Hash` позволяет проверить, что указанная текстовая строка соответствует заданному хешу: 83 | 84 | if (Hash::check('plain-text', $hashedPassword)) { 85 | // Пароли совпадают ... 86 | } 87 | 88 | 89 | ### Определение необходимости повторного хеширования пароля 90 | 91 | Метод `needsRehash` фасада `Hash` позволяет определить, изменился ли коэффициентом работы, используемый хешером, с момента хеширования пароля. Некоторые приложения предпочитают выполнять эту проверку во время процесса аутентификации приложения: 92 | 93 | if (Hash::needsRehash($hashed)) { 94 | $hashed = Hash::make('plain-text'); 95 | } 96 | -------------------------------------------------------------------------------- /docs/img/breeze-register.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russsiq/laravel-docs-ru/9589e83b94b8c70e2bbd27fa885608e30a369d55/docs/img/breeze-register.png -------------------------------------------------------------------------------- /docs/img/horizon-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russsiq/laravel-docs-ru/9589e83b94b8c70e2bbd27fa885608e30a369d55/docs/img/horizon-example.png -------------------------------------------------------------------------------- /docs/img/notification-example-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russsiq/laravel-docs-ru/9589e83b94b8c70e2bbd27fa885608e30a369d55/docs/img/notification-example-2.png -------------------------------------------------------------------------------- /docs/img/releases-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russsiq/laravel-docs-ru/9589e83b94b8c70e2bbd27fa885608e30a369d55/docs/img/releases-1.png -------------------------------------------------------------------------------- /docs/img/releases-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russsiq/laravel-docs-ru/9589e83b94b8c70e2bbd27fa885608e30a369d55/docs/img/releases-2.png -------------------------------------------------------------------------------- /docs/img/releases-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russsiq/laravel-docs-ru/9589e83b94b8c70e2bbd27fa885608e30a369d55/docs/img/releases-3.png -------------------------------------------------------------------------------- /docs/img/releases-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russsiq/laravel-docs-ru/9589e83b94b8c70e2bbd27fa885608e30a369d55/docs/img/releases-4.png -------------------------------------------------------------------------------- /docs/img/releases-5.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russsiq/laravel-docs-ru/9589e83b94b8c70e2bbd27fa885608e30a369d55/docs/img/releases-5.gif -------------------------------------------------------------------------------- /docs/img/telescope-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russsiq/laravel-docs-ru/9589e83b94b8c70e2bbd27fa885608e30a369d55/docs/img/telescope-example.png -------------------------------------------------------------------------------- /docs/license.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) Taylor Otwell 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. -------------------------------------------------------------------------------- /docs/lifecycle.md: -------------------------------------------------------------------------------- 1 | # Laravel 9 · Жизненный цикл запроса 2 | 3 | - [Введение](#introduction) 4 | - [Обзор жизненного цикла](#lifecycle-overview) 5 | - [Первые шаги](#first-steps) 6 | - [HTTP-ядро и ядро консоли](#http-console-kernels) 7 | - [Поставщики служб](#service-providers) 8 | - [Маршрутизация](#routing) 9 | - [Окончание](#finishing-up) 10 | - [Сосредоточьтесь на поставщиках служб](#focus-on-service-providers) 11 | 12 | 13 | ## Введение 14 | 15 | При использовании любого инструмента в «реальном мире» вы чувствуете себя более уверенно, если понимаете, как работает этот инструмент. Разработка приложений ничем не отличается. Когда вы понимаете, как работают ваши инструменты разработки, вы чувствуете себя более комфортно и уверенно, используя их. 16 | 17 | Цель этого документа – дать вам хороший общий обзор того, как работает фреймворк Laravel. Если вы лучше узнаете общую структуру, то все станет менее «волшебным», и вы будете более уверены при создании своих приложений. Если вы не сразу поняли все термины, то не унывайте! Просто попытайтесь получить общее представление о том, что происходит, и ваши знания будут расти по мере изучения других разделов документации. 18 | 19 | 20 | ## Обзор жизненного цикла 21 | 22 | 23 | ### Первые шаги 24 | 25 | Точкой входа для всех запросов к приложению Laravel является файл `public/index.php`. Все запросы направляются в этот файл конфигурацией вашего веб-сервера (Apache / Nginx). Файл `index.php` не содержит большого количества кода. Скорее, это отправная точка для загрузки остальной части фреймворка. 26 | 27 | Файл `index.php` загружает автозагрузчик, созданный менеджером пакетов Composer, а затем извлекает экземпляр приложения Laravel из `bootstrap/app.php`. Первым действием, предпринимаемым самим Laravel, является создание экземпляра приложения / [контейнера служб](container.md). 28 | 29 | 30 | ### HTTP-ядро и ядро консоли 31 | 32 | Затем входящий запрос отправляется либо HTTP-ядру, либо ядру консоли, в зависимости от типа запроса, поступающего в приложение. Эти два ядра служат центральным местом, через которое проходят все запросы. А пока давайте сосредоточимся на ядре HTTP, которое находится в `app/Http/Kernel.php`. 33 | 34 | HTTP-ядро расширяет класс `Illuminate\Foundation\Http\Kernel`, который определяет массив загрузчиков (`bootstrappers`), которые будут запускаться до выполнения запроса. Эти загрузчики настраивают обработку ошибок, настраивают ведение журнала, [определяют среду приложения](configuration.md#environment-configuration) и выполняют другие задачи, которые необходимо выполнить до фактической обработки запроса. Обычно эти классы обрабатывают внутреннюю конфигурацию Laravel, о которой вам не нужно беспокоиться. 35 | 36 | Ядро HTTP также определяет список [HTTP-посредников](middleware.md), через которые должны пройти все запросы, прежде чем они будут обработаны приложением. Эти посредники обрабатывают чтение и запись [HTTP-сессий](session.md), определяют, находится ли приложение в режиме обслуживания, [проверяют токен CSRF](csrf.md) и многое другое. Мы поговорим об этом позже. 37 | 38 | Сигнатура метода `handle` HTTP-ядра довольно проста: он получает запрос (`Request`) и возвращает ответ (`Response`). Думайте о ядре как о большом черном ящике, который представляет все ваше приложение. Подайте ему HTTP-запросы, и он вернет HTTP-ответы. 39 | 40 | 41 | #### Поставщики служб 42 | 43 | Одним из наиболее важных действий начальной загрузки ядра является загрузка [поставщиков служб](providers.md) вашего приложения. Поставщики служб несут ответственность за загрузку всех различных компонентов фреймворка, таких как компоненты БД, очереди, валидации и маршрутизации. Все поставщики служб приложения настраиваются в массиве `providers` конфигурационного файла `config/app.php`. 44 | 45 | Laravel будет перебирать этот список поставщиков и создавать экземпляры каждого из них. После создания экземпляров поставщиков, будет вызван метод `register` всех поставщиков. Затем, как только все поставщики будут зарегистрированы, будет вызван метод `boot` каждого из них. Это сделано для того, чтобы поставщики служб имели возможность зависимости от каждого из зарегистрированных и доступных «связываний контейнера» к моменту выполнения их метода `boot`. 46 | 47 | По сути, каждая основная функция Laravel загружается и настраивается поставщиком служб. Поскольку они запускают и настраивают так много функций, предлагаемых фреймворком, поставщики служб являются наиболее важным аспектом всего процесса начальной загрузки Laravel. 48 | 49 | 50 | ### Маршрутизация 51 | 52 | Одним из наиболее важных поставщиков служб в вашем приложении является `App\Providers\RouteServiceProvider`. Этот поставщик загружает файлы маршрутов, содержащиеся в каталоге `routes` приложения. Откройте код `RouteServiceProvider` и посмотрите, как он работает! 53 | 54 | После того, как приложение было загружено и все поставщики служб зарегистрированы, `Request` будет передан маршрутизатору для исполнения. Маршрутизатор отправит запрос на маршрут или контроллер, а также запустит посредник для конкретного маршрута. 55 | 56 | Посредники обеспечивают удобный механизм фильтрации или интерпретации HTTP-запросов, поступающих в ваше приложение. Например, Laravel содержит посредника, который проверяет аутентификацию пользователя вашего приложения. Если пользователь не аутентифицирован, посредник перенаправит пользователя, например, на экран входа в систему. Однако, если пользователь аутентифицирован, посредник позволит запросу продолжить работу в приложении. Некоторые посредники назначаются всем маршрутам в приложении, например, определенным в свойстве `$middleware` вашего ядра HTTP, тогда как некоторые назначаются только для определенных маршрутов или групп маршрутов. Вы можете узнать больше о посредниках, прочитав полную [документацию по посредникам](middleware.md). 57 | 58 | Если запрос проходит через всех посредников, назначенных определенному маршруту, то метод маршрута или контроллера будет выполнен, а ответ, возвращенный методом маршрута или контроллера, будет отправлен обратно через цепочку посредников маршрута. 59 | 60 | 61 | ### Окончание 62 | 63 | Когда метод маршрута или контроллера вернет ответ, тогда ответ отправится обратно через посредников маршрута, обеспечивая приложению возможность изменения или проверки исходящего ответа. 64 | 65 | Наконец, как только ответ проходит через посредников, метод `handle` ядра HTTP возвращает объект ответа, а файл `index.php` вызывает метод `send` для возвращенного ответа. Метод `send` отправляет содержимое ответа в веб-браузер пользователя. Мы завершили наш путь через весь жизненный цикл запроса Laravel! 66 | 67 | 68 | ## Сосредоточьтесь на поставщиках служб 69 | 70 | Поставщики служб действительно являются ключом к начальной загрузке приложения Laravel. Экземпляр приложения создается, поставщики служб регистрируются, и запрос передается загружаемому приложению. Это действительно так просто! 71 | 72 | Очень важно иметь четкое представление о том, как создается и загружается приложение Laravel через поставщиков служб. Поставщики служб вашего приложения хранятся в каталоге `app/Providers`. 73 | 74 | По умолчанию поставщик `AppServiceProvider` относительно пуст. Этот поставщик является отличным местом для добавления собственной инициализации и связываний контейнера служб вашего приложения. Для больших приложений вы можете создать несколько поставщиков, каждый из которых детализирует начальную загрузку для конкретных сервисов, используемых вашим приложением. 75 | -------------------------------------------------------------------------------- /docs/localization.md: -------------------------------------------------------------------------------- 1 | # Laravel 9 · Локализация интерфейса 2 | 3 | - [Введение](#introduction) 4 | - [Конфигурирование языка по умолчанию](#configuring-the-locale) 5 | - [Построитель слов во множественном числе](#pluralization-language) 6 | - [Определение строк перевода](#defining-translation-strings) 7 | - [Использование коротких ключей](#using-short-keys) 8 | - [Использование строк перевода в качестве ключей](#using-translation-strings-as-keys) 9 | - [Получение строк перевода](#retrieving-translation-strings) 10 | - [Замена параметров в строках перевода](#replacing-parameters-in-translation-strings) 11 | - [Плюрализация](#pluralization) 12 | - [Переопределение языковых файлов пакета](#overriding-package-language-files) 13 | 14 | 15 | ## Введение 16 | 17 | Функционал локализации Laravel предоставляют удобный способ извлечения строк разных языков, что позволяет легко поддерживать мультиязычность интерфейса вашего приложения. 18 | 19 | Laravel предлагает два способа управления строками перевода. Во-первых, языковые строки могут храниться в файлах в каталоге `lang`. В этом каталоге могут быть подкаталоги для каждого языка, поддерживаемого приложением. Это подход, который Laravel использует для управления строками перевода собственного функционала, например сообщений об ошибках валидации: 20 | 21 | /lang 22 | /en 23 | messages.php 24 | /es 25 | messages.php 26 | 27 | Или строки перевода могут быть определены в файлах JSON, которые помещаются в каталог `lang`. При таком подходе каждый язык, поддерживаемый вашим приложением, будет иметь соответствующий файл JSON в этом каталоге. Этот подход рекомендуется для приложений с большим количеством переводимых строк: 28 | 29 | /lang 30 | en.json 31 | es.json 32 | 33 | Мы обсудим каждый подход по управлению строками перевода в этой документации. 34 | 35 | 36 | ### Конфигурирование языка по умолчанию 37 | 38 | Язык по умолчанию для вашего приложения хранится в параметре `locale` конфигурационного файла `config/app.php`. Вы можете изменить это значение в соответствии с потребностями вашего приложения. 39 | 40 | Вы можете изменить язык по умолчанию для одного HTTP-запроса во время выполнения, используя метод `setLocale` фасада `App`: 41 | 42 | use Illuminate\Support\Facades\App; 43 | 44 | Route::get('/greeting/{locale}', function ($locale) { 45 | if (! in_array($locale, ['en', 'es', 'fr'])) { 46 | abort(400); 47 | } 48 | 49 | App::setLocale($locale); 50 | 51 | // 52 | }); 53 | 54 | Вы можете указать «резервный язык», который будет использоваться, когда активный язык не содержит конкретной строки перевода. Как и язык по умолчанию, резервный язык также задается в конфигурационном файле `config/app.php`: 55 | 56 | 'fallback_locale' => 'en', 57 | 58 | 59 | #### Определение текущего языка 60 | 61 | Вы можете использовать методы `currentLocale` и `isLocale` фасада `App`, чтобы определить текущий язык или проверить соответствие указанного языка: 62 | 63 | use Illuminate\Support\Facades\App; 64 | 65 | $locale = App::currentLocale(); 66 | 67 | if (App::isLocale('en')) { 68 | // 69 | } 70 | 71 | 72 | ### Построитель слов во множественном числе 73 | 74 | Вы можете указать построителю слов во множественном числе Laravel, который используется Eloquent и другими частями фреймворка для преобразования строк единственного числа в строки множественного числа, использовать язык, отличный от английского. Этого можно добиться, вызвав метод `useLanguage` в методе `boot` [поставщика служб](providers.md). В настоящее время построитель слов во множественном числе поддерживает следующие языки: `french`, `norwegian-bokmal`, `portuguese`, `spanish` и `turkish`: 75 | 76 | use Illuminate\Support\Pluralizer; 77 | 78 | /** 79 | * Загрузка любых служб приложения. 80 | * 81 | * @return void 82 | */ 83 | public function boot() 84 | { 85 | Pluralizer::useLanguage('spanish'); 86 | 87 | // ... 88 | } 89 | 90 | > **Предупреждение**\ 91 | > Если вы изменяете язык построителя слов во множественном числе, то вы должны явно определять [имена таблиц](eloquent.md#table-names) моделей Eloquent. 92 | 93 | 94 | ## Определение строк перевода 95 | 96 | 97 | ### Использование коротких ключей 98 | 99 | Обычно строки перевода хранятся в файлах в каталоге `lang`. В этом каталоге должен быть подкаталог для каждого языка, поддерживаемого вашим приложением. Это подход, который Laravel использует для управления строками перевода собственного функционала, например сообщений об ошибках валидации: 100 | 101 | /lang 102 | /en 103 | messages.php 104 | /es 105 | messages.php 106 | 107 | Все языковые файлы возвращают массив со строковыми ключами. Например: 108 | 109 | 'Welcome to our application!', 115 | ]; 116 | 117 | > **Предупреждение**\ 118 | > Для языков, отличающихся территориально, вы должны назвать языковые каталоги в соответствии со стандартом ISO 15897. Например, для британского английского следует использовать `en_GB`, а не `en-gb`. 119 | 120 | 121 | ### Использование строк перевода в качестве ключей 122 | 123 | Для приложений с большим количеством переводимых строк определение каждой строки с помощью «короткого ключа» может сбивать с толку при обращении к ключам в ваших шаблонах, и постоянно изобретать ключи для каждой строки перевода, поддерживаемой вашим приложением, затруднительно. 124 | 125 | По этой причине Laravel предлагает определение строк перевода с использованием переводимой строки в качестве ключа «по умолчанию». Файлы перевода, которые используют строки перевода в качестве ключей, хранятся как файлы JSON в каталоге `lang`. Например, если ваше приложение имеет испанский перевод, то вы должны создать файл `lang/es.json`: 126 | 127 | ```json 128 | { 129 | "I love programming.": "Me encanta programar." 130 | } 131 | ``` 132 | 133 | #### Конфликты ключей и имен файлов 134 | 135 | Вы не должны определять строковые ключи перевода, которые конфликтуют с именами файлов перевода. Например, перевод `__('Action')` для языка `NL` при условии существования файла `nl/action.php` и отсутствии файла `nl.json` приведет к тому, что переводчик Laravel вернет содержимое всего файла `nl/action.php`. 136 | 137 | 138 | ## Получение строк перевода 139 | 140 | Вы можете получить строки перевода из ваших языковых файлов с помощью глобального помощника `__`. Если вы используете «короткие ключи» для определения ваших строк перевода, то вы должны передать файл, содержащий ключ, и сам ключ в функцию `__`, используя «точечную нотацию». Например, давайте извлечем строку перевода `welcome` из языкового файла `lang/en/messages.php`: 141 | 142 | echo __('messages.welcome'); 143 | 144 | Если указанная строка перевода не существует, то функция `__` вернет ключ строки перевода. Итак, используя приведенный выше пример, функция `__` вернет `messages.welcome`, если строка перевода не существует. 145 | 146 | Если вы используете свои [строки перевода в качестве ключей перевода](#using-translation-strings-as-keys), то вы должны передать перевод вашей строки по умолчанию в функцию `__`: 147 | 148 | echo __('I love programming.'); 149 | 150 | Опять же, если строка перевода не существует, то функция `__` вернет ключ строки перевода, который ей был передан. 151 | 152 | Если вы используете [шаблонизатор Blade](blade.md), то вы можете использовать синтаксис `{{}}` для вывода строки перевода: 153 | 154 | {{ __('messages.welcome') }} 155 | 156 | 157 | ### Замена параметров в строках перевода 158 | 159 | При желании вы можете определить метку-заполнитель в строках перевода. Все заполнители имеют префикс `:`. Например, вы можете определить приветственное сообщение с именем-заполнителем: 160 | 161 | 'welcome' => 'Welcome, :name', 162 | 163 | Чтобы заменить заполнители при получении строки перевода, вы можете передать массив для замены в качестве второго аргумента функции `__`: 164 | 165 | echo __('messages.welcome', ['name' => 'dayle']); 166 | 167 | Если все буквы заполнителя заглавные или заполнитель имеет только первую заглавную букву, то переведенное значение будет с соответствующим регистром: 168 | 169 | 'welcome' => 'Welcome, :NAME', // Welcome, DAYLE 170 | 'goodbye' => 'Goodbye, :Name', // Goodbye, Dayle 171 | 172 | 173 | ### Плюрализация 174 | 175 | Плюрализация – сложная задача, поскольку разные языки имеют множество сложных правил плюрализации; однако Laravel может помочь вам переводить строки по-разному в зависимости от правил множественного числа, которые вы определяете. Используя мета-символ `|`, вы можете различать формы единственного и множественного числа строки: 176 | 177 | 'apples' => 'There is one apple|There are many apples', 178 | 179 | Конечно, множественное число также поддерживается при использовании [строк перевода в качестве ключей](#using-translation-strings-as-keys): 180 | 181 | ```json 182 | { 183 | "There is one apple|There are many apples": "Hay una manzana|Hay muchas manzanas" 184 | } 185 | ``` 186 | 187 | Вы даже можете создать более сложные правила множественного числа, которые определяют строки перевода для нескольких диапазонов значений: 188 | 189 | 'apples' => '{0} There are none|[1,19] There are some|[20,*] There are many', 190 | 191 | После определения строки перевода, которая имеет параметры множественного числа, вы можете использовать функцию `trans_choice` для извлечения строки соответствующую указанному «количеству». В этом примере, поскольку количество больше единицы, возвращается форма множественного числа строки перевода: 192 | 193 | echo trans_choice('messages.apples', 10); 194 | 195 | Вы также можете определить метку-заполнитель в строках множественного числа. Эти заполнители могут быть заменены передачей массива в качестве третьего аргумента функции `trans_choice`: 196 | 197 | 'minutes_ago' => '{1} :value minute ago|[2,*] :value minutes ago', 198 | 199 | echo trans_choice('time.minutes_ago', 5, ['value' => 5]); 200 | 201 | Если вы хотите отобразить целочисленное значение, переданное в функцию `trans_choice`, то вы можете использовать встроенный заполнитель `:count`: 202 | 203 | 'apples' => '{0} There are none|{1} There is one|[2,*] There are :count', 204 | 205 | 206 | ## Переопределение языковых файлов пакета 207 | 208 | Некоторые пакеты могут содержать собственные языковые файлы. Вместо того, чтобы изменять строки файлов пакета, вы можете переопределить их, поместив файлы в каталог `lang/vendor/{package}/{locale}`. 209 | 210 | Так, например, если вам нужно переопределить строки перевода на английский в `messages.php` для пакета с именем `skyrim/hearthfire`, вы должны поместить языковой файл в каталог: `lang/vendor/hearthfire/en/messages.php`. В этом файле вы должны определять только те строки перевода, которые хотите переопределить. Любые строки перевода, которые вы не меняете, все равно будут загружены из исходных языковых файлов пакета. 211 | -------------------------------------------------------------------------------- /docs/mix.md: -------------------------------------------------------------------------------- 1 | # Laravel 9 · Пакет Laravel Mix 2 | 3 | - [Введение](#introduction) 4 | 5 | 6 | ## Введение 7 | 8 | [Laravel Mix](https://github.com/laravel-mix/laravel-mix) – это пакет, разработанный создателем [Laracasts](https://laracasts.com) Джеффри Уэй, предлагает гибкий API для определения шагов сборки [Webpack](https://webpack.js.org) для вашего приложения с использованием нескольких распространенных препроцессоров CSS и JavaScript. 9 | 10 | Другими словами, Mix упрощает компиляцию и минимизацию файлов CSS и JavaScript вашего приложения. Посредством простой цепочки методов вы можете гибко определять свой сценарий по сборки веб-актива. Например: 11 | 12 | ```js 13 | mix.js('resources/js/app.js', 'public/js') 14 | .postCss('resources/css/app.css', 'public/css'); 15 | ``` 16 | 17 | Если вы однажды были сбиты с толку и ошеломлены, начав работу с Webpack, то вам понравится Laravel Mix. Однако от вас не требуется использовать его при разработке приложения; вы можете использовать любой желаемый инструмент сборки, или даже не использовать его вовсе. Справедливо и обратное: вы можете использовать Laravel Mix без привязки вашего приложения к фреймворку Laravel. 18 | 19 | > **Примечание**\ 20 | > Vite заменил Laravel Mix в новых установках Laravel. Документацию по Mix можно найти на [официальном сайте Laravel Mix](https://laravel-mix.com/). Если вы хотите переключиться на Vite, ознакомьтесь с нашим [руководством по миграции на Vite](https://github.com/laravel/vite-plugin/blob/main/UPGRADE.md#migrating-from-laravel-mix-to-vite). 21 | 22 | > **Примечание**\ 23 | > Старое содержимое текущей страницы на русском языке временно доступно в руководстве [Компиляция веб-активов с помощью Mix](mix-old.md). 24 | -------------------------------------------------------------------------------- /docs/pint.md: -------------------------------------------------------------------------------- 1 | # Laravel 9 · Pint 2 | 3 | - [Introduction](#introduction) 4 | - [Installation](#installation) 5 | - [Running Pint](#running-pint) 6 | - [Configuring Pint](#configuring-pint) 7 | - [Presets](#presets) 8 | - [Rules](#rules) 9 | - [Excluding Files / Folders](#excluding-files-or-folders) 10 | 11 | 12 | ## Introduction 13 | 14 | [Laravel Pint](https://github.com/laravel/pint) is an opinionated PHP code style fixer for minimalists. Pint is built on top of PHP-CS-Fixer and makes it simple to ensure that your code style stays clean and consistent. 15 | 16 | Pint is automatically installed with all new Laravel applications so you may start using it immediately. By default, Pint does not require any configuration and will fix code style issues in your code by following the opinionated coding style of Laravel. 17 | 18 | 19 | ## Installation 20 | 21 | Pint is included in recent releases of the Laravel framework, so installation is typically unnecessary. However, for older applications, you may install Laravel Pint via Composer: 22 | 23 | ```shell 24 | composer require laravel/pint --dev 25 | ``` 26 | 27 | 28 | ## Running Pint 29 | 30 | You can instruct Pint to fix code style issues by invoking the `pint` binary that is available in your project's `vendor/bin` directory: 31 | 32 | ```shell 33 | ./vendor/bin/pint 34 | ``` 35 | 36 | You may also run Pint on specific files or directories: 37 | 38 | ```shell 39 | ./vendor/bin/pint app/Models 40 | 41 | ./vendor/bin/pint app/Models/User.php 42 | ``` 43 | 44 | Pint will display a thorough list of all of the files that it updates. You can view even more detail about Pint's changes by providing the `-v` option when invoking Pint: 45 | 46 | ```shell 47 | ./vendor/bin/pint -v 48 | ``` 49 | 50 | If you would like Pint to simply inspect your code for style errors without actually changing the files, you may use the `--test` option: 51 | 52 | ```shell 53 | ./vendor/bin/pint --test 54 | ``` 55 | 56 | If you would like Pint to only modify the files that have uncommitted changes according to Git, you may use the `--dirty` option: 57 | 58 | ```shell 59 | ./vendor/bin/pint --dirty 60 | ``` 61 | 62 | 63 | ## Configuring Pint 64 | 65 | As previously mentioned, Pint does not require any configuration. However, if you wish to customize the presets, rules, or inspected folders, you may do so by creating a `pint.json` file in your project's root directory: 66 | 67 | ```json 68 | { 69 | "preset": "laravel" 70 | } 71 | ``` 72 | 73 | In addition, if you wish to use a `pint.json` from a specific directory, you may provide the `--config` option when invoking Pint: 74 | 75 | ```shell 76 | pint --config vendor/my-company/coding-style/pint.json 77 | ``` 78 | 79 | 80 | ### Presets 81 | 82 | Presets defines a set of rules that can be used to fix code style issues in your code. By default, Pint uses the `laravel` preset, which fixes issues by following the opinionated coding style of Laravel. However, you may specify a different preset by providing the `--preset` option to Pint: 83 | 84 | ```shell 85 | pint --preset psr12 86 | ``` 87 | 88 | If you wish, you may also set the preset in your project's `pint.json` file: 89 | 90 | ```json 91 | { 92 | "preset": "psr12" 93 | } 94 | ``` 95 | 96 | Pint's currently supported presets are: `laravel`, `psr12`, and `symfony`. 97 | 98 | 99 | ### Rules 100 | 101 | Rules are style guidelines that Pint will use to fix code style issues in your code. As mentioned above, presets are predefined groups of rules that should be perfect for most PHP projects, so you typically will not need to worry about the individual rules they contain. 102 | 103 | However, if you wish, you may enable or disable specific rules in your `pint.json` file: 104 | 105 | ```json 106 | { 107 | "preset": "laravel", 108 | "rules": { 109 | "simplified_null_return": true, 110 | "braces": false, 111 | "new_with_braces": { 112 | "anonymous_class": false, 113 | "named_class": false 114 | } 115 | } 116 | } 117 | ``` 118 | 119 | Pint is built on top of [PHP-CS-Fixer](https://github.com/FriendsOfPHP/PHP-CS-Fixer). Therefore, you may use any of its rules to fix code style issues in your project: [PHP-CS-Fixer Configurator](https://mlocati.github.io/php-cs-fixer-configurator). 120 | 121 | 122 | ### Excluding Files / Folders 123 | 124 | By default, Pint will inspect all `.php` files in your project except those in the `vendor` directory. If you wish to exclude more folders, you may do so using the `exclude` configuration option: 125 | 126 | ```json 127 | { 128 | "exclude": [ 129 | "my-specific/folder" 130 | ] 131 | } 132 | ``` 133 | 134 | If you wish to exclude all files that contain a given name pattern, you may do so using the `notName` configuration option: 135 | 136 | ```json 137 | { 138 | "notName": [ 139 | "*-my-file.php" 140 | ] 141 | } 142 | ``` 143 | 144 | If you would like to exclude a file by providing an exact path to the file, you may do so using the `notPath` configuration option: 145 | 146 | ```json 147 | { 148 | "notPath": [ 149 | "path/to/excluded-file.php" 150 | ] 151 | } 152 | ``` 153 | -------------------------------------------------------------------------------- /docs/providers.md: -------------------------------------------------------------------------------- 1 | # Laravel 9 · Поставщики служб 2 | 3 | - [Введение](#introduction) 4 | - [Написание поставщиков служб](#writing-service-providers) 5 | - [Метод `register`](#the-register-method) 6 | - [Метод `boot`](#the-boot-method) 7 | - [Регистрация поставщиков](#registering-providers) 8 | - [Отложенные поставщики](#deferred-providers) 9 | 10 | 11 | ## Введение 12 | 13 | Поставщики служб – это центральное место начальной загрузки всех приложений Laravel. Ваше собственное приложение, а также все основные службы Laravel загружаются через поставщиков. 14 | 15 | Но, что мы подразумеваем под «начальной загрузкой»? В общем, мы имеем в виду **регистрацию** элементов, включая регистрацию связываний контейнера служб, слушателей событий, посредников и даже маршрутов. Поставщики служб являются центральным местом для конфигурирования приложения. 16 | 17 | Если вы откроете файл `config/app.php`, включенный в Laravel, вы увидите массив поставщиков. Это все классы поставщиков служб, которые будут загружены вашим приложением. По умолчанию в этом массиве перечислены основные поставщики служб Laravel. Эти поставщики загружают основные компоненты Laravel, такие как почтовая программа, очередь, кеш и другие. Многие из этих поставщиков являются «отложенными», что означает, что они не будут загружаться при каждом запросе, а только тогда, когда предоставляемые ими службы действительно необходимы. 18 | 19 | В этой документации вы узнаете, как писать собственных поставщиков служб и регистрировать их в приложении Laravel. 20 | 21 | > **Примечание**\ 22 | > Если вы хотите узнать больше о том, как Laravel обрабатывает запросы и работает изнутри, ознакомьтесь с нашей документацией по [жизненному циклу запроса](lifecycle.md) Laravel. 23 | 24 | 25 | ## Написание поставщиков служб 26 | 27 | Все поставщики служб расширяют класс `Illuminate\Support\ServiceProvider`. Большинство поставщиков служб содержат метод `register` и `boot`. В рамках метода `register` следует **только связать сущности в [контейнере служб](container.md)**. Никогда не следует пытаться зарегистрировать каких-либо слушателей событий, маршруты или любые другие функциональные возможности в методе `register`. 28 | 29 | Чтобы сгенерировать нового поставщика, используйте команду `make:provider` [Artisan](artisan.md): 30 | 31 | ```shell 32 | php artisan make:provider RiakServiceProvider 33 | ``` 34 | 35 | 36 | ### Метод `register` 37 | 38 | Как упоминалось ранее, в рамках метода `register` следует только связать сущности в [контейнере служб](container.md). Никогда не следует пытаться зарегистрировать слушателей событий, маршруты или любую другую функциональность в методе `register`. В противном случае вы можете случайно воспользоваться службой, которая еще не загружена. 39 | 40 | Давайте взглянем на основного поставщика служб. В любом из методов поставщика служб у вас всегда есть доступ к свойству `$app`, которое обеспечивает доступ к контейнеру служб: 41 | 42 | app->singleton(Connection::class, function ($app) { 59 | return new Connection(config('riak')); 60 | }); 61 | } 62 | } 63 | 64 | Этот поставщик службы определяет только метод `register` и использует этот метод для определения реализации `App\Services\Riak\Connection` в контейнере служб. Если вы еще не знакомы с контейнером служб Laravel, ознакомьтесь с [его документацией](container.md). 65 | 66 | 67 | #### Свойства `bindings` и `singletons` 68 | 69 | Если ваш поставщик службы регистрирует много простых связываний, вы можете использовать свойства `bindings` и `singletons` вместо ручной регистрации каждого связывания контейнера. Когда поставщик службы загружается фреймворком, он автоматически проверяет эти свойства и регистрирует их связывания: 70 | 71 | DigitalOceanServerProvider::class, 91 | ]; 92 | 93 | /** 94 | * Все синглтоны (одиночки) контейнера, которые должны быть зарегистрированы. 95 | * 96 | * @var array 97 | */ 98 | public $singletons = [ 99 | DowntimeNotifier::class => PingdomDowntimeNotifier::class, 100 | ServerProvider::class => ServerToolsProvider::class, 101 | ]; 102 | } 103 | 104 | 105 | ### Метод `boot` 106 | 107 | Итак, что, если нам нужно зарегистрировать [компоновщик шаблонов](views.md#view-composers) в нашем поставщике службы? Это должно быть сделано в рамках метода `boot`. **Этот метод вызывается после регистрации всех других поставщиков служб**, что означает, что у вас есть доступ ко всем другим службам, которые были зарегистрированы фреймворком: 108 | 109 | 132 | #### Внедрение зависимости в методе `boot` 133 | 134 | Вы можете указывать тип зависимостей в методе `boot` поставщика службы. [Контейнер служб](container.md) автоматически внедрит любые необходимые зависимости: 135 | 136 | use Illuminate\Contracts\Routing\ResponseFactory; 137 | 138 | /** 139 | * Загрузка любых служб приложения. 140 | * 141 | * @param \Illuminate\Contracts\Routing\ResponseFactory $response 142 | * @return void 143 | */ 144 | public function boot(ResponseFactory $response) 145 | { 146 | $response->macro('serialized', function ($value) { 147 | // 148 | }); 149 | } 150 | 151 | 152 | ## Регистрация поставщиков 153 | 154 | Все поставщики служб регистрируются в файле конфигурации `config/app.php`. Этот файл содержит массив `providers`, в котором можно перечислить имена классов ваших поставщиков служб. По умолчанию в этом массиве перечислены основные поставщики служб Laravel. Эти поставщики загружают основные компоненты Laravel, такие как почтовая программа, очереди, кеш и другие. 155 | 156 | Чтобы зарегистрировать поставщика, добавьте его в массив: 157 | 158 | 'providers' => [ 159 | // Другие поставщики служб 160 | 161 | App\Providers\ComposerServiceProvider::class, 162 | ], 163 | 164 | 165 | ## Отложенные поставщики 166 | 167 | Если ваш поставщик регистрирует **только** связывания в [контейнере служб](container.md), вы можете отложить его регистрацию до тех пор, пока одно из зарегистрированных связываний не понадобится. Отсрочка загрузки такого поставщика повысит производительность вашего приложения, так как он не загружается из файловой системы при каждом запросе. 168 | 169 | Laravel составляет и сохраняет список всех служб, предоставляемых отложенными поставщиками служб, а также имя класса поставщика службы. Laravel загрузит поставщика службы только при необходимости в одной из этих служб. 170 | 171 | Чтобы отложить загрузку поставщика, реализуйте интерфейс `\Illuminate\Contracts\Support\DeferrableProvider`, описав метод `provides`. Метод `provides` должен вернуть связывания контейнера службы, регистрируемые поставщиком: 172 | 173 | app->singleton(Connection::class, function ($app) { 191 | return new Connection($app['config']['riak']); 192 | }); 193 | } 194 | 195 | /** 196 | * Получить службы, предоставляемые поставщиком. 197 | * 198 | * @return array 199 | */ 200 | public function provides() 201 | { 202 | return [Connection::class]; 203 | } 204 | } 205 | -------------------------------------------------------------------------------- /docs/rate-limiting.md: -------------------------------------------------------------------------------- 1 | # Laravel 9 · Ограничители частоты 2 | 3 | - [Введение](#introduction) 4 | - [Конфигурация кеша](#cache-configuration) 5 | - [Основы использования](#basic-usage) 6 | - [Ручное увеличение попыток](#manually-incrementing-attempts) 7 | - [Очистка попыток](#clearing-attempts) 8 | 9 | 10 | ## Введение 11 | 12 | Laravel включает простую в использовании абстракцию ограничения частоты, которая в сочетании с [кешем](cache.md) вашего приложения обеспечивает простой способ ограничить любое действие в течение указанного периода времени. 13 | 14 | > **Примечание**\ 15 | > Если вас интересует ограничение частоты входящих HTTP-запросов, обратитесь к [документации посредников](routing.md#rate-limiting). 16 | 17 | 18 | ### Конфигурация кеша 19 | 20 | Обычно ограничитель частоты использует кеш вашего приложения по умолчанию, как определено ключом `default` в конфигурационном файле `config/cache.php` вашего приложения. Однако вы можете указать, какой драйвер кеша должен использовать ограничитель частоты, задав ключ `limiter` в конфигурационном файле `config/cache.php` вашего приложения: 21 | 22 | 'default' => 'memcached', 23 | 24 | 'limiter' => 'redis', 25 | 26 | 27 | ## Основы использования 28 | 29 | Фасад `Illuminate\Support\Facades\RateLimiter` может использоваться для взаимодействия с ограничителем частоты. Самый простой метод, предлагаемый ограничителем частоты, – это метод `attempt`, который ограничивает частоту переданного замыкания на указанное количество секунд. 30 | 31 | Метод `attempt` возвращает `false`, если для замыкания не осталось доступных попыток; в противном случае метод `attempt` вернет результат замыкания или `true`. Первый аргумент, принимаемый методом `attempt`, – это строковый «ключ» ограничителя частоты, представляющий действие, ограничиваемое по частоте: 32 | 33 | use Illuminate\Support\Facades\RateLimiter; 34 | 35 | $executed = RateLimiter::attempt( 36 | 'send-message:'.$user->id, 37 | $perMinute = 5, 38 | function() { 39 | // Send message... 40 | } 41 | ); 42 | 43 | if (! $executed) { 44 | return 'Too many messages sent!'; 45 | } 46 | 47 | 48 | ### Ручное увеличение попыток 49 | 50 | Если вы хотите вручную взаимодействовать с ограничителем частоты, то для этого доступно множество других методов. Например, вы можете вызвать метод `tooManyAttempts`, чтобы определить, не превысил ли заданный ключ ограничителя частоты максимальное количество разрешенных попыток в минуту: 51 | 52 | use Illuminate\Support\Facades\RateLimiter; 53 | 54 | if (RateLimiter::tooManyAttempts('send-message:'.$user->id, $perMinute = 5)) { 55 | return 'Too many attempts!'; 56 | } 57 | 58 | В качестве альтернативы, вы можете использовать метод `remaining`, чтобы получить количество оставшихся попыток для конкретного ключа. Если для переданного ключа остались возможные попытки, вы можете вызвать метод `hit`, чтобы увеличить общее количество попыток: 59 | 60 | use Illuminate\Support\Facades\RateLimiter; 61 | 62 | if (RateLimiter::remaining('send-message:'.$user->id, $perMinute = 5)) { 63 | RateLimiter::hit('send-message:'.$user->id); 64 | 65 | // Send message... 66 | } 67 | 68 | 69 | #### Определение доступности ограничителя 70 | 71 | Когда для ключа больше не осталось попыток, метод `availableIn` возвращает количество секунд, оставшихся до тех пор, пока не станут доступны другие попытки: 72 | 73 | use Illuminate\Support\Facades\RateLimiter; 74 | 75 | if (RateLimiter::tooManyAttempts('send-message:'.$user->id, $perMinute = 5)) { 76 | $seconds = RateLimiter::availableIn('send-message:'.$user->id); 77 | 78 | return 'You may try again in '.$seconds.' seconds.'; 79 | } 80 | 81 | 82 | ### Очистка попыток 83 | 84 | Вы можете сбросить количество попыток для конкретного ключа ограничителя частоты, используя метод `clear`. Например, вы можете сбросить количество попыток, когда переданное сообщение прочитано получателем: 85 | 86 | use App\Models\Message; 87 | use Illuminate\Support\Facades\RateLimiter; 88 | 89 | /** 90 | * Отметить сообщение как прочитанное. 91 | * 92 | * @param \App\Models\Message $message 93 | * @return \App\Models\Message 94 | */ 95 | public function read(Message $message) 96 | { 97 | $message->markAsRead(); 98 | 99 | RateLimiter::clear('send-message:'.$message->user_id); 100 | 101 | return $message; 102 | } 103 | -------------------------------------------------------------------------------- /docs/readme.md: -------------------------------------------------------------------------------- 1 | # Laravel Documentation 2 | 3 | You can find the online version of the Laravel documentation at [https://laravel.com/docs](https://laravel.com/docs) 4 | 5 | ## Contribution Guidelines 6 | 7 | If you are submitting documentation for the **current stable release**, submit it to the corresponding branch. For example, documentation for Laravel 9 would be submitted to the `9.x` branch. Documentation intended for the next release of Laravel should be submitted to the `master` branch. 8 | -------------------------------------------------------------------------------- /docs/seeding.md: -------------------------------------------------------------------------------- 1 | # Laravel 9 · База данных · Наполнение фиктивными данными 2 | 3 | - [Введение](#introduction) 4 | - [Написание наполнителей](#writing-seeders) 5 | - [Использование фабрик моделей](#using-model-factories) 6 | - [Вызов дополнительных наполнителей](#calling-additional-seeders) 7 | - [Подавление событий моделей](#muting-model-events) 8 | - [Запуск наполнителей](#running-seeders) 9 | 10 | 11 | ## Введение 12 | 13 | Laravel предлагает возможность наполнения базы данных с использованием классов-наполнителей. Все классы наполнителей хранятся в каталоге `database/seeders`. Класс `DatabaseSeeder` уже определен по умолчанию. В этом классе вы можете использовать метод `call` для запуска других наполнителей, что позволит вам контролировать порядок наполнения БД. 14 | 15 | > **Примечание**\ 16 | > При наполнении базы данных автоматически отключается защита [массового присвоения](eloquent.md#mass-assignment). 17 | 18 | 19 | ## Написание наполнителей 20 | 21 | Чтобы сгенерировать новый наполнитель, используйте команду `make:seeder` [Artisan](artisan.md). Эта команда поместит новый класс наполнителя в каталог `database/seeders` вашего приложения: 22 | 23 | ```shell 24 | php artisan make:seeder UserSeeder 25 | ``` 26 | 27 | Класс наполнителя по умолчанию содержит только один метод: `run`. Этот метод вызывается при выполнении команды `db:seed` Artisan. В методе `run` вы можете вставлять данные в свою базу данных, как хотите. Вы можете использовать [построитель запросов](queries.md) для самостоятельной вставки данных или использовать [фабрики моделей Eloquent](eloquent-factories.md). 28 | 29 | В качестве примера давайте изменим класс `DatabaseSeeder`, созданный по умолчанию, и добавим выражение вставки фасада `DB` в методе `run`: 30 | 31 | insert([ 50 | 'name' => Str::random(10), 51 | 'email' => Str::random(10).'@gmail.com', 52 | 'password' => Hash::make('password'), 53 | ]); 54 | } 55 | } 56 | 57 | > **Примечание**\ 58 | > В методе `run` вы можете объявить любые необходимые типы зависимостей. Они будут автоматически извлечены и внедрены через [контейнер служб](container.md) Laravel. 59 | 60 | 61 | ### Использование фабрик моделей 62 | 63 | Конечно, ручное указание атрибутов для каждой модели наполнителя обременительно. Вместо этого вы можете использовать [фабрики моделей](eloquent-factories.md) для удобного создания большого количества записей в БД. Сначала просмотрите [документацию фабрики моделей](eloquent-factories.md), чтобы узнать, как определить свои фабрики. 64 | 65 | Например, давайте создадим 50 пользователей, у каждого из которых будет по одному посту: 66 | 67 | use App\Models\User; 68 | 69 | /** 70 | * Запустить наполнение базы данных. 71 | * 72 | * @return void 73 | */ 74 | public function run() 75 | { 76 | User::factory() 77 | ->count(50) 78 | ->hasPosts(1) 79 | ->create(); 80 | } 81 | 82 | 83 | ### Вызов дополнительных наполнителей 84 | 85 | Внутри класса `DatabaseSeeder` вы можете использовать метод `call` для запуска других наполнителей. Использование метода `call` позволяет вам разбить ваши наполнители БД на несколько файлов, так что ни один класс наполнителя не станет слишком большим. Метод `call` принимает массив классов, которые должны быть выполнены: 86 | 87 | /** 88 | * Запустить наполнение базы данных. 89 | * 90 | * @return void 91 | */ 92 | public function run() 93 | { 94 | $this->call([ 95 | UserSeeder::class, 96 | PostSeeder::class, 97 | CommentSeeder::class, 98 | ]); 99 | } 100 | 101 | 102 | ### Подавление событий моделей 103 | 104 | Во время наполнения вы можете запретить моделям отправлять события. Вы можете добиться этого, используя трейт `WithoutModelEvents`. При использовании трейта `WithoutModelEvents` гарантирует, что события модели не инициируются, даже если дополнительные классы наполнителей выполняются с помощью метода `call`: 105 | 106 | call([ 125 | UserSeeder::class, 126 | ]); 127 | } 128 | } 129 | 130 | 131 | ## Запуск наполнителей 132 | 133 | Вы можете выполнить команду `db:seed` Artisan для наполнения вашей базы данных. По умолчанию команда `db:seed` запускает класс `Database\Seeders\DatabaseSeeder`, который, в свою очередь, может вызывать другие классы. Однако вы можете использовать параметр `--class`, чтобы указать конкретный класс наполнителя для его индивидуального запуска: 134 | 135 | ```shell 136 | php artisan db:seed 137 | 138 | php artisan db:seed --class=UserSeeder 139 | ``` 140 | 141 | Вы также можете заполнить свою базу данных с помощью команды `migrate:fresh` в сочетании с параметром `--seed`, которая удалит все таблицы и повторно запустит все ваши миграции. Эта команда полезна для полного перестроения вашей базы данных. Параметр `--seeder` может использоваться для указания конкретного наполнителя для запуска: 142 | 143 | ```shell 144 | php artisan migrate:fresh --seed 145 | 146 | php artisan migrate:fresh --seed --seeder=UserSeeder 147 | ``` 148 | 149 | 150 | #### Принудительное наполнение при эксплуатации приложения 151 | 152 | Некоторые операции наполнения могут привести к изменению или потере данных. В окружении `production`, чтобы защитить вас от запуска команд наполнения эксплуатируемой базы данных, вам будет предложено подтвердить их запуск. Чтобы заставить наполнители запускаться без подтверждений, используйте флаг `--force`: 153 | 154 | ```shell 155 | php artisan db:seed --force 156 | ``` 157 | -------------------------------------------------------------------------------- /docs/socialite.md: -------------------------------------------------------------------------------- 1 | # Laravel 9 · Пакет Laravel Socialite 2 | 3 | - [Введение](#introduction) 4 | - [Установка](#installation) 5 | - [Обновление пакета Socialite](#upgrading-socialite) 6 | - [Конфигурирование](#configuration) 7 | - [Аутентификация](#authentication) 8 | - [Маршрутизация](#routing) 9 | - [Аутентификация и хранение пользователей](#authentication-and-storage) 10 | - [Права доступа](#access-scopes) 11 | - [Необязательные параметры](#optional-parameters) 12 | - [Получение сведений о пользователе](#retrieving-user-details) 13 | 14 | 15 | ## Введение 16 | 17 | Помимо типичной аутентификации на основе форм, Laravel также предлагает простой и удобный способ аутентификации через провайдеров OAuth с помощью [Laravel Socialite](https://github.com/laravel/socialite). Socialite в настоящее время поддерживает аутентификацию через Facebook, Twitter, LinkedIn, Google, GitHub, GitLab, и Bitbucket. 18 | 19 | > **Примечание**\ 20 | > Адаптеры для других платформ перечислены на веб-сайте [Socialite Providers](https://socialiteproviders.com/), управляемом сообществом. 21 | 22 | 23 | ## Установка 24 | 25 | Для начала установите Socialite с помощью менеджера пакетов Composer в свой проект: 26 | 27 | ```shell 28 | composer require laravel/socialite 29 | ``` 30 | 31 | 32 | ## Обновление пакета Socialite 33 | 34 | При обновлении Socialite важно внимательно изучить [руководство по обновлению](https://github.com/laravel/socialite/blob/master/UPGRADE.md). 35 | 36 | 37 | ## Конфигурирование 38 | 39 | Перед использованием Socialite вам нужно будет добавить учетные данные для провайдеров OAuth, которые использует ваше приложение. Как правило, эти учетные данные можно получить, создав «приложение разработчика» на панели инструментов службы, с которой вы будете проходить аутентификацию. 40 | 41 | Эти учетные данные должны быть размещены в файле конфигурации вашего приложения `config/services.php` и должны использовать ключ `facebook`, `twitter` (OAuth 1.0), `twitter-oauth-2` (OAuth 2.0), `linkedin`, `google`, `github`, `gitlab` или `bitbucket`, в зависимости от провайдеров, которые требуются вашему приложению: 42 | 43 | 'github' => [ 44 | 'client_id' => env('GITHUB_CLIENT_ID'), 45 | 'client_secret' => env('GITHUB_CLIENT_SECRET'), 46 | 'redirect' => 'http://example.com/callback-url', 47 | ], 48 | 49 | > **Примечание**\ 50 | > Если параметр `redirect` содержит относительный путь, то он будет автоматически преобразован в абсолютный URL. 51 | 52 | 53 | ## Аутентификация 54 | 55 | 56 | ### Маршрутизация 57 | 58 | Для аутентификации пользователей с помощью провайдера OAuth вам понадобятся два маршрута: один для перенаправления пользователя к провайдеру OAuth, а другой для получения обратного вызова от провайдера после аутентификации. Пример ниже демонстрирует реализацию обоих маршрутов: 59 | 60 | use Laravel\Socialite\Facades\Socialite; 61 | 62 | Route::get('/auth/redirect', function () { 63 | return Socialite::driver('github')->redirect(); 64 | }); 65 | 66 | Route::get('/auth/callback', function () { 67 | $user = Socialite::driver('github')->user(); 68 | 69 | // $user->token 70 | }); 71 | 72 | Метод `redirect` фасада `Socialite` обеспечивает перенаправление пользователя к провайдеру OAuth, а метод `user` обрабатывает входящий запрос и извлекает информацию о пользователе от провайдера после того, как он подтвердил запрос на аутентификацию. 73 | 74 | 75 | ### Аутентификация и хранение пользователей 76 | 77 | После того, как пользователь был получен от провайдера OAuth, вы можете определить, существует ли пользователь в базе данных вашего приложения, и [аутентифицировать пользователя](authentication.md#authenticate-a-user-instance). Если пользователь не существует в базе данных вашего приложения, то вы можете создать новую запись в своей базе данных для представления пользователя: 78 | 79 | use App\Models\User; 80 | use Illuminate\Support\Facades\Auth; 81 | use Laravel\Socialite\Facades\Socialite; 82 | 83 | Route::get('/auth/callback', function () { 84 | $githubUser = Socialite::driver('github')->user(); 85 | 86 | $user = User::updateOrCreate([ 87 | 'github_id' => $githubUser->id, 88 | ], [ 89 | 'name' => $githubUser->name, 90 | 'email' => $githubUser->email, 91 | 'github_token' => $githubUser->token, 92 | 'github_refresh_token' => $githubUser->refreshToken, 93 | ]); 94 | 95 | Auth::login($user); 96 | 97 | return redirect('/dashboard'); 98 | }); 99 | 100 | > **Примечание**\ 101 | > О том, какая информация о пользователе доступна у конкретных провайдеров OAuth, ознакомьтесь с документацией по [получению сведений о пользователе](#retrieving-user-details). 102 | 103 | 104 | ### Права доступа 105 | 106 | Перед перенаправлением пользователя вы можете использовать метод `scopes`, чтобы добавить дополнительные «права» к запросу аутентификации. Этот метод объединит все существующие права с указанными: 107 | 108 | use Laravel\Socialite\Facades\Socialite; 109 | 110 | return Socialite::driver('github') 111 | ->scopes(['read:user', 'public_repo']) 112 | ->redirect(); 113 | 114 | Вы можете перезаписать все существующие права в запросе аутентификации, используя метод `setScopes`: 115 | 116 | return Socialite::driver('github') 117 | ->setScopes(['read:user', 'public_repo']) 118 | ->redirect(); 119 | 120 | 121 | ### Необязательные параметры 122 | 123 | Некоторые провайдеры OAuth поддерживают другие необязательные параметры запроса перенаправления. Чтобы включить в запрос любые необязательные параметры, вызовите метод `with` с ассоциативным массивом: 124 | 125 | use Laravel\Socialite\Facades\Socialite; 126 | 127 | return Socialite::driver('google') 128 | ->with(['hd' => 'example.com']) 129 | ->redirect(); 130 | 131 | > **Предупреждение**\ 132 | > При использовании метода `with` будьте осторожны, чтобы не передавать какие-либо зарезервированные ключевые слова, такие как `state` или `response_type`. 133 | 134 | 135 | ## Получение сведений о пользователе 136 | 137 | После того, как пользователь будет перенаправлен обратно на маршрут `callback` аутентификации вашего приложения, вы можете получить данные пользователя, используя метод `user` Socialite. Объект пользователя, возвращаемый методом `user`, содержит множество свойств и методов, которые вы можете использовать для сохранения информации о пользователе в вашей собственной базе данных. 138 | 139 | Для этого объекта могут быть доступны различные свойства и методы в зависимости от версии провайдера OAuth, с которым вы выполняете аутентификацию: 140 | 141 | use Laravel\Socialite\Facades\Socialite; 142 | 143 | Route::get('/auth/callback', function () { 144 | $user = Socialite::driver('github')->user(); 145 | 146 | // Провайдер OAuth 2.0 ... 147 | $token = $user->token; 148 | $refreshToken = $user->refreshToken; 149 | $expiresIn = $user->expiresIn; 150 | 151 | // Провайдер OAuth 1.0 ... 152 | $token = $user->token; 153 | $tokenSecret = $user->tokenSecret; 154 | 155 | // Все провайдеры ... 156 | $user->getId(); 157 | $user->getNickname(); 158 | $user->getName(); 159 | $user->getEmail(); 160 | $user->getAvatar(); 161 | }); 162 | 163 | 164 | #### Получение сведений о пользователе из токена (OAuth2) 165 | 166 | Если у вас уже есть действительный токен доступа пользователя, то вы можете получить данные о пользователе с помощью метода `userFromToken` пакета Socialite: 167 | 168 | use Laravel\Socialite\Facades\Socialite; 169 | 170 | $user = Socialite::driver('github')->userFromToken($token); 171 | 172 | 173 | #### Получение сведений о пользователе из токена и секретного ключа (OAuth1) 174 | 175 | Если у вас уже есть действительный токен и секретный ключ пользователя, то вы можете получить данные о пользователе с помощью метода `userFromTokenAndSecret` пакета Socialite: 176 | 177 | use Laravel\Socialite\Facades\Socialite; 178 | 179 | $user = Socialite::driver('twitter')->userFromTokenAndSecret($token, $secret); 180 | 181 | 182 | #### Аутентификация без сохранения состояния 183 | 184 | Метод `stateless` может использоваться для отключения проверки состояния сессии. Это полезно при добавлении социальной аутентификации в API без сохранения состояния, который не использует сессии на основе файлов куки: 185 | 186 | use Laravel\Socialite\Facades\Socialite; 187 | 188 | return Socialite::driver('google')->stateless()->user(); 189 | 190 | > **Предупреждение**\ 191 | > Аутентификация без сохранения состояния недоступна для драйвера Twitter OAuth 1.0. 192 | -------------------------------------------------------------------------------- /docs/starter-kits.md: -------------------------------------------------------------------------------- 1 | # Laravel 9 · Стартовые комплекты 2 | 3 | - [Введение](#introduction) 4 | - [Laravel Breeze](#laravel-breeze) 5 | - [Установка](#laravel-breeze-installation) 6 | - [Breeze и Blade](#breeze-and-blade) 7 | - [Breeze и React / Vue](#breeze-and-inertia) 8 | - [Breeze и Next.js / API](#breeze-and-next) 9 | - [Laravel Jetstream](#laravel-jetstream) 10 | 11 | 12 | ## Введение 13 | 14 | Чтобы дать вам фору при создании нового приложения, Laravel предлагает стартовые комплекты приложения и, в частности, аутентификации. Эти комплекты автоматически дополнят ваше приложение маршрутами, контроллерами и шаблонами, необходимыми для регистрации и аутентификации пользователей вашего приложения. 15 | 16 | Вы можете использовать эти стартовые комплекты, но они не требуются. Вы можете создать собственное приложение с нуля, просто установив новую копию Laravel. В любом случае, мы знаем, что вы создадите что-то отличное! 17 | 18 | 19 | ## Laravel Breeze 20 | 21 | [Laravel Breeze](https://github.com/laravel/breeze) – это минимальная и простая реализация всего [функционала аутентификации](authentication.md) Laravel, включая вход в систему, регистрацию, сброс пароля, подтверждение адреса электронной почты и пароля. Кроме того, Breeze включает простую страницу «профиля», где пользователь может обновить свое имя, адрес электронной почты и пароль. 22 | 23 | Слой «View» комплекта Laravel Breeze по умолчанию состоит из простых [шаблонов Blade](blade.md), стилизованных с помощью [Tailwind CSS](https://tailwindcss.com). Или Breeze может создать каркас вашего приложения с помощью Vue или React и [Inertia] (https://inertiajs.com). 24 | 25 | Breeze является прекрасной отправной точкой для создания нового приложения Laravel, а также отличный выбор для проектов, которые планируют вывести использование шаблонов Blade на новый уровень с помощью [Laravel Livewire](https://laravel-livewire.com). 26 | 27 | 28 | 29 | #### Laravel Bootcamp 30 | 31 | Если вы новичок в Laravel, не стесняйтесь перейти в [Laravel Bootcamp](https://bootcamp.laravel.com). Laravel Bootcamp проведет вас через создание вашего первого приложения Laravel с использованием Breeze. Это отличный способ познакомиться со всем, что могут предложить Laravel и Breeze. 32 | 33 | 34 | ### Установка 35 | 36 | Сначала вы должны [создать новое приложение Laravel](installation.md), настроить свою базу данных и запустить [миграции базы данных](migrations.md). После того, как вы создали новое приложение Laravel, вы можете установить Laravel Breeze с помощью Composer: 37 | 38 | ```shell 39 | composer require laravel/breeze --dev 40 | ``` 41 | 42 | После установки Breeze вы можете создать шаблон для своего приложения, используя один из «стеков» Breeze, описанных в документации ниже. 43 | 44 | 45 | ### Breeze и Blade 46 | 47 | После того, как Composer установит пакет Laravel Breeze, вы можете запустить команду `breeze:install` Artisan. Эта команда опубликует для вашего приложения шаблоны, маршруты, контроллеры и другие ресурсы аутентификации. Laravel Breeze опубликует весь свой код в вашем приложении, чтобы у вас был полный контроль, а также обзор всего функционала и его реализации. 48 | 49 | Стек Breeze по умолчанию — это стек Blade, который использует простые [шаблоны Blade](blade.md) для отрисовки внешнего интерфейса вашего приложения. Стек Blade можно установить, вызвав команду `breeze:install` без дополнительных аргументов. После установки каркаса Breeze вы также должны скомпилировать ресурсы внешнего интерфейсные вашего приложения: 50 | 51 | ```shell 52 | php artisan breeze:install 53 | 54 | php artisan migrate 55 | npm install 56 | npm run dev 57 | ``` 58 | 59 | Затем, вы можете перейти в своем веб-браузере по URL-адресам вашего приложения `/login` или `/register`. Все маршруты Breeze определены в файле `routes/auth.php`. 60 | 61 | 62 | #### Темная тема 63 | 64 | Если вы хотите, чтобы Breeze включил поддержку «темной темы» при создании внешнего интерфейса вашего приложения, просто укажите директиву `--dark` при выполнении команды `breeze:install`: 65 | 66 | ```shell 67 | php artisan breeze:install --dark 68 | ``` 69 | 70 | > **Примечание**\ 71 | > Чтобы узнать больше о компиляции CSS и JavaScript вашего приложения, ознакомьтесь с [документацией Laravel Vite](vite.md#running-vite). 72 | 73 | 74 | ### Breeze и React / Vue 75 | 76 | Laravel Breeze также предлагает каркасы React и Vue через реализацию внешнего интерфейса [Inertia](https://inertiajs.com). Inertia позволяет создавать современные одностраничные приложения React и Vue, используя классическую маршрутизацию и контроллеры на стороне сервера. 77 | 78 | Inertia позволяет вам наслаждаться мощью внешнего интерфейса React и Vue в сочетании с невероятной производительностью Laravel и молниеносной компиляцией [Vite](https://vitejs.dev). Чтобы использовать стек Inertia, укажите `vue` или `react` в качестве желаемого стека при выполнении команды `breeze:install` Artisan. После установки каркаса Breeze вы также должны скомпилировать ресурсы внешнего интерфейсные вашего приложения: 79 | 80 | ```shell 81 | php artisan breeze:install vue 82 | 83 | # Или ... 84 | 85 | php artisan breeze:install react 86 | 87 | php artisan migrate 88 | npm install 89 | npm run dev 90 | ``` 91 | 92 | Затем, вы можете перейти в своем веб-браузере по URL-адресам вашего приложения `/login` или `/register`. Все маршруты Breeze определены в файле `routes/auth.php`. 93 | 94 | 95 | #### Серверный рендеринг 96 | 97 | Если вы хотите, чтобы Breeze поддерживал [Inertia SSR](https://inertiajs.com/server-side-rendering), то вы можете указать параметр `ssr` при вызове команды `breeze:install`: 98 | 99 | ```shell 100 | php artisan breeze:install vue --ssr 101 | php artisan breeze:install react --ssr 102 | ``` 103 | 104 | 105 | ### Breeze и Next.js / API 106 | 107 | Laravel Breeze также может создать API-интерфейс аутентификации, готовый для аутентификации современных приложений JavaScript, например, на базе [Next](https://nextjs.org), [Nuxt](https://nuxtjs.org) и других. Для начала укажите стек `api` в качестве желаемого при выполнении команды `breeze:install` Artisan: 108 | 109 | ```shell 110 | php artisan breeze:install api 111 | 112 | php artisan migrate 113 | ``` 114 | 115 | Во время установки Breeze добавит переменную среды `FRONTEND_URL` в файл `.env` вашего приложения. Этот URL-адрес должен быть URL-адресом вашего приложения JavaScript. Обычно во время локальной разработки этим адресом будет `http://localhost:3000`. Кроме того, вы должны убедиться, что для вашего `APP_URL` установлено значение `http://localhost:8000`, которое является URL-адресом по умолчанию, используемым командой `serve` Artisan. 116 | 117 | 118 | #### Доступная реализация Next.js 119 | 120 | Теперь вы будете готовы совместить указанный выше бэкэнд с выбранным вами интерфейсом. Реализация Next внешнего интерфейса Breeze доступна на [GitHub](https://github.com/laravel/breeze-next). Этот интерфейс поддерживается Laravel и содержит тот же пользовательский интерфейс, что и традиционные стеки Blade и Inertia, предоставляемые Breeze. 121 | 122 | 123 | ## Laravel Jetstream 124 | 125 | В то время как Laravel Breeze обеспечивает простую и минимальную отправную точку для создания приложения Laravel, Jetstream дополняет эту функциональность более надежными функциями и дополнительными стеками технологий клиентского интерфейса. **Для тех, кто новичок в Laravel, мы рекомендуем изучить основы работы с Laravel Breeze перед тем, как перейти на Laravel Jetstream.** 126 | 127 | Jetstream предлагает красиво оформленный каркас приложений для Laravel и включает в себя вход в систему, регистрацию, подтверждение адреса электронной почты, двухфакторную аутентификацию, управление сессиями, поддержку API через Laravel Sanctum, и дополнительно, управление командой. Jetstream разработан с использованием [Tailwind CSS](https://tailwindcss.com) и предлагает на ваш выбор каркас клиентского интерфейса под управлением [Livewire](https://laravel-livewire.com) либо [Inertia](https://inertiajs.com). 128 | 129 | Полное описание по установке Laravel Jetstream можно найти в [официальной документации Jetstream](https://jetstream.laravel.com). 130 | -------------------------------------------------------------------------------- /docs/testing.md: -------------------------------------------------------------------------------- 1 | # Laravel 9 · Тестирование · Начало работы 2 | 3 | - [Введение](#introduction) 4 | - [Окружение](#environment) 5 | - [Создание тестов](#creating-tests) 6 | - [Запуск тестов](#running-tests) 7 | - [Параллельное выполнение тестов](#running-tests-in-parallel) 8 | - [Отчет о покрытии тестами](#reporting-test-coverage) 9 | 10 | 11 | ## Введение 12 | 13 | Laravel построен с учетом требований тестирования. Фактически, поддержка тестирования с помощью PHPUnit включена прямо из коробки, и файл `phpunit.xml` уже настроен для вашего приложения. Фреймворк также поставляется с удобными вспомогательными методами, позволяющими выразительно тестировать ваши приложения. 14 | 15 | По умолчанию каталог `tests` вашего приложения содержит два каталога: `Feature` и `Unit`. Модульные (юнит) тесты – это тесты, которые фокусируются на очень небольшой изолированной части вашего кода. Фактически, большинство модульных тестов, вероятно, сосредоточены на одном методе. Тесты в каталоге «Unit» тестов не загружают ваше приложение Laravel и, следовательно, не могут получить доступ к базе данных вашего приложения или другим службам фреймворка. 16 | 17 | Функциональные тесты могут тестировать большую часть вашего кода, включая взаимодействие нескольких объектов друг с другом, или даже целый HTTP-запрос, возвращающий JSON. **Как правило, большинство ваших тестов должны быть функциональными. Эти типы тестов обеспечивают максимальную уверенность в том, что ваша система в целом работает должным образом.** 18 | 19 | Файл `ExampleTest.php` находится в каталогах тестов `Feature` и `Unit`. После установки нового приложения Laravel выполните команды `vendor/bin/phpunit` или `php artisan test` из командной строки для запуска ваших тестов. 20 | 21 | 22 | ## Окружение 23 | 24 | При запуске тестов, Laravel автоматически устанавливает [конфигурацию окружения](configuration.md#environment-configuration) как «тестовое» благодаря переменной окружения, определенной в файле `phpunit.xml`. Laravel во время тестирования также автоматически настраивает для сессии и кеша драйверы `array`, что означает, что во время тестирования данные сессии или кеша не сохраняются. 25 | 26 | При необходимости вы можете определять другие значения конфигурации среды тестирования. Переменные окружения `testing` могут быть настроены в файле `phpunit.xml`, но перед запуском тестов не забудьте очистить кеш конфигурации с помощью команды `config:clear` Artisan! 27 | 28 | 29 | #### Переменная окружения `.env.testing` 30 | 31 | Кроме того, вы можете создать файл `.env.testing` в корне вашего проекта. Этот файл будет использоваться вместо `.env` при запуске тестов PHPUnit или выполнении команд Artisan с параметром `--env=testing`. 32 | 33 | 34 | #### Трейт `CreatesApplication` 35 | 36 | Laravel содержит трейт `CreatesApplication`, который применяется к базовому классу `TestCase` вашего приложения. Этот трейт содержит метод `createApplication`, который загружает приложение Laravel перед запуском ваших тестов. Важно, чтобы вы оставили этот трейт в его исходном месте, так как от него зависит некоторый функционал, например, функционал параллельного тестирования Laravel. 37 | 38 | 39 | ## Создание тестов 40 | 41 | Чтобы сгенерировать новый тест, используйте команду `make:test` [Artisan](artisan.md). Эта команда поместит новый класс теста в каталог `tests/Feature` вашего приложения: 42 | 43 | ```shell 44 | php artisan make:test UserTest 45 | ``` 46 | 47 | Если вы хотите создать тест в каталоге `tests/Unit`, то используйте параметр `--unit` при выполнении команды `make:test`: 48 | 49 | ```shell 50 | php artisan make:test UserTest --unit 51 | ``` 52 | 53 | Если вы хотите создать тест [Pest PHP](https://pestphp.com), то вы можете указать флаг `--pest` для команды `make:test`: 54 | 55 | ```shell 56 | php artisan make:test UserTest --pest 57 | php artisan make:test UserTest --unit --pest 58 | ``` 59 | 60 | > **Примечание**\ 61 | > Заготовки тестов можно настроить с помощью [публикации заготовок](artisan.md#stub-customization). 62 | 63 | После того, как тест был сгенерирован, вы можете определить методы тестирования, как обычно, используя [PHPUnit](https://phpunit.de). Чтобы запустить ваши тесты, выполните команду `vendor/bin/phpunit` или `php artisan test` из вашего терминала: 64 | 65 | assertTrue(true); 81 | } 82 | } 83 | 84 | > **Предупреждение**\ 85 | > Если вы определяете свои собственные методы `setUp` / `tearDown` в тестовом классе, обязательно вызывайте соответствующие методы `parent::setUp()` / `parent::tearDown()` родительского класса. 86 | 87 | 88 | ## Запуск тестов 89 | 90 | Как упоминалось ранее, после того, как вы написали тесты, вы можете запускать их с помощью `phpunit`: 91 | 92 | ```shell 93 | ./vendor/bin/phpunit 94 | ``` 95 | 96 | В дополнение к команде `phpunit`, вы можете использовать команду `test` Artisan для запуска ваших тестов. Тестер Artisan отображает подробные отчеты о тестах для упрощения разработки и отладки: 97 | 98 | ```shell 99 | php artisan test 100 | ``` 101 | 102 | Любые аргументы, которые могут быть переданы команде `phpunit`, также могут быть переданы команде Artisan `test`: 103 | 104 | ```shell 105 | php artisan test --testsuite=Feature --stop-on-failure 106 | ``` 107 | 108 | 109 | ### Параллельное выполнение тестов 110 | 111 | По умолчанию Laravel и PHPUnit выполняют ваши тесты последовательно в рамках одного процесса. Однако вы можете значительно сократить время, необходимое для запуска тестов, за счет одновременного выполнения тестов в нескольких процессах. Для начала убедитесь, что в зависимостях вашего приложения имеется пакет `nunomaduro/collision` версии `^5.3` или выше. При выполнении команды `test` Artisan используйте параметр `--parallel`: 112 | 113 | ```shell 114 | php artisan test --parallel 115 | ``` 116 | 117 | По умолчанию Laravel создает столько процессов, сколько ядер ЦП доступно на вашем компьютере. Однако вы можете настроить количество процессов, используя параметр `--processes`: 118 | 119 | ```shell 120 | php artisan test --parallel --processes=4 121 | ``` 122 | 123 | > **Предупреждение**\ 124 | > При параллельном запуске тестов некоторые параметры PHPUnit (такие как `--do-not-cache-result`) могут быть недоступны. 125 | 126 | 127 | #### Параллельное тестирование и базы данных 128 | 129 | Laravel автоматически обрабатывает создание и миграцию тестовой базы данных для каждого параллельного процесса, в котором выполняются ваши тесты. К тестовым базам данных будет добавлен суффикс, уникальный для каждого процесса. Например, если у вас есть два параллельных тестовых процесса, Laravel создаст и будет использовать тестовые базы данных `your_db_test_1` и `your_db_test_2`. 130 | 131 | По умолчанию тестовые базы данных сохраняются между вызовами команды `test` Artisan, чтобы их можно было использовать снова при последующих вызовах `test`. Однако вы можете пересоздать их, используя параметр `--recreate-databases`: 132 | 133 | ```shell 134 | php artisan test --parallel --recreate-databases 135 | ``` 136 | 137 | 138 | #### Хуки параллельного тестирования 139 | 140 | Иногда требуется подготовить определенные ресурсы, используемые тестами вашего приложения, чтобы их можно было безопасно использовать в нескольких процессах тестирования. 141 | 142 | Используя фасад `ParallelTesting`, вы можете указать код, который будет выполняться в `setUp` и `tearDown` процесса или тестового класса. Переданные замыкания получат переменные `$token` и `$testCase`, которые содержат токен процесса и текущий тестовый класс, соответственно: 143 | 144 | 185 | #### Доступ к токену процесса параллельного тестирования 186 | 187 | Если вы хотите получить доступ к «токену» текущего процесса из любого другого места в коде теста вашего приложения, то вы можете использовать метод `token`. Этот токен представляет собой уникальный строковый идентификатор для каждого из процессов тестирования и может использоваться для разделения [подготавливаемых ресурсов](#parallel-testing-hooks) процессов параллельного тестирования. Например, Laravel автоматически добавляет этот токен в конец тестовых баз данных, создаваемых каждым процессом параллельного тестирования: 188 | 189 | $token = ParallelTesting::token(); 190 | 191 | 192 | ### Отчет о покрытии тестами 193 | 194 | > **Предупреждение**\ 195 | > Данный функционал требует [Xdebug](https://xdebug.org) или [PCOV](https://pecl.php.net/package/pcov). 196 | 197 | При выполнении тестов приложения вы можете определить, действительно ли ваши тесты охватывают код приложения и сколько кода приложения используется при выполнении ваших тестов. Для этого вы можете указать флаг `--coverage` при вызове команды `test`: 198 | 199 | ```shell 200 | php artisan test --coverage 201 | ``` 202 | 203 | 204 | #### Обеспечение минимального порога покрытия 205 | 206 | Вы можете использовать параметр `--min`, чтобы определить минимальный порог покрытия тестами вашего приложения. Набор тестов завершится ошибкой, если этот порог не будет достигнут: 207 | 208 | ```shell 209 | php artisan test --coverage --min=80.3 210 | ``` 211 | -------------------------------------------------------------------------------- /docs/urls.md: -------------------------------------------------------------------------------- 1 | # Laravel 9 · Генерация URL-адресов 2 | 3 | - [Введение](#introduction) 4 | - [Основы](#the-basics) 5 | - [Создание URL](#generating-urls) 6 | - [Доступ к текущему URL](#accessing-the-current-url) 7 | - [URL для именованных маршрутов](#urls-for-named-routes) 8 | - [Подписанные URL](#signed-urls) 9 | - [URL для действий контроллера](#urls-for-controller-actions) 10 | - [Значения по умолчанию](#default-values) 11 | 12 | 13 | ## Введение 14 | 15 | Laravel предлагает несколько функций, которые помогут вам в создании URL-адресов для вашего приложения. Эти помощники в первую очередь полезны при построении ссылок в ваших шаблонах и ответах API или при создании ответов-перенаправлений в другую часть вашего приложения. 16 | 17 | 18 | ## Основы 19 | 20 | 21 | ### Создание URL 22 | 23 | Помощник `url` используется для генерации произвольных URL-адресов для вашего приложения. Сгенерированный URL-адрес будет автоматически использовать схему (HTTP или HTTPS) и хост из текущего запроса, обрабатываемого приложением: 24 | 25 | $post = App\Models\Post::find(1); 26 | 27 | echo url("/posts/{$post->id}"); 28 | 29 | // http://example.com/posts/1 30 | 31 | 32 | ### Доступ к текущему URL 33 | 34 | Если не передан путь помощнику `url`, то возвращается экземпляр `Illuminate\Routing\UrlGenerator`, позволяющий вам получить доступ к информации о текущем URL: 35 | 36 | // Получить текущий URL без строки запроса ... 37 | echo url()->current(); 38 | 39 | // Получить текущий URL, включая строку запроса ... 40 | echo url()->full(); 41 | 42 | // Получить полный URL-адрес предыдущего запроса ... 43 | echo url()->previous(); 44 | 45 | К каждому из этих методов также можно получить доступ через [фасад](facades.md) `URL`: 46 | 47 | use Illuminate\Support\Facades\URL; 48 | 49 | echo URL::current(); 50 | 51 | 52 | ## URL для именованных маршрутов 53 | 54 | Помощник `route` используется для генерации URL-адресов для [именованных маршрутов](routing.md#named-routes). Именованные маршруты позволяют создавать URL-адреса без привязки к фактическому URL-адресу, определенному в маршруте. Следовательно, если URL-адрес маршрута изменится, никаких изменений в ваши вызовы функции `route` вносить не нужно. Например, представьте, что ваше приложение содержит маршрут, определенный следующим образом: 55 | 56 | Route::get('/post/{post}', function (Post $post) { 57 | // 58 | })->name('post.show'); 59 | 60 | Чтобы сгенерировать URL-адрес этого маршрута, вы можете использовать помощник `route` следующим образом: 61 | 62 | echo route('post.show', ['post' => 1]); 63 | 64 | // http://example.com/post/1 65 | 66 | Конечно, помощник `route` также может использоваться для генерации URL-адресов для маршрутов с несколькими параметрами: 67 | 68 | Route::get('/post/{post}/comment/{comment}', function (Post $post, Comment $comment) 69 | // 70 | })->name('comment.show'); 71 | 72 | echo route('comment.show', ['post' => 1, 'comment' => 3]); 73 | 74 | // http://example.com/post/1/comment/3 75 | 76 | Любые дополнительные элементы массива, не соответствующие параметрам определения маршрута, будут добавлены в строку запроса URL: 77 | 78 | echo route('post.show', ['post' => 1, 'search' => 'rocket']); 79 | 80 | // http://example.com/post/1?search=rocket 81 | 82 | 83 | #### Модели Eloquent 84 | 85 | Вы часто будете генерировать URL-адреса, используя ключ маршрута (обычно первичный ключ) [модели Eloquent](eloquent.md). По этой причине вы можете передавать в качестве значений параметров модели Eloquent полностью. Помощник `route` автоматически извлечет ключ маршрута модели: 86 | 87 | echo route('post.show', ['post' => $post]); 88 | 89 | 90 | ### Подписанные URL 91 | 92 | Laravel позволяет вам легко создавать «подписанные» URL-адреса для именованных маршрутов. Эти URL-адреса имеют хеш «подписи», добавленный к строке запроса, который позволяет Laravel проверять, что URL-адрес не был изменен с момента его создания. Подписанные URL-адреса особенно полезны для маршрутов, которые общедоступны, но требуют уровня защиты от манипуляций с URL-адресами. 93 | 94 | Например, вы можете использовать подписанные URL-адреса для реализации общедоступной ссылки «отказаться от подписки», которая отправляется вашим клиентам по электронной почте. Чтобы создать подписанный URL для именованного маршрута, используйте метод `signedRoute` фасада `URL`: 95 | 96 | use Illuminate\Support\Facades\URL; 97 | 98 | return URL::signedRoute('unsubscribe', ['user' => 1]); 99 | 100 | Если вы хотите сгенерировать временный подписанный URL-адрес маршрута, срок действия которого истекает по истечении определенного времени, вы можете использовать метод `temporarySignedRoute`. Когда Laravel проверяет временный подписанный URL-адрес маршрута, он гарантирует, что метка времени истечения срока, закодированная в подписанный URL-адрес, не истекла: 101 | 102 | use Illuminate\Support\Facades\URL; 103 | 104 | return URL::temporarySignedRoute( 105 | 'unsubscribe', now()->addMinutes(30), ['user' => 1] 106 | ); 107 | 108 | 109 | #### Проверка запросов подписанного маршрута 110 | 111 | Чтобы убедиться, что входящий запрос имеет действительную подпись, вы должны вызвать метод `hasValidSignature` для экземпляра `Illuminate\Http\Request` входящего запроса: 112 | 113 | use Illuminate\Http\Request; 114 | 115 | Route::get('/unsubscribe/{user}', function (Request $request) { 116 | if (! $request->hasValidSignature()) { 117 | abort(401); 118 | } 119 | 120 | // ... 121 | })->name('unsubscribe'); 122 | 123 | Иногда требуется разрешить внешнему интерфейсу вашего приложения добавлять данные к подписанному URL-адресу, например, при выполнении разбивки на страницы на стороне клиента. Таким образом, вы можете указать параметры запроса, которые следует игнорировать при проверке подписанного URL-адреса, используя метод `hasValidSignatureWhileIgnoring`. Помните, что игнорирование параметров позволяет любому изменять эти параметры: 124 | 125 | if (! $request->hasValidSignatureWhileIgnoring(['page', 'order'])) { 126 | abort(401); 127 | } 128 | 129 | Вместо проверки подписанных URL-адресов с использованием экземпляра входящего запроса, вы можете назначить маршруту [посредник](middleware.md) `Illuminate\Routing\Middleware\ValidateSignature`. Если его еще нет, то вы должны назначить этому посреднику ключ в массиве `routeMiddleware` в HTTP-ядре: 130 | 131 | /** 132 | * Посредники маршрутов приложения. 133 | * 134 | * Эти посредники могут быть групповыми или использоваться по отдельности. 135 | * 136 | * @var array 137 | */ 138 | protected $routeMiddleware = [ 139 | 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, 140 | ]; 141 | 142 | После того, как вы зарегистрировали посредников в ядре приложения, вы можете назначить его маршруту. Если входящий запрос не имеет действительной подписи, посредник автоматически вернет HTTP-ответ `403`: 143 | 144 | Route::post('/unsubscribe/{user}', function (Request $request) { 145 | // ... 146 | })->name('unsubscribe')->middleware('signed'); 147 | 148 | 149 | #### Ответ на недействительные подписанные маршруты 150 | 151 | Когда кто-то посещает подписанный URL-адрес, срок действия которого истек, он получит общую страницу с `403`-им кодом ошибки состояния HTTP. Однако вы можете изменить это поведение, определив собственное замыкание метода `renderable` для исключения `InvalidSignatureException` в вашем обработчике исключений. Это замыкание должно вернуть HTTP-ответ: 152 | 153 | use Illuminate\Routing\Exceptions\InvalidSignatureException; 154 | 155 | /** 156 | * Зарегистрировать замыкания, обрабатывающие исключения приложения. 157 | * 158 | * @return void 159 | */ 160 | public function register() 161 | { 162 | $this->renderable(function (InvalidSignatureException $e) { 163 | return response()->view('error.link-expired', [], 403); 164 | }); 165 | } 166 | 167 | 168 | ## URL для действий контроллера 169 | 170 | Функция `action` генерирует URL-адрес для переданного действия контроллера: 171 | 172 | use App\Http\Controllers\HomeController; 173 | 174 | $url = action([HomeController::class, 'index']); 175 | 176 | Если метод контроллера принимает параметры маршрута, вы можете передать ассоциативный массив параметров маршрута в качестве второго аргумента функции: 177 | 178 | $url = action([UserController::class, 'profile'], ['id' => 1]); 179 | 180 | 181 | ## Значения по умолчанию 182 | 183 | Для некоторых приложений вы можете указать значения по умолчанию для определенных параметров URL-адреса. Например, представьте, что многие из ваших маршрутов определяют параметр `{locale}`: 184 | 185 | Route::get('/{locale}/posts', function () { 186 | // 187 | })->name('post.index'); 188 | 189 | Обременительно передавать `locale` каждый раз при вызове помощника `route`. Итак, вы можете использовать метод `URL::defaults`, чтобы определить значение по умолчанию для этого параметра, которое всегда будет применяться во время текущего запроса. Вы можете вызвать этот метод из [посредника маршрута](middleware.md#assigning-middleware-to-routes), чтобы получить доступ к текущему запросу: 190 | 191 | $request->user()->locale]); 210 | 211 | return $next($request); 212 | } 213 | } 214 | 215 | После установки значения по умолчанию для параметра `locale` вам больше не потребуется передавать его значение при генерации URL-адресов с помощью помощника `route`. 216 | 217 | 218 | #### Параметры URL по умолчанию и приоритет посредника 219 | 220 | Установка значений URL по умолчанию может мешать Laravel обрабатывать неявные привязки модели. Следовательно, необходимо [установить приоритет посреднику](middleware.md#sorting-middleware), который задает значения URL по умолчанию, и должен выполняться перед посредником Laravel `SubstituteBindings`. Вы можете добиться этого, убедившись, что ваш посредник находится перед посредником `SubstituteBindings` в свойстве `$middlewarePriority` HTTP-ядра вашего приложения. 221 | 222 | Свойство `$middlewarePriority` определено в базовом классе `Illuminate\Foundation\Http\Kernel`. Вы можете скопировать его определение из этого класса и перезаписать его в HTTP-ядре вашего приложения, чтобы изменить приоритет: 223 | 224 | /** 225 | * Список посредников, отсортированный по приоритетности. 226 | * 227 | * Заставит неглобальных посредников всегда быть в заданном порядке. 228 | * 229 | * @var array 230 | */ 231 | protected $middlewarePriority = [ 232 | // ... 233 | \App\Http\Middleware\SetDefaultLocaleForUrls::class, 234 | \Illuminate\Routing\Middleware\SubstituteBindings::class, 235 | // ... 236 | ]; 237 | -------------------------------------------------------------------------------- /docs/verification.md: -------------------------------------------------------------------------------- 1 | # Laravel 9 · Подтверждение адреса электронной почты 2 | 3 | - [Введение](#introduction) 4 | - [Подготовка модели](#model-preparation) 5 | - [Подготовка базы данных](#database-preparation) 6 | - [Маршрутизация](#verification-routing) 7 | - [Уведомление о подтверждении электронной почты](#the-email-verification-notice) 8 | - [Обработчик проверки электронной почты](#the-email-verification-handler) 9 | - [Повторная отправка письма с подтверждением](#resending-the-verification-email) 10 | - [Защита маршрутов](#protecting-routes) 11 | - [Настройка](#customization) 12 | - [События](#events) 13 | 14 | 15 | ## Введение 16 | 17 | Многие веб-приложения требуют от пользователей подтверждения своего адреса электронной почты перед использованием приложения. Вместо того, чтобы заставлять вас самостоятельно реализовывать этот функционал повторно для каждого создаваемого вами приложения, Laravel предлагает удобные встроенные службы для отправки и проверки запросов подтверждения адреса электронной почты. 18 | 19 | > **Примечание**\ 20 | > Хотите быстро начать? Установите один из [стартовых комплектов](starter-kits.md) в новое приложение Laravel. Стартовые комплекты позаботятся о построении всей вашей системы аутентификации, включая поддержку подтверждения электронной почты. 21 | 22 | 23 | ### Подготовка модели 24 | 25 | Убедитесь, что ваша модель `App\Models\User` реализует контракт `Illuminate\Contracts\Auth\MustVerifyEmail`: 26 | 27 | 51 | ### Подготовка базы данных 52 | 53 | Ваша таблица `users` должна содержать столбец `email_verified_at` для сохранения даты и времени подтверждения адреса электронной почты пользователем. По умолчанию миграция таблицы пользователей, содержащаяся в Laravel, уже содержит этот столбец. Просто запустите миграцию базы данных: 54 | 55 | ```shell 56 | php artisan migrate 57 | ``` 58 | 59 | 60 | ## Маршрутизация 61 | 62 | Чтобы правильно реализовать подтверждение электронной почты, необходимо определить три маршрута. Во-первых, потребуется маршрут для отображения уведомления пользователю о том, что он должен щелкнуть ссылку подтверждения электронной почты в письме, которое Laravel отправит ему после регистрации. 63 | 64 | Во-вторых, потребуется маршрут для обработки запросов, сгенерированных, когда пользователь щелкает ссылку подтверждения электронной почты в электронном письме. 65 | 66 | В-третьих, потребуется маршрут для повторной отправки ссылки для подтверждения, если пользователь случайно потеряет первую ссылку для подтверждения. 67 | 68 | 69 | ### Уведомление о подтверждении электронной почты 70 | 71 | Как упоминалось ранее, должен быть определен маршрут, который будет возвращать страницу, указывающую пользователю щелкнуть ссылку для подтверждения электронной почты, которая была отправлена ему Laravel по электронной почте после регистрации. Эта страница будет отображаться для пользователей, когда они попытаются получить доступ к другим частям приложения без предварительной проверки своего адреса электронной почты. Помните, что ссылка автоматически отправляется пользователю по электронной почте, если ваша модель `App\Models\User` реализует интерфейс `MustVerifyEmail`: 72 | 73 | Route::get('/email/verify', function () { 74 | return view('auth.verify-email'); 75 | })->middleware('auth')->name('verification.notice'); 76 | 77 | Маршрут, который возвращает уведомление о подтверждении по электронной почте, должен называться `verification.notice`. Важно, чтобы маршруту было присвоено это точное имя, поскольку посредник `verify`, [включенный в Laravel](#protecting-routes), будет автоматически перенаправлять на это имя маршрута, если пользователь не подтвердил свой адрес электронной почты. 78 | 79 | > **Примечание**\ 80 | > При выполнении проверки электронной почты самостоятельно, вам необходимо определить содержание страницы уведомления о проверке. Если вам необходим каркас, включающий все необходимые страницы для аутентификации и проверки, ознакомьтесь со [стартовыми комплектами приложений Laravel](starter-kits.md). 81 | 82 | 83 | ### Обработчик проверки электронной почты 84 | 85 | Затем, нам нужно определить маршрут, который будет обрабатывать запросы, сгенерированные, когда пользователь щелкает ссылку подтверждения электронной почты, которая была отправлена ему по электронной почте. Этот маршрут должен называться `verification.verify` и ему должны быть назначены посредники `auth` и `signed`: 86 | 87 | use Illuminate\Foundation\Auth\EmailVerificationRequest; 88 | 89 | Route::get('/email/verify/{id}/{hash}', function (EmailVerificationRequest $request) { 90 | $request->fulfill(); 91 | 92 | return redirect('/home'); 93 | })->middleware(['auth', 'signed'])->name('verification.verify'); 94 | 95 | Прежде чем двигаться дальше, давайте подробнее рассмотрим этот маршрут. Во-первых, вы заметите, что мы используем тип запроса `EmailVerificationRequest` вместо типичного экземпляра `Illuminate\Http\Request`. `EmailVerificationRequest` – это [запрос формы](validation.md#form-request-validation), который включен в Laravel. Этот запрос автоматически позаботится о проверке параметров запроса `id` и `hash`. 96 | 97 | Далее, мы можем приступить непосредственно к вызову метода `fulfill` запроса. Этот метод вызовет метод `markEmailAsVerified` для аутентифицированного пользователя и запустит событие `Illuminate\Auth\Events\Verified`. Метод `markEmailAsVerified` доступен для модели по умолчанию `App\Models\User` через базовый класс `Illuminate\Foundation\Auth\User`. После подтверждения адреса электронной почты пользователя вы можете перенаправить его куда пожелаете. 98 | 99 | 100 | ### Повторная отправка письма с подтверждением 101 | 102 | Иногда пользователь может потерять или случайно удалить письмо с подтверждением адреса электронной почты. Чтобы учесть это, вы можете определить маршрут, позволяющий пользователю запрашивать повторную отправку письма с подтверждением. Затем, вы можете сделать запрос по этому маршруту, поместив простую кнопку отправки формы на [странице уведомления о подтверждении](#the-email-verification-notice): 103 | 104 | use Illuminate\Http\Request; 105 | 106 | Route::post('/email/verification-notification', function (Request $request) { 107 | $request->user()->sendEmailVerificationNotification(); 108 | 109 | return back()->with('message', 'Verification link sent!'); 110 | })->middleware(['auth', 'throttle:6,1'])->name('verification.send'); 111 | 112 | 113 | ### Защита маршрутов 114 | 115 | [Посредник маршрута](middleware.md) может использоваться только для того, чтобы разрешить доступ к конкретному маршруту только подтвержденным пользователям. Laravel содержит посредник `verified`, который ссылается на класс `Illuminate\Auth\Middleware\EnsureEmailIsVerified`. Поскольку этот посредник уже зарегистрирован в HTTP-ядре вашего приложения, все, что вам нужно сделать, так это назначить посредник маршруту. Как правило, этот посредник работает в паре с посредником `auth`: 116 | 117 | Route::get('/profile', function () { 118 | // Только подтвержденные пользователи могут получить доступ к этому маршруту ... 119 | })->middleware(['auth', 'verified']); 120 | 121 | Если непроверенный пользователь попытается получить доступ к маршруту, которому назначен этот посредник, то он будет автоматически перенаправлен на [именованный маршрут](routing.md#named-routes) `verification.notice`. 122 | 123 | 124 | ## Настройка 125 | 126 | 127 | #### Настройка подтверждения адреса электронной почты 128 | 129 | Хотя уведомление о подтверждении электронной почты по умолчанию должно удовлетворять требованиям большинства приложений, Laravel позволяет вам изменить сообщение подтверждения электронной почты. 130 | 131 | Для начала, передайте замыкание методу `toMailUsing` уведомления `Illuminate\Auth\Notifications\VerifyEmail`. Замыкание получит экземпляр модели, содержащий уведомление, а также подписанный URL-адрес подтверждения электронной почты, который пользователь должен посетить для проверки адреса электронной почты. Замыкание должно вернуть экземпляр `Illuminate\Notifications\Messages\MailMessage`. Как правило, вызов метода `toMailUsing` осуществляется в методе `boot` поставщика `App\Providers\AuthServiceProvider`: 132 | 133 | use Illuminate\Auth\Notifications\VerifyEmail; 134 | use Illuminate\Notifications\Messages\MailMessage; 135 | 136 | /** 137 | * Регистрация любых служб аутентификации / авторизации. 138 | * 139 | * @return void 140 | */ 141 | public function boot() 142 | { 143 | // ... 144 | 145 | VerifyEmail::toMailUsing(function ($notifiable, $url) { 146 | return (new MailMessage) 147 | ->subject('Verify Email Address') 148 | ->line('Click the button below to verify your email address.') 149 | ->action('Verify Email Address', $url); 150 | }); 151 | } 152 | 153 | > **Примечание**\ 154 | > Чтобы узнать больше о почтовых уведомлениях, обратитесь к [документации по почтовым уведомлениям](notifications.md#mail-notifications). 155 | 156 | 157 | ## События 158 | 159 | При использовании [стартовых комплектов](starter-kits.md) Laravel запускает [события](events.md) в процессе проверки электронной почты. Если вы самостоятельно обрабатываете проверку электронной почты для своего приложения, то вы должны запускать эти события после завершения проверки. Как правило, регистрация слушателей этого события осуществляется в поставщике `App\Providers\EventServiceProvider`: 160 | 161 | use App\Listeners\LogVerifiedUser; 162 | use Illuminate\Auth\Events\Verified; 163 | 164 | /** 165 | * Карта слушателей событий приложения. 166 | * 167 | * @var array 168 | */ 169 | protected $listen = [ 170 | Verified::class => [ 171 | LogVerifiedUser::class, 172 | ], 173 | ]; 174 | -------------------------------------------------------------------------------- /docs/views.md: -------------------------------------------------------------------------------- 1 | # Laravel 9 · HTML-шаблоны 2 | 3 | - [Введение](#introduction) 4 | - [Написание шаблонов в React / Vue](#writing-views-in-react-or-vue) 5 | - [Создание и отрисовка шаблонов](#creating-and-rendering-views) 6 | - [Вложенные каталоги шаблонов](#nested-view-directories) 7 | - [Использование первого доступного шаблона](#creating-the-first-available-view) 8 | - [Определение наличия шаблона](#determining-if-a-view-exists) 9 | - [Передача данных шаблону](#passing-data-to-views) 10 | - [Общедоступные данные для всех шаблонов](#sharing-data-with-all-views) 11 | - [Компоновщики шаблонов](#view-composers) 12 | - [Создатели шаблонов](#view-creators) 13 | - [Оптимизация шаблонов](#optimizing-views) 14 | 15 | 16 | ## Введение 17 | 18 | Конечно, нецелесообразно возвращать целые строки HTML-документов непосредственно из ваших маршрутов и контроллеров. К счастью, шаблоны предоставляют удобный способ разместить весь наш HTML в отдельных файлах. 19 | 20 | Шаблоны отделяют логику контроллера / приложения от логики представления и хранятся в каталоге `resources/views`. При использовании Laravel шаблоны представлений обычно создаются с использованием [языка шаблонов Blade](blade.md). Простой шаблон может выглядеть примерно так: 21 | 22 | ```blade 23 | 24 | 25 | 26 | 27 |

Привет, {{ $name }}

28 | 29 | 30 | ``` 31 | 32 | Поскольку этот шаблон сохранен в `resources/views/greeting.blade.php`, мы можем вернуть его, используя глобальный помощник `view`, например: 33 | 34 | Route::get('/', function () { 35 | return view('greeting', ['name' => 'James']); 36 | }); 37 | 38 | > **Примечание**\ 39 | > Ищете дополнительную информацию о том, как писать шаблоны Blade? Ознакомьтесь с полной [документацией по Blade](blade.md), чтобы начать работу. 40 | 41 | 42 | ### Написание шаблонов в React / Vue 43 | 44 | Вместо того, чтобы писать свои шаблоны внешнего интерфейса на PHP с использованием Blade, многие разработчики стали предпочитать написание шаблонов с помощью React или Vue. Laravel делает это безболезненным благодаря [Inertia](https://inertiajs.com/), библиотеке, которая позволяет легко связать ваш интерфейс React / Vue с вашим бэкэндом Laravel без типичных сложностей при создании SPA. 45 | 46 | Наши [стартовые комплекты](starter-kits.md) Breeze и Jetstream станут отличной отправной точкой для вашего следующего приложения Laravel на базе Inertia. Кроме того, [Laravel Bootcamp](https://bootcamp.laravel.com) предлагает полную демонстрацию создания приложения Laravel на базе Inertia, включая примеры на Vue и React. 47 | 48 | 49 | ## Создание и отрисовка шаблонов 50 | 51 | Вы можете создать шаблон, поместив файл с расширением `.blade.php` в каталог `resources/views` вашего приложения. Расширение `.blade.php` сообщает фреймворку, что файл содержит [шаблон Blade](blade.md). Шаблоны Blade содержат HTML, а также директивы Blade, которые позволяют легко выводить значения, создавать операторы «если», выполнять итерацию данных и многое другое. 52 | 53 | После того, как вы создали шаблон, вы можете вернуть его из маршрута или контроллера вашего приложения, используя глобальный помощник `view`: 54 | 55 | Route::get('/', function () { 56 | return view('greeting', ['name' => 'James']); 57 | }); 58 | 59 | Шаблон также могут быть возвращены с помощью фасада `View`: 60 | 61 | use Illuminate\Support\Facades\View; 62 | 63 | return View::make('greeting', ['name' => 'James']); 64 | 65 | Как видно, первый аргумент, переданный помощнику `view`, соответствует имени файла шаблона в каталоге `resources/views`. Второй аргумент – это массив данных, которые должны быть доступны в шаблоне. В этом случае, мы передаем переменную `name`, которая будет выведена в шаблоне с использованием [синтаксиса Blade](blade.md). 66 | 67 | 68 | ### Вложенные каталоги шаблонов 69 | 70 | Шаблоны также могут быть вложены в подкаталоги каталога `resources/views`. «Точечная нотация» используется для указания вложенности шаблона. Например, если ваш шаблон хранится в `resources/views/admin/profile.blade.php`, то вы можете вернуть его из маршрута / контроллера вашего приложения следующим образом: 71 | 72 | return view('admin.profile', $data); 73 | 74 | > **Предупреждение**\ 75 | > Имена каталогов шаблонов не должны содержать символа `.`. 76 | 77 | 78 | ### Использование первого доступного шаблона 79 | 80 | Используя метод `first` фасада `View`, вы можете отобразить первый шаблон, который существует в переданном массиве шаблонов. Это может быть полезно, если ваше приложение или пакет позволяют настраивать или перезаписывать шаблоны: 81 | 82 | use Illuminate\Support\Facades\View; 83 | 84 | return View::first(['custom.admin', 'admin'], $data); 85 | 86 | 87 | ### Определение наличия шаблона 88 | 89 | Если вам нужно определить, существует ли шаблон, вы можете использовать фасад `View`. Метод `exists` вернет `true`, если он существует: 90 | 91 | use Illuminate\Support\Facades\View; 92 | 93 | if (View::exists('emails.customer')) { 94 | // 95 | } 96 | 97 | 98 | ## Передача данных шаблону 99 | 100 | Как вы видели в предыдущих примерах, вы можете передать массив данных шаблонам, чтобы сделать эти данные доступными для них: 101 | 102 | return view('greetings', ['name' => 'Victoria']); 103 | 104 | При передаче информации таким образом данные должны быть массивом с парами ключ / значение. После предоставления данных в шаблон вы можете получить доступ к каждому значению, используя ключи данных, схожее с ``. 105 | 106 | В качестве альтернативы передаче полного массива данных вспомогательной функции `view` вы можете использовать метод `with` для добавления некоторых данных в шаблон. Метод `with` возвращает экземпляр объекта представления, так что вы можете продолжить связывание методов перед возвратом шаблона: 107 | 108 | return view('greeting') 109 | ->with('name', 'Victoria') 110 | ->with('occupation', 'Astronaut'); 111 | 112 | 113 | ### Общедоступные данные для всех шаблонов 114 | 115 | Иногда требуется сделать данные общедоступными для всех шаблонов, отображаемыми вашим приложением. Вы можете сделать это, используя метод `share` фасада `View`. Как правило, вызов метода `share` осуществляется в методе `boot` поставщика `App\Providers\AppServiceProvider` или вы можете создать отдельного поставщика для их размещения: 116 | 117 | 147 | ## Компоновщики шаблонов 148 | 149 | Компоновщики шаблонов – это замыкания или методы класса, которые вызываются при отрисовки шаблонов. Если у вас есть данные, которые вы хотите привязать к шаблону каждый раз при его отрисовки, компоновщик шаблонов поможет вам организовать эту логику в одном месте. Компоновщики шаблонов особенно полезны, если один и тот же шаблон возвращается несколькими маршрутами или контроллерами в вашем приложении и всегда требует определенного фрагмента данных. 150 | 151 | Как правило, компоновщики шаблонов регистрируются в одном из [поставщиков служб](provider.md) вашего приложения. В этом примере мы предположим, что мы создали новый `App\Providers\ViewServiceProvider` для размещения этой логики. 152 | 153 | Мы будем использовать метод `composer` фасада `View`, чтобы зарегистрировать компоновщик. Laravel по умолчанию не содержит каталог для классов компоновщиков, поэтому вы можете организовать их, как хотите. Например, вы можете создать каталог `app/View/Composers` для размещения всех компоновщиков вашего приложения: 154 | 155 | **Предупреждение**\ 193 | > Помните, что если вы создаете нового поставщика служб, который будет содержать регистрации вашего компоновщика, то вам нужно будет добавить поставщика служб в массив `providers` в конфигурационном файле `config/app.php`. 194 | 195 | Теперь, когда мы зарегистрировали компоновщик, метод `compose` класса `App\View\Composers\ProfileComposer` будет выполняться каждый раз, когда отрисовывается шаблон профиля. Давайте посмотрим на пример класса компоновщика: 196 | 197 | users = $users; 222 | } 223 | 224 | /** 225 | * Привязать данные к шаблону. 226 | * 227 | * @param \Illuminate\View\View $view 228 | * @return void 229 | */ 230 | public function compose(View $view) 231 | { 232 | $view->with('count', $this->users->count()); 233 | } 234 | } 235 | 236 | Как видите, все компоновщики внедряются через [контейнер служб](container.md), поэтому вы можете указать любые зависимости, которые вам нужны, в конструкторе компоновщика. 237 | 238 | 239 | #### Связывание компоновщика с несколькими шаблонами 240 | 241 | Вы можете связать компоновщика с несколькими шаблонами одновременно, передав массив шаблонов в качестве первого аргумента методу `composer`: 242 | 243 | use App\View\Composers\MultiComposer; 244 | 245 | View::composer( 246 | ['profile', 'dashboard'], 247 | MultiComposer::class 248 | ); 249 | 250 | Допускается использование метасимвола подстановки `*`, что позволит вам прикрепить компоновщик ко всем шаблонам: 251 | 252 | View::composer('*', function ($view) { 253 | // 254 | }); 255 | 256 | 257 | ### Создатели шаблонов 258 | 259 | «Создатели» шаблонов очень похожи на компоновщиков; но, они выполняются сразу после создания экземпляра, а не ожидают отрисовки шаблона. Чтобы зарегистрировать создателя шаблона, используйте метод `creator`: 260 | 261 | use App\View\Creators\ProfileCreator; 262 | use Illuminate\Support\Facades\View; 263 | 264 | View::creator('profile', ProfileCreator::class); 265 | 266 | 267 | ## Оптимизация шаблонов 268 | 269 | По умолчанию шаблоны Blade компилируются по требованию. Когда выполняется запрос, который отрисовывает шаблон, Laravel определит, существует ли скомпилированная версия шаблона. Если файл существует, Laravel далее определит, был ли исходный шаблон изменен позднее скомпилированного. Если скомпилированного шаблона либо не существует, либо исходный шаблон был изменен, Laravel перекомпилирует шаблон. 270 | 271 | Компиляция шаблонов во время запроса отрицательно влияет на производительность, поэтому Laravel содержит команду Artisan `view:cache` для предварительной компиляции всех шаблонов, используемых вашим приложением. Для повышения производительности вы можете выполнить эту команду как часть процесса развертывания: 272 | 273 | ```shell 274 | php artisan view:cache 275 | ``` 276 | 277 | Вы можете использовать команду `view:clear` для очистки кеша шаблонов: 278 | 279 | ```shell 280 | php artisan view:clear 281 | ``` 282 | --------------------------------------------------------------------------------