diff --git a/docs/artisan.md b/docs/artisan.md index e6be7e3..0934423 100644 --- a/docs/artisan.md +++ b/docs/artisan.md @@ -142,16 +142,6 @@ php artisan make:command SendEmails */ protected $description = 'Send a marketing email to a user'; - /** - * Создать новый экземпляр команды. - * - * @return void - */ - public function __construct() - { - parent::__construct(); - } - /** * Выполнить консольную команду. * diff --git a/docs/authorization.md b/docs/authorization.md index 69404f6..ee83d0d 100644 --- a/docs/authorization.md +++ b/docs/authorization.md @@ -30,7 +30,7 @@ Laravel предлагает два основных способа авторизации действий: [шлюзы](#gates) и [политики](#creating-policies). Шлюзы обеспечивают простой подход к авторизации, основанный на замыкании, в то время как политики, группируют логику вокруг конкретной модели или ресурса. В этой документации мы сначала рассмотрим шлюзы, а затем рассмотрим политики. -Вам не нужно выбирать между использованием исключительно шлюзов или исключительно политик при создании приложения. Большинство приложений, скорее всего, будут содержать смесь шлюзов и политик, и это нормально! Шлюзы наиболее применимы к действиям, не связанным с какой-либо моделью или ресурсом, например, просмотр панели администратора. Напротив, политики следует использовать, когда вы хотите разрешить действие для конкретной модели или ресурса. +Вам не нужно выбирать между использованием исключительно шлюзов или исключительно политик при создании приложения. Большинство приложений, скорее всего, будут содержать смесь шлюзов и политик, и это нормально! Шлюзы наиболее применимы к действиям, не связанным с какой-либо моделью или ресурсом, например к просмотру панели администратора. Напротив, политики следует использовать, когда вы хотите разрешить действие для конкретной модели или ресурса. ## Шлюзы @@ -226,7 +226,7 @@ Laravel предлагает два основных способа автори Вы можете определить авторизован ли текущий аутентифицированный пользователь для выполнения конкретного действия без написания специального шлюза, соответствующего этому действию. Laravel позволяет вам выполнять такие типы «упрощенных» проверок авторизации с помощью методов `Gate::allowIf` и `Gate::denyIf`: ```php -use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Gate; Gate::allowIf(fn ($user) => $user->isAdministrator()); diff --git a/docs/billing.md b/docs/billing.md index afba119..1434636 100644 --- a/docs/billing.md +++ b/docs/billing.md @@ -1571,7 +1571,7 @@ Similary, if the customer has multiple subscriptions, you can also retrieve the $invoice = $user->subscription('default')->upcomingInvoice(); -### Previewing Subscription Invoice +### Previewing Subscription Invoices Using the `previewInvoice` method, you can preview an invoice before making price changes. This will allow you to determine what your customer's invoice will look like when a given price change is made: diff --git a/docs/blade.md b/docs/blade.md index a9e6939..e5873c5 100644 --- a/docs/blade.md +++ b/docs/blade.md @@ -44,7 +44,7 @@ Blade – это простой, но мощный движок шаблонов, входящий в состав Laravel. В отличие от некоторых шаблонизаторов PHP, Blade не ограничивает вас в использовании простого кода PHP в ваших шаблонах. На самом деле, все шаблоны Blade компилируются в простой код PHP и кешируются до тех пор, пока не будут изменены, что означает, что Blade добавляет фактически нулевую нагрузку вашему приложению. Файлы шаблонов Blade используют расширение файла `.blade.php` и обычно хранятся в каталоге `resources/views`. -Шаблоны Blade могут быть возвращены из маршрутов или контроллера с помощью глобального помощника `view`. Конечно, как упоминалось в документации по [HTML-шаблонам](views.md), данные могут быть переданы в шаблоны Blade, используя второй аргумент помощника `view`: +Шаблоны Blade могут быть возвращены из маршрутов или контроллеров с помощью глобального помощника `view`. Конечно, как упоминалось в документации по [HTML-шаблонам](views.md), данные могут быть переданы в шаблоны Blade, используя второй аргумент помощника `view`: Route::get('/', function () { return view('greeting', ['name' => 'Finn']); @@ -399,18 +399,18 @@ Hello, @{{ name }}. Переменная `$loop` также содержит множество других полезных свойств: -Свойство | Описание -------------- | ------------- -`$loop->index` | Индекс текущей итерации цикла (начинается с 0). -`$loop->iteration` | Текущая итерация цикла (начинается с 1). -`$loop->remaining` | Итерации, оставшиеся в цикле. -`$loop->count` | Общее количество элементов в итерируемом массиве. -`$loop->first` | Первая ли это итерация цикла. -`$loop->last` | Последняя ли это итерация цикла. -`$loop->even` | Четная ли это итерация цикла. -`$loop->odd` | Нечетная ли это итерация цикла. -`$loop->depth` | Уровень вложенности текущего цикла. -`$loop->parent` | Переменная родительского цикла во вложенном цикле. +| Свойство | Описание | +|--------------------|--------------------------------------------------------| +| `$loop->index` | Индекс текущей итерации цикла (начинается с 0). | +| `$loop->iteration` | Текущая итерация цикла (начинается с 1). | +| `$loop->remaining` | Итерации, оставшиеся в цикле. | +| `$loop->count` | Общее количество элементов в итерируемом массиве. | +| `$loop->first` | Первая ли это итерация цикла. | +| `$loop->last` | Последняя ли это итерация цикла. | +| `$loop->even` | Четная ли это итерация цикла. | +| `$loop->odd` | Нечетная ли это итерация цикла. | +| `$loop->depth` | Уровень вложенности текущего цикла. | +| `$loop->parent` | Переменная родительского цикла во вложенном цикле. | ### Условные классы diff --git a/docs/broadcasting.md b/docs/broadcasting.md index 0616e58..f85b780 100644 --- a/docs/broadcasting.md +++ b/docs/broadcasting.md @@ -882,7 +882,7 @@ Echo.join(`chat.${roomId}`) Однако, если вы не используете эти события для каких-либо других целей в своем приложении, создание классов событий с единственной целью их дальнейшей трансляции может оказаться обременительным. Чтобы исправить это, Laravel позволяет вам указать, что модель Eloquent должна автоматически транслировать изменения своего состояния. -Для начала ваша модель Eloquent должна использовать трейт `Illuminate\Database\Eloquent\BroadcastsEvents`. Кроме того, модель должна определять метод `broadcastsOn`, который будет возвращать массив каналов, по которым должны транслироваться события модели: +Для начала ваша модель Eloquent должна использовать трейт `Illuminate\Database\Eloquent\BroadcastsEvents`. Кроме того, модель должна определять метод `broadcastOn`, который будет возвращать массив каналов, по которым должны транслироваться события модели: ```php ## Какую ветку выбрать при запросах слияния? -**Все** исправления ошибок следует отправлять в последнюю стабильную ветку. Исправления ошибок **никогда** не следует отправлять в ветку `master`, если они не исправляют функционал, которой присутствует только в следующем релизе. +**Все** исправления ошибок следует отправлять в последнюю версию, которая поддерживает исправления ошибок (в настоящее время `8.x`). Исправления ошибок **никогда** не следует отправлять в ветку `master`, если они не исправляют функционал, которой присутствует только в следующем релизе. -**Минорный** функционал, **полностью обратно совместимый** с текущим релизом, может быть отправлен в последнюю стабильную ветку. +**Минорный** функционал, **полностью обратно совместимый** с текущим релизом, может быть отправлен в последнюю стабильную ветку (в настоящее время `9.x`). -**Мажорный** новый функционал всегда следует отправлять в ветку `master`, содержащую предстоящий релиз. - -Если вы не уверены, квалифицируется ли ваш функционал как мажорный или минорный, то спросите Тейлора Отвелла на канале `#internals` сервера [Laravel Discord](https://discord.gg/laravel). +**Мажорные** новые функции или функции с критическими изменениями всегда следует отправлять в ветку `master`, содержащую предстоящий выпуск. ## Скомпилированные ресурсы исходников diff --git a/docs/database.md b/docs/database.md index 1e04bfe..bd80c39 100644 --- a/docs/database.md +++ b/docs/database.md @@ -16,6 +16,7 @@ +- MariaDB 10.2+ ([Политика версий](https://mariadb.org/about/#maintenance-policy)) - MySQL 5.7+ ([Политика версий](https://en.wikipedia.org/wiki/MySQL#Release_history)) - PostgreSQL 9.6+ ([Политика версий](https://www.postgresql.org/support/versioning/)) - SQLite 3.8.8+ diff --git a/docs/deployment.md b/docs/deployment.md index a057686..c727b92 100644 --- a/docs/deployment.md +++ b/docs/deployment.md @@ -27,6 +27,7 @@ - PHP >= 8.0 - Расширение PHP BCMath - Расширение PHP Ctype +- Расширение PHP cURL - Расширение PHP DOM - Расширение PHP Fileinfo - Расширение PHP JSON diff --git a/docs/eloquent-mutators.md b/docs/eloquent-mutators.md index 317f8af..a86ef58 100644 --- a/docs/eloquent-mutators.md +++ b/docs/eloquent-mutators.md @@ -48,7 +48,7 @@ */ protected function firstName(): Attribute { - return new Attribute( + return Attribute::make( get: fn ($value) => ucfirst($value), ); } @@ -82,7 +82,7 @@ use Illuminate\Database\Eloquent\Casts\Attribute; */ public function address(): Attribute { - return new Attribute( + return Attribute::make( get: fn ($value, $attributes) => new Address( $attributes['address_line_one'], $attributes['address_line_two'], @@ -112,12 +112,12 @@ public function address(): Attribute */ public function address(): Attribute { - return (new Attribute( + return Attribute::make( get: fn ($value, $attributes) => new Address( $attributes['address_line_one'], $attributes['address_line_two'], ), - ))->withoutObjectCaching(); + )->withoutObjectCaching(); } ``` @@ -143,7 +143,7 @@ public function address(): Attribute */ protected function firstName(): Attribute { - return new Attribute( + return Attribute::make( get: fn ($value) => ucfirst($value), set: fn ($value) => strtolower($value), ); @@ -176,7 +176,7 @@ use Illuminate\Database\Eloquent\Casts\Attribute; */ protected function address(): Attribute { - return new Attribute( + return Attribute::make( get: fn ($value, $attributes) => new Address( $attributes['address_line_one'], $attributes['address_line_two'], @@ -440,6 +440,11 @@ Eloquent также позволяет вам преобразовывать з Поскольку окончательная длина зашифрованного текста непредсказуема и больше, чем его копия в виде простого текста, убедитесь, что соответствующий столбец в базе данных имеет тип `TEXT` или больше. Кроме того, поскольку значения будут зашифрованы в базе данных, вы не сможете выполнять запросы или искать зашифрованные значения атрибутов. + +#### Смена ключа приложения + +Laravel шифрует строки, используя значение конфигурации `key`, указанное в конфигурационном файле `app` вашего приложения. Как правило, это значение соответствует значению переменной окружения `APP_KEY`. Если вам нужно сменить ключ шифрования вашего приложения, то вам нужно будет вручную повторно зашифровать ваши зашифрованные атрибуты с помощью нового ключа. + ### Типизация во время запроса diff --git a/docs/eloquent.md b/docs/eloquent.md index 1d54bb3..74c8820 100644 --- a/docs/eloquent.md +++ b/docs/eloquent.md @@ -762,6 +762,8 @@ Eloquent содержит методы `isDirty`, `isClean` и `wasChanged` дл ['departure' => 'Chicago', 'destination' => 'New York', 'price' => 150] ], ['departure', 'destination'], ['price']); +> {note} Все базы данных, кроме SQL Server, требуют, чтобы столбцы во втором аргументе метода `upsert` имели «первичный» или «уникальный» индекс. Вдобавок, драйвер базы данных MySQL игнорирует второй аргумент метода `upsert` и всегда использует «первичный» и «уникальный» индексы таблицы для обнаружения существующих записей. + ## Удаление моделей diff --git a/docs/filesystem.md b/docs/filesystem.md index ec3db09..f703fef 100644 --- a/docs/filesystem.md +++ b/docs/filesystem.md @@ -13,6 +13,9 @@ - [URL-адреса файлов](#file-urls) - [Метаданные файла](#file-metadata) - [Хранение файлов](#storing-files) + - [Добавление информации к файлам](#prepending-appending-to-files) + - [Копирование и перемещение файлов](#copying-moving-files) + - [Автоматическая потоковая передача](#automatic-streaming) - [Загрузка файлов](#file-uploads) - [Видимость файла](#file-visibility) - [Удаление файлов](#deleting-files) @@ -129,9 +132,13 @@ composer require league/flysystem-sftp-v3 "^3.0" 'password' => env('SFTP_PASSWORD'), // Optional SFTP Settings... + // 'hostFingerprint' => env('SFTP_HOST_FINGERPRINT'), + // 'maxTries' => 4, + // 'passphrase' => env('SFTP_PASSPHRASE'), // 'port' => env('SFTP_PORT', 22), // 'root' => env('SFTP_ROOT', ''), // 'timeout' => 30, + // 'useAgent' => true, ], @@ -309,28 +316,25 @@ $disk->put('image.jpg', $content); Storage::put('file.jpg', $resource); - -#### Автоматическая потоковая передача - -Потоковая передача файлов в хранилище позволяет значительно сократить использование памяти. Если вы хотите, чтобы Laravel автоматически управлял потоковой передачей переданного файла в ваше хранилище, вы можете использовать методы `putFile` или `putFileAs`. Эти методы принимают экземпляр `Illuminate\Http\File` или `Illuminate\Http\UploadedFile` и автоматически передают файл в нужное место: - - use Illuminate\Http\File; - use Illuminate\Support\Facades\Storage; + +#### Неудавшиеся операции записи - // Автоматически генерировать уникальный идентификатор для имени файла ... - $path = Storage::putFile('photos', new File('/path/to/photo')); +Если метод `put` (или другие операции «записи») не может записать файл на диск, то будет возвращено `false`: - // Явно указать имя файла ... - $path = Storage::putFileAs('photos', new File('/path/to/photo'), 'photo.jpg'); + if (! Storage::put('file.jpg', $contents)) { + // Не удалось записать файл на диск... + } -Следует отметить несколько важных моментов, касающихся метода `putFile`. Обратите внимание, что мы указали только имя каталога, а не имя файла. По умолчанию метод `putFile` генерирует уникальный идентификатор, который будет служить именем файла. Расширение файла будет определено путем проверки MIME-типа файла. Путь к файлу будет возвращен методом `putFile`, так что вы можете сохранить путь, включая сгенерированное имя файла, в вашей базе данных. +Если хотите, то вы можете определить параметр `throw` в конфигурационном массиве файловой системы вашего диска. Когда этот параметр определен как `true`, то методы «записи», такие как `put`, будут генерировать экземпляр `League\Flysystem\UnableToWriteFile` при неудавшихся операциях записи: -Методы `putFile` и `putFileAs` также принимают аргумент для определения «видимости» сохраненного файла. Это особенно полезно, если вы храните файл на облачном диске, таком как Amazon S3, и хотите, чтобы файл был общедоступным через сгенерированные URL: - - Storage::putFile('photos', new File('/path/to/photo'), 'public'); + 'public' => [ + 'driver' => 'local', + // ... + 'throw' => true, + ], -#### Добавление информации к файлам +### Добавление информации к файлам Методы `prepend` и `append` позволяют записывать в начало или конец файла, соответственно: @@ -339,7 +343,7 @@ $disk->put('image.jpg', $content); Storage::append('file.log', 'Appended Text'); -#### Копирование и перемещение файлов +### Копирование и перемещение файлов Метод `copy` используется для копирования существующего файла в новое место на диске, а метод `move` используется для переименования или перемещения существующего файла в новое место: @@ -347,6 +351,26 @@ $disk->put('image.jpg', $content); Storage::move('old/file.jpg', 'new/file.jpg'); + +### Автоматическая потоковая передача + +Потоковая передача файлов в хранилище позволяет значительно сократить использование памяти. Если вы хотите, чтобы Laravel автоматически управлял потоковой передачей переданного файла в ваше хранилище, вы можете использовать методы `putFile` или `putFileAs`. Эти методы принимают экземпляр `Illuminate\Http\File` или `Illuminate\Http\UploadedFile` и автоматически передают файл в нужное место: + + use Illuminate\Http\File; + use Illuminate\Support\Facades\Storage; + + // Автоматически генерировать уникальный идентификатор для имени файла ... + $path = Storage::putFile('photos', new File('/path/to/photo')); + + // Явно указать имя файла ... + $path = Storage::putFileAs('photos', new File('/path/to/photo'), 'photo.jpg'); + +Следует отметить несколько важных моментов, касающихся метода `putFile`. Обратите внимание, что мы указали только имя каталога, а не имя файла. По умолчанию метод `putFile` генерирует уникальный идентификатор, который будет служить именем файла. Расширение файла будет определено путем проверки MIME-типа файла. Путь к файлу будет возвращен методом `putFile`, так что вы можете сохранить путь, включая сгенерированное имя файла, в вашей базе данных. + +Методы `putFile` и `putFileAs` также принимают аргумент для определения «видимости» сохраненного файла. Это особенно полезно, если вы храните файл на облачном диске, таком как Amazon S3, и хотите, чтобы файл был общедоступным через сгенерированные URL: + + Storage::putFile('photos', new File('/path/to/photo'), 'public'); + ### Загрузка файлов @@ -396,7 +420,7 @@ $disk->put('image.jpg', $content); 'avatars', $request->file('avatar'), $request->user()->id ); -> {note} Непечатаемые и недопустимые символы Unicode будут автоматически удалены из путей к файлам. По этой причине, вы _по желанию_ можете очистить пути к файлам перед их передачей в методы хранения файлов Laravel. Пути к файлам нормализуются с помощью метода `League\Flysystem\Util::normalizePath`. +> {note} Непечатаемые и недопустимые символы Unicode будут автоматически удалены из путей к файлам. По этой причине, вы _по желанию_ можете очистить пути к файлам перед их передачей в методы хранения файлов Laravel. Пути к файлам нормализуются с помощью метода `League\Flysystem\WhitespacePathNormalizer::normalizePath`. #### Указание диска diff --git a/docs/fortify.md b/docs/fortify.md index 6dbb738..e9ca476 100644 --- a/docs/fortify.md +++ b/docs/fortify.md @@ -80,9 +80,9 @@ composer require laravel/fortify php artisan vendor:publish --provider="Laravel\Fortify\FortifyServiceProvider" ``` -Эта команда опубликует действия Fortify в вашем каталоге `app/Actions`, который будет создан, если он не существует. Кроме того, будет опубликован конфигурационный файл и миграции. +Эта команда опубликует действия Fortify в вашем каталоге `app/Actions`, который будет создан, если он не существует. Кроме того, будут опубликованы `FortifyServiceProvider`, файл конфигурации и все необходимые миграции базы данных. -Затем, вы должны применить миграции вашей базу данных: +Затем, вы должны применить миграции к вашей базе данных: ```shell php artisan migrate diff --git a/docs/helpers.md b/docs/helpers.md index f5856a1..ffb5019 100644 --- a/docs/helpers.md +++ b/docs/helpers.md @@ -43,6 +43,7 @@ Laravel содержит множество глобальных «вспомо - [Arr::hasAny](#method-array-hasany) - [Arr::isAssoc](#method-array-isassoc) - [Arr::isList](#method-array-islist) +- [Arr::keyBy](#method-array-keyby) - [Arr::last](#method-array-last) - [Arr::only](#method-array-only) - [Arr::pluck](#method-array-pluck) @@ -75,6 +76,7 @@ Laravel содержит множество глобальных «вспомо - [base_path](#method-base-path) - [config_path](#method-config-path) - [database_path](#method-database-path) +- [lang_path](#method-lang-path) - [mix](#method-mix) - [public_path](#method-public-path) - [resource_path](#method-resource-path) @@ -97,6 +99,7 @@ Laravel содержит множество глобальных «вспомо - [Str::before](#method-str-before) - [Str::beforeLast](#method-str-before-last) - [Str::between](#method-str-between) +- [Str::betweenFirst](#method-str-between-first) - [Str::camel](#method-camel-case) - [Str::contains](#method-str-contains) - [Str::containsAll](#method-str-contains-all) @@ -108,6 +111,7 @@ Laravel содержит множество глобальных «вспомо - [Str::isAscii](#method-str-is-ascii) - [Str::isUuid](#method-str-is-uuid) - [Str::kebab](#method-kebab-case) +- [Str::lcfirst](#method-str-lcfirst) - [Str::length](#method-str-length) - [Str::limit](#method-str-limit) - [Str::lower](#method-str-lower) @@ -162,6 +166,7 @@ Laravel содержит множество глобальных «вспомо - [before](#method-fluent-str-before) - [beforeLast](#method-fluent-str-before-last) - [between](#method-fluent-str-between) +- [betweenFirst](#method-fluent-str-between-first) - [camel](#method-fluent-str-camel) - [contains](#method-fluent-str-contains) - [containsAll](#method-fluent-str-contains-all) @@ -177,6 +182,7 @@ Laravel содержит множество глобальных «вспомо - [isNotEmpty](#method-fluent-str-is-not-empty) - [isUuid](#method-fluent-str-is-uuid) - [kebab](#method-fluent-str-kebab) +- [lcfirst](#method-fluent-str-lcfirst) - [length](#method-fluent-str-length) - [limit](#method-fluent-str-limit) - [lower](#method-fluent-str-lower) @@ -596,6 +602,27 @@ Laravel содержит множество глобальных «вспомо // false + +#### `Arr::keyBy()` + +Метод `Arr::keyBy` группирует массив по значениям переданного ключа. Если несколько элементов имеют один и тот же ключ, в новом массиве появится только последний: + + use Illuminate\Support\Arr; + + $array = [ + ['product_id' => 'prod-100', 'name' => 'Desk'], + ['product_id' => 'prod-200', 'name' => 'Chair'], + ]; + + $keyed = Arr::keyBy($array, 'product_id'); + + /* + [ + 'prod-100' => ['product_id' => 'prod-100', 'name' => 'Desk'], + 'prod-200' => ['product_id' => 'prod-200', 'name' => 'Chair'], + ] + */ + #### `Arr::last()` @@ -1068,6 +1095,15 @@ Laravel содержит множество глобальных «вспомо $path = database_path('factories/UserFactory.php'); + +#### `lang_path()` + +Функция `lang_path` возвращает полный путь к каталогу `lang` вашего приложения. Вы также можете использовать функцию `lang_path` для создания полного пути к конкретному файлу в каталоге: + + $path = lang_path(); + + $path = lang_path('en/messages.php'); + #### `mix()` @@ -1211,6 +1247,17 @@ Laravel содержит множество глобальных «вспомо // ' is my ' + +#### `Str::betweenFirst()` + +Метод `Str::betweenFirst` возвращает наименьшую возможную часть строки между двумя значениями: + + use Illuminate\Support\Str; + + $slice = Str::betweenFirst('[a] bc [d]', '[', ']'); + + // 'a' + #### `Str::camel()` @@ -1388,6 +1435,17 @@ Laravel содержит множество глобальных «вспомо // foo-bar + +#### `Str::lcfirst()` + +Метод `Str::lcfirst` возвращает переданную строку с первым символом в нижнем регистре: + + use Illuminate\Support\Str; + + $string = Str::lcfirst('Foo Bar'); + + // foo Bar + #### `Str::length()` @@ -1995,6 +2053,17 @@ Str::wordCount('Hello, world!'); // 2 // ' is my ' + +#### `betweenFirst` + +Метод `betweenFirst` возвращает наименьшую возможную часть строки между двумя значениями: + + use Illuminate\Support\Str; + + $converted = Str::of('[a] bc [d]')->betweenFirst('[', ']'); + + // 'a' + #### `camel` @@ -2228,6 +2297,17 @@ Str::wordCount('Hello, world!'); // 2 // foo-bar + +#### `lcfirst()` + +Метод `lcfirst` возвращает переданную строку с первым символом в нижнем регистре: + + use Illuminate\Support\Str; + + $string = Str::of('Foo Bar')->lcfirst(); + + // foo Bar + #### `length` diff --git a/docs/homestead.md b/docs/homestead.md index 7913811..c35ed39 100644 --- a/docs/homestead.md +++ b/docs/homestead.md @@ -56,6 +56,7 @@ Homestead работает в любой системе: Windows, macOS или L --> + - Ubuntu 20.04 - Git - PHP 8.1 @@ -82,6 +83,7 @@ Homestead работает в любой системе: Windows, macOS или L - Xdebug - XHProf / Tideways / XHGui - wp-cli + @@ -96,6 +98,7 @@ Homestead работает в любой системе: Windows, macOS или L --> + - Apache - Blackfire - Cassandra @@ -125,6 +128,7 @@ Homestead работает в любой системе: Windows, macOS или L - TimescaleDB - Trader (расширение PHP) - Утилиты Webdriver и Laravel Dusk + diff --git a/docs/http-tests.md b/docs/http-tests.md index 7865019..4783f26 100644 --- a/docs/http-tests.md +++ b/docs/http-tests.md @@ -954,7 +954,7 @@ Laravel также позволяет отображать шаблоны без #### assertRedirectToSignedRoute -Утверждение о том, что ответ является перенаправлением на указанный подписанный маршрут: +Утверждение о том, что ответ является перенаправлением на указанный [подписанный маршрут](urls.md#signed-urls): $response->assertRedirectToSignedRoute($name = null, $parameters = []); diff --git a/docs/installation.md b/docs/installation.md index 810bf2c..3c2fb9d 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -65,7 +65,7 @@ Laravel Sail – это легкий интерфейс командной ст curl -s https://laravel.build/example-app | bash ``` -Конечно, вы можете изменить `example-app` в этом URL на что угодно. Каталог приложения Laravel будет создан в каталоге, из которого вы выполняете команду. +Конечно, вы можете изменить `example-app` в этом URL на что угодно – просто убедитесь, что имя приложения содержит только буквенно-цифровые символы, дефисы и символы подчеркивания. Каталог приложения Laravel будет создан в каталоге, из которого вы выполняете команду. После создания проекта вы можете перейти в каталог приложения и запустить Laravel Sail. Laravel Sail предлагает простой интерфейс командной строки для взаимодействия с конфигурацией Docker по умолчанию в Laravel: @@ -94,7 +94,7 @@ cd example-app curl -s https://laravel.build/example-app | bash ``` -Конечно, вы можете изменить `example-app` в этом URL на что угодно. Каталог приложения Laravel будет создан в каталоге, из которого вы выполняете команду. +Конечно, вы можете изменить `example-app` в этом URL на что угодно – просто убедитесь, что имя приложения содержит только буквенно-цифровые символы, дефисы и символы подчеркивания. Каталог приложения Laravel будет создан в каталоге, из которого вы выполняете команду. После создания проекта вы можете перейти в каталог приложения и запустить Laravel Sail. Laravel Sail предлагает простой интерфейс командной строки для взаимодействия с конфигурацией Docker по умолчанию в Laravel: @@ -125,7 +125,7 @@ cd example-app curl -s https://laravel.build/example-app | bash ``` -Конечно, вы можете изменить `example-app` в этом URL на что угодно. Каталог приложения Laravel будет создан в каталоге, из которого вы выполняете команду. +Конечно, вы можете изменить `example-app` в этом URL на что угодно – просто убедитесь, что имя приложения содержит только буквенно-цифровые символы, дефисы и символы подчеркивания. Каталог приложения Laravel будет создан в каталоге, из которого вы выполняете команду. После создания проекта вы можете перейти в каталог приложения и запустить Laravel Sail. Laravel Sail предлагает простой интерфейс командной строки для взаимодействия с конфигурацией Docker по умолчанию в Laravel: diff --git a/docs/middleware.md b/docs/middleware.md index 0fa27b6..c501455 100644 --- a/docs/middleware.md +++ b/docs/middleware.md @@ -237,7 +237,7 @@ php artisan make:middleware EnsureTokenIsValid \Illuminate\Contracts\Auth\Middleware\AuthenticatesRequests::class, \Illuminate\Routing\Middleware\ThrottleRequests::class, \Illuminate\Routing\Middleware\ThrottleRequestsWithRedis::class, - \Illuminate\Session\Middleware\AuthenticateSession::class, + \Illuminate\Contracts\Session\Middleware\AuthenticatesSessions::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, \Illuminate\Auth\Middleware\Authorize::class, ]; diff --git a/docs/migrations.md b/docs/migrations.md index c7b1823..dbe1305 100644 --- a/docs/migrations.md +++ b/docs/migrations.md @@ -991,7 +991,7 @@ use Illuminate\Database\DBAL\TimestampType; $table->string('name', 50)->nullable()->change(); }); -> {note} Только следующие типы столбцов могут быть изменены: `bigInteger`, `binary`, `boolean`, `date`, `dateTime`, `dateTimeTz`, `decimal`, `integer`, `json`, `longText`, `mediumText`, `smallInteger`, `string`, `text`, `time`, `unsignedBigInteger`, `unsignedInteger`, `unsignedSmallInteger` и `uuid`. +> {note} Только следующие типы столбцов могут быть изменены: `bigInteger`, `binary`, `boolean`, `char`, `date`, `dateTime`, `dateTimeTz`, `decimal`, `integer`, `json`, `longText`, `mediumText`, `smallInteger`, `string`, `text`, `time`, `unsignedBigInteger`, `unsignedInteger`, `unsignedSmallInteger` и `uuid`. #### Переименование столбцов @@ -1203,3 +1203,5 @@ Laravel также поддерживает создание ограничен | `Illuminate\Database\Events\MigrationsEnded` | Выполнение пакета миграций завершено. | | `Illuminate\Database\Events\MigrationStarted` | Сейчас будет выполнена одна миграция. | | `Illuminate\Database\Events\MigrationEnded` | Выполнение одиночной миграции завершено. | +| `Illuminate\Database\Events\SchemaDumped` | Дамп схемы базы данных завершен. | +| `Illuminate\Database\Events\SchemaLoaded` | Загружен существующий дамп схемы базы данных. | diff --git a/docs/mix.md b/docs/mix.md index 86d5035..f2a48da 100644 --- a/docs/mix.md +++ b/docs/mix.md @@ -118,6 +118,7 @@ content: [ './resources/**/*.blade.php', './resources/**/*.js', './resources/**/*.vue', + './vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php', ], ``` diff --git a/docs/octane.md b/docs/octane.md index 77f6be6..e660c61 100644 --- a/docs/octane.md +++ b/docs/octane.md @@ -231,7 +231,7 @@ Since your application is loaded in memory once when the Octane server starts, a php artisan octane:start --watch ``` -Before using this feature, you should ensure that [Node](https://nodejs.org) is installed within your local development environment. In addition, you should install the [Chokidar](https://github.com/paulmillr/chokidar) file-watching library within your project:library: +Before using this feature, you should ensure that [Node](https://nodejs.org) is installed within your local development environment. In addition, you should install the [Chokidar](https://github.com/paulmillr/chokidar) file-watching library within your project: ```shell npm install --save-dev chokidar @@ -521,7 +521,7 @@ use Illuminate\Support\Str; Cache::store('octane')->interval('random', function () { return Str::random(10); -}, seconds: 5) +}, seconds: 5); ``` diff --git a/docs/pagination.md b/docs/pagination.md index e271bd7..2b21d9d 100644 --- a/docs/pagination.md +++ b/docs/pagination.md @@ -372,6 +372,7 @@ Laravel содержит шаблоны постраничной навигац `$paginator->nextCursor()` | Получить экземпляр курсора для следующего набора элементов. `$paginator->nextPageUrl()` | Получить URL-адрес следующей страницы. `$paginator->onFirstPage()` | Определить, находится ли пагинатор на первой странице. +`$paginator->onLastPage()` | Определить, находится ли пагинатор на последней странице. `$paginator->perPage()` | Количество элементов, отображаемых на каждой странице. `$paginator->previousCursor()` | Получить экземпляр курсора для предыдущего набора элементов. `$paginator->previousPageUrl()` | Получить URL-адрес предыдущей страницы. diff --git a/docs/queries.md b/docs/queries.md index c69b9ac..5a8df64 100644 --- a/docs/queries.md +++ b/docs/queries.md @@ -12,6 +12,7 @@ - [Основные выражения Where](#basic-where-clauses) - [Выражения Where](#where-clauses) - [Выражения Or Where](#or-where-clauses) + - [Выражения Where Not](#where-not-clauses) - [Выражения Where и JSON](#json-where-clauses) - [Дополнительные выражения Where](#additional-where-clauses) - [Логическая группировка](#logical-grouping) @@ -462,6 +463,18 @@ select * from users where votes > 100 or (name = 'Abigail' and votes > 50) > {note} Вы всегда должны группировать вызовы `orWhere`, чтобы избежать неожиданного поведения при применении [глобальных областей запроса](eloquent.md#query-scopes). + +### Выражения Where Not + +Методы `whereNot` и `orWhereNot` могут использоваться для отмены переданной группы ограничений запроса. Например, следующий запрос исключает товары, которые находятся на распродаже или имеют цену меньше десяти: + + $products = DB::table('products') + ->whereNot(function ($query) { + $query->where('clearance', true) + ->orWhere('price', '<', 10); + }) + ->get(); + ### Выражения Where и JSON diff --git a/docs/routing.md b/docs/routing.md index a15ae7b..869e0b2 100644 --- a/docs/routing.md +++ b/docs/routing.md @@ -3,6 +3,7 @@ - [Основы маршрутизации](#basic-routing) - [Маршруты перенаправлений](#redirect-routes) - [Маршруты представлений](#view-routes) + - [Список маршрутов](#the-route-list) - [Параметры маршрута](#route-parameters) - [Обязательные параметры](#required-parameters) - [Необязательные параметры](#parameters-optional-parameters) @@ -124,6 +125,27 @@ > {note} При использовании параметров маршрута в маршрутах представлений, следующие параметры зарезервированы Laravel и не могут быть использованы: `view`, `data`, `status` и `headers`. + +### Список маршрутов + +Команда `route:list` Artisan может легко предоставить обзор всех маршрутов, определенных вашим приложением: + +```shell +php artisan route:list +``` + +По умолчанию посредник, назначенный каждому маршруту, не будет отображаться при выводе `route:list`; однако вы можете указать Laravel отображать посредников маршрута, добавив в команду параметр `-v`: + +```shell +php artisan route:list -v +``` + +Кроме того, вы можете указать Laravel скрывать любые маршруты, определенные сторонними пакетами, указав параметр `--except-vendor` при выполнении команды `route:list`: + +```shell +php artisan route:list --except-vendor +``` + ## Параметры маршрута diff --git a/docs/scout.md b/docs/scout.md index 05bea3a..6fa50c7 100644 --- a/docs/scout.md +++ b/docs/scout.md @@ -109,6 +109,8 @@ MEILISEARCH_KEY=masterKey 'queue' => true, +Даже когда для параметра `queue` установлено значение `false`, важно помнить, что некоторые драйверы Scout, такие как Algolia и MeiliSearch, всегда индексируют записи асинхронно. Это означает, что даже если операция индексирования завершена в вашем приложении Laravel, то сама поисковая система может не сразу отображать новые и обновленные записи. + ## Конфигурирование @@ -550,6 +552,21 @@ Scout позволяет добавлять к поисковым запроса } )->get(); + +#### Настройка запроса результатов Eloquent + +После того, как Scout получит список соответствующих запросу моделей Eloquent из поисковой системы вашего приложения, Eloquent используется для получения всех соответствующих запросу моделей по их первичным ключам. Вы можете тонко настроить этот запрос, вызвав метод `query`. Метод `query` принимает замыкание, которое получит в качестве аргумента экземпляр построителя запросов Eloquent: + +```php +use App\Models\Order; + +$orders = Order::search('Star Trek') + ->query(fn ($query) => $query->with('invoices')) + ->get(); +``` + +Поскольку это замыкание вызывается после того, как соответствующие модели уже получены из поисковой системы вашего приложения, метод `query` не следует использовать для «фильтрации» результатов. Вместо этого вы должны использовать [выражения «where» Scout](#where-clauses). + ## Добавление собственных поисковых систем diff --git a/docs/upgrade.md b/docs/upgrade.md index cfb207a..332ab2a 100644 --- a/docs/upgrade.md +++ b/docs/upgrade.md @@ -320,7 +320,19 @@ Laravel 9.x мигрировал с [Flysystem](https://flysystem.thephpleague.c #### Перезапись существующих файлов -Операции записи, такие как `put`, `write`, `writeStream`, теперь по умолчанию перезаписывают существующие файлы. Если вы не хотите перезаписывать существующие файлы, то вам следует предварительно проверить существование файла перед выполнением операции записи. +Операции записи, такие как `put`, `write` и `writeStream`, теперь по умолчанию перезаписывают существующие файлы. Если вы не хотите перезаписывать существующие файлы, то вам следует предварительно проверить существование файла перед выполнением операции записи. + +#### Выброс исключений при выполнении записи + +Операции записи, такие как `put`, `write` и `writeStream`, больше не вызывают исключение при неудавшихся операциях записи. Вместо этого возвращается `false`. Если вы хотите сохранить предыдущее поведение, которое вызывало исключения, то вы можете определить параметр `throw` в конфигурационном массиве файловой системы вашего диска: + +```php +'public' => [ + 'driver' => 'local', + // ... + 'throw' => true, +], +``` #### Чтение отсутствующих файлов @@ -365,9 +377,9 @@ use Spatie\Dropbox\Client as DropboxClient; use Spatie\FlysystemDropbox\DropboxAdapter; Storage::extend('dropbox', function ($app, $config) { - $adapter = new DropboxAdapter(new DropboxClient( - $config['authorization_token'] - );); + $adapter = new DropboxAdapter( + new DropboxClient($config['authorization_token']) + ); return new FilesystemAdapter( new Filesystem($adapter, $config), diff --git a/docs/valet.md b/docs/valet.md index 603fb77..fea25e5 100644 --- a/docs/valet.md +++ b/docs/valet.md @@ -38,7 +38,6 @@ Out of the box, Valet support includes, but is not limited to: