- Методы
firstOrNew
,firstOrCreate
иupdateOrCreate
отношений «Belongs To Many» - Пользовательская типизация и
null
- Время ожидания HTTP-клиента по умолчанию
- Возвращаемые типы PHP
- Изменение параметра
schema
для Postgres - Метод
assertDeleted
- Каталог
lang
- Правило
password
- Методы
when
/unless
- Непровалидированные ключи массива
Примечание
Мы стараемся задокументировать все возможные критические изменения. Поскольку некоторые из этих критических изменений находятся в малоизвестных частях фреймворка, только часть этих изменений может повлиять на ваше приложение. Хотите сэкономить время? Вы можете использовать Laravel Shift, чтобы автоматизировать обновления приложений.
Вероятность воздействия: высокая
Laravel теперь требует PHP 8.0.2 или выше.
Вы должны обновить следующие зависимости в файле composer.json
вашего приложения:
laravel/framework
до^9.0
nunomaduro/collision
до^6.1
Кроме того, замените facade/ignition
на "spatie/laravel-ignition": "^1.0"
в файле composer.json
вашего приложения.
Кроме того, следующие пакеты получили новые релизы для поддержки Laravel 9.x. Если применимо, то вы должны прочитать их отдельные руководства перед обновлением:
- Vonage Notification Channel (v3.0) (заменяет Nexmo)
Наконец, проверьте любые другие сторонние пакеты, используемые вашим приложением, и убедитесь, что вы используете корректную версию для поддержки Laravel 9.
PHP начинает переходить к требованию определения типа возвращаемого значения в методах PHP, таких как offsetGet
, offsetSet
и т. д. В свете этого Laravel 9 реализовал эти возвращаемые типы в своей кодовой базе. Как правило, это не должно влиять на написанный пользователем код; однако, если вы переопределяете один из этих методов, расширяя базовые классы Laravel, то вам нужно будет добавить эти возвращаемые типы в код вашего собственного приложения или пакета:
count(): int
getIterator(): Traversable
getSize(): int
jsonSerialize(): array
offsetExists($key): bool
offsetGet($key): mixed
offsetSet($key, $value): void
offsetUnset($key): void
Кроме того, в методы, реализующие SessionHandlerInterface
PHP, были добавлены возвращаемые типы. Опять же, маловероятно, что это изменение повлияет на ваше собственное приложение или код пакета:
open($savePath, $sessionName): bool
close(): bool
read($sessionId): string|false
write($sessionId, $data): bool
destroy($sessionId): bool
gc($lifetime): int
Вероятность воздействия: низкая
Метод storagePath
интерфейса Illuminate\Contracts\Foundation\Application
был обновлен, чтобы принимать аргумент $path
. Если вы реализуете этот интерфейс, то вы должны соответствующим образом обновить свою реализацию:
public function storagePath($path = '');
Точно так же метод langPath
класса Illuminate\Foundation\Application
был обновлен, чтобы принимать аргумент $path
:
public function langPath($path = '');
Вероятность воздействия: низкая
Метод ignore
обработчика исключений теперь является public
, а не protected
. Этот метод не включен в приложение по умолчанию; однако, если вы определили этот метод самостоятельно, то вы должны обновить его до public
:
public function ignore(string $class);
Вероятность воздействия: низкая
При итерации экземпляра LazyCollection
в шаблоне Blade переменная $loop
больше недоступна, так как доступ к этой переменной приводит к загрузке всей коллекции в память, что делает использование отложенных коллекций бессмысленным в этом сценарии.
Вероятность воздействия: низкая
Новые директивы @checked
, @disabled
и @selected
Blade могут конфликтовать с одноименными событиями Vue. Вы можете использовать @@
, чтобы экранировать директивы и избежать подобного конфликта; пример использования экранированной директивы: @@selected
.
Вероятность воздействия: низкая
Контракт Illuminate\Support\Enumerable
теперь определяет метод sole
. Если вы реализуете этот контракт самостоятельно, то вам следует обновить свою реализацию, чтобы отразить этот новый метод:
public function sole($key = null, $operator = null, $value = null);
Метод reduceWithKeys
был удален, так как метод reduce
обеспечивает ту же функциональность. Вы можете просто обновить свой код, чтобы он вызывал reduce
вместо reduceWithKeys
.
Метод reduceMany
был переименован в reduceSpread
для согласованности именования с другими подобными методами.
Вероятность воздействия: очень низкая
Контракт Illuminate\Contracts\Container\Container
теперь определяет два метода: scoped
и scopedIf
. Если вы реализуете этот контракт самостоятельно, то вам следует обновить свою реализацию, чтобы отразить эти новые методы.
Вероятность воздействия: очень низкая
Контракт Illuminate\Contracts\Container\ContextualBindingBuilder
теперь определяет метод giveConfig
. Если вы реализуете этот контракт самостоятельно, то вам следует обновить свою реализацию, чтобы отразить этот новый метод:
public function giveConfig($key, $default = null);
Вероятность воздействия: средняя
Параметр конфигурации schema
, используемый для настройки путей поиска соединений Postgres в конфигурационном файле config/database.php
вашего приложения, должен быть переименован в search_path
.
Вероятность воздействия: низкая
Метод registerCustomDoctrineType
был удален из класса Illuminate\Database\Schema\Builder
. Вместо этого вы можете использовать метод registerDoctrineType
фасада DB
или зарегистрировать пользовательские типы Doctrine в конфигурационном файле config/database.php
.
Вероятность воздействия: средняя
В предыдущих релизах Laravel метод set
классов пользовательской типизации не вызывался, если для типизируемого атрибута было установлено значение null
. Однако такое поведение не соответствовало документации Laravel. В Laravel 9.x метод set
класса типизации будет вызываться с null
в качестве предоставленного аргумента $value
. Поэтому вы должны убедиться, что ваши пользовательские типизации способны в достаточной степени справиться с этим сценарием:
/**
* Подготовить переданное значение к сохранению.
*
* @param \Illuminate\Database\Eloquent\Model $model
* @param string $key
* @param AddressModel $value
* @param array $attributes
* @return array
*/
public function set($model, $key, $value, $attributes)
{
if (! $value instanceof AddressModel) {
throw new InvalidArgumentException('The given value is not an Address instance.');
}
return [
'address_line_one' => $value->lineOne,
'address_line_two' => $value->lineTwo,
];
}
Вероятность воздействия: средняя
Методы firstOrNew
, firstOrCreate
и updateOrCreate
отношений «Belongs To Many» принимают массив атрибутов в качестве первого аргумента. В предыдущих релизах Laravel этот массив атрибутов сравнивался со «сводной» / промежуточной таблицей для существующих записей.
Однако такое поведение было неожиданным и, как правило, нежелательным. Вместо этого эти методы теперь сравнивают массив атрибутов с таблицей связанной модели:
$user->roles()->updateOrCreate([
'name' => 'Administrator',
]);
Кроме того, метод firstOrCreate
теперь принимает массив $values
в качестве второго аргумента. Этот массив будет объединен с первым аргументом метода ($attributes
) при создании связанной модели, если она еще не существует. Это изменение делает этот метод совместимым с методами firstOrCreate
других типов отношений:
$user->roles()->firstOrCreate([
'name' => 'Administrator',
], [
'created_by' => $user->id,
]);
Вероятность воздействия: низкая
Метод touch
теперь принимает имя затрагиваемого атрибута. Если вы ранее перезаписывали этот метод, то вам следует обновить сигнатуру метода, чтобы отразить этот новый аргумент:
public function touch($attribute = null);
Вероятность воздействия: низкая
Контракт Illuminate\Contracts\Encryption\Encrypter
теперь определяет метод getKey
. Если вы реализуете этот интерфейс самостоятельно, то вам следует соответствующим образом обновить свою реализацию:
public function getKey();
Вероятность воздействия: низкая
Метод getFacadeAccessor
всегда должен возвращать ключ привязки контейнера. В предыдущих релизах Laravel этот метод мог возвращать экземпляр объекта; однако это поведение больше не поддерживается. Если вы написали свои собственные фасады, то вы должны убедиться, что этот метод возвращает строку привязки контейнера:
/**
* Получить зарегистрированное имя компонента.
*
* @return string
*/
protected static function getFacadeAccessor()
{
return Example::class;
}
Вероятность воздействия: низкая
Переменная окружения FILESYSTEM_DRIVER
была переименована в FILESYSTEM_DISK
для более точного отражения ее использования. Это изменение затрагивает только скелет приложения; однако вы можете обновить переменные окружения своего собственного приложения, чтобы отразить это изменение, если хотите.
Вероятность воздействия: низкая
Параметр конфигурации cloud
диска был удален из скелета приложения по умолчанию в ноябре 2020 года. Это изменение влияет только на скелет приложения. Если вы используете диск cloud
в своем приложении, то вы должны оставить это значение конфигурации в скелете вашего собственного приложения.
Вероятность воздействия: высокая
Laravel 9.x мигрировал с Flysystem версии 1.x на версию 3.x. Под капотом Flysystem используются все методы манипулирования файлами, предоставляемые фасадом Storage
. В связи с этим в вашем приложении могут потребоваться некоторые изменения; однако мы постарались сделать этот переход максимально плавным.
Перед использованием драйверов S3, FTP или SFTP вам необходимо установить соответствующий пакет с помощью менеджера пакетов Composer:
- Amazon S3:
composer require -W league/flysystem-aws-s3-v3 "^3.0"
- FTP:
composer require league/flysystem-ftp "^3.0"
- SFTP:
composer require league/flysystem-sftp-v3 "^3.0"
Операции записи, такие как put
, write
и writeStream
, теперь по умолчанию перезаписывают существующие файлы. Если вы не хотите перезаписывать существующие файлы, то вам следует предварительно проверить существование файла перед выполнением операции записи.
Операции записи, такие как put
, write
и writeStream
, больше не вызывают исключение при неудавшихся операциях записи. Вместо этого возвращается false
. Если вы хотите сохранить предыдущее поведение, которое вызывало исключения, то вы можете определить параметр throw
в конфигурационном массиве файловой системы вашего диска:
'public' => [
'driver' => 'local',
// ...
'throw' => true,
],
Попытка чтения из несуществующего файла теперь возвращает null
. В предыдущих релизах Laravel возникало исключение Illuminate\Contracts\Filesystem\FileNotFoundException
.
Попытка «удалить» несуществующий файл с помощью метода delete
теперь возвращает true
.
Flysystem больше не поддерживает адаптеры с кешем. Таким образом, они были удалены из Laravel, и любая соответствующая конфигурация (например, ключ cache
в конфигурациях диска) может быть удалена.
Небольшие изменения были внесены в шаги, необходимые для регистрации пользовательских драйверов файловой системы. Поэтому, если вы определяли свои собственные пользовательские драйверы файловой системы или использовали пакеты, определяющие пользовательские драйверы, то вам следует обновить свой код и зависимости.
Например, в Laravel 8.x пользовательский драйвер файловой системы может быть зарегистрирован следующим образом:
use Illuminate\Support\Facades\Storage;
use League\Flysystem\Filesystem;
use Spatie\Dropbox\Client as DropboxClient;
use Spatie\FlysystemDropbox\DropboxAdapter;
Storage::extend('dropbox', function ($app, $config) {
$client = new DropboxClient(
$config['authorization_token']
);
return new Filesystem(new DropboxAdapter($client));
});
Однако в Laravel 9.x замыкание метода Storage::extend
должно возвращать экземпляр Illuminate\Filesystem\FilesystemAdapter
напрямую:
use Illuminate\Filesystem\FilesystemAdapter;
use Illuminate\Support\Facades\Storage;
use League\Flysystem\Filesystem;
use Spatie\Dropbox\Client as DropboxClient;
use Spatie\FlysystemDropbox\DropboxAdapter;
Storage::extend('dropbox', function ($app, $config) {
$adapter = new DropboxAdapter(
new DropboxClient($config['authorization_token'])
);
return new FilesystemAdapter(
new Filesystem($adapter, $config),
$adapter,
$config
);
});
Вероятность воздействия: очень низкая
Раньше помощник data_get
можно было использовать для извлечения вложенных данных в массивах и экземплярах класса Collection
; однако теперь этот помощник может извлекать вложенные данные во всех итерируемых объектах.
Вероятность воздействия: очень низкая
Laravel 9.x теперь включает глобальный помощник str
. Если вы самостоятельно определили глобальный помощник str
в своем приложении, то вы должны переименовать или удалить его, чтобы он не конфликтовал с помощником str
Laravel.
Вероятность воздействия: средняя
Как вы, возможно, знаете, методы when
и unless
предлагаются различными классами фреймворка. Эти методы можно использовать для условного выполнения действия, если логическое значение первого аргумента метода оценивается как «истина» или «ложь», соответственно:
$collection->when(true, function ($collection) {
$collection->merge([1, 2, 3]);
});
Поэтому в предыдущих релизах Laravel передача замыкания методам when
или unless
означала, что условная операция всегда будет выполняться, поскольку гибкое сравнение с объектом замыкания (или любым другим объектом) всегда оценивается как true
. Это часто приводило к неожиданным результатам, поскольку разработчики ожидали, что результат замыкания будет использоваться как логическое значение, определяющее, выполняется ли условное действие.
Таким образом, в Laravel 9.x любые замыкания, переданные методам when
или unless
, будут выполнены, а значение, возвращаемое замыканием, будет считаться логическим значением, используемым методами when
и unless
:
$collection->when(function ($collection) {
// Это замыкание будет выполнено ...
return false;
}, function ($collection) {
// Не будет выполнено, так как первое замыкание вернуло `false` ...
$collection->merge([1, 2, 3]);
});
Вероятность воздействия: средняя
HTTP-клиент теперь имеет время ожидания по умолчанию, равное 30 секундам. Другими словами, если сервер не отвечает в течение 30 секунд, то будет выброшено исключение. Раньше для HTTP-клиента не настраивалось время ожидания по умолчанию, из-за чего запросы иногда «зависали» на неопределенный срок.
Если вы хотите указать более длительное время ожидания для конкретного запроса, то вы можете сделать это с помощью метода timeout
:
$response = Http::timeout(120)->get(/* ... */);
Вероятность воздействия: низкая
Ранее Laravel не запускал посредников Guzzle HTTP, если HTTP-клиент являлся имитацией. Однако в Laravel 9.x посредник Guzzle HTTP будет выполняться даже при имитации HTTP-клиента.
Вероятность воздействия: низкая
В предыдущих релизах Laravel вызов метода Http::fake()
не влиял на экземпляры Illuminate\Http\Client\Factory
, которые были внедрены в конструкторы классов. Однако в Laravel 9.x Http::fake()
гарантирует, что фейковые ответы будут возвращены HTTP-клиентами, внедряемыми в другие службы посредством внедрения зависимостей. Такое поведение больше соответствует поведению других фасадов и их имитаций.
Вероятность воздействия: высокая
Одним из самых больших изменений в Laravel 9.x является переход к Symfony Mailer от SwiftMailer, который с декабря 2021 года больше не поддерживается. Однако мы постарались сделать этот переход как можно более плавным для ваших приложений. При этом внимательно ознакомьтесь со списком изменений ниже, чтобы убедиться, что ваше приложение полностью совместимо.
Чтобы продолжить использование драйвера Mailgun, вашему приложению требуется пакеты symfony/mailgun-mailer
и symfony/http-client
Composer:
composer require symfony/mailgun-mailer symfony/http-client
Пакет wildbit/swiftmailer-postmark
Composer должен быть удален из вашего приложения. Вместо этого вашему приложению должен потребоваться пакеты symfony/postmark-mailer
и symfony/http-client
Composer::
composer require symfony/postmark-mailer symfony/http-client
Методы send
, html
, raw
и plain
, принадлежащие Illuminate\Mail\Mailer
больше не возвращают void
. Вместо этого возвращается экземпляр Illuminate\Mail\SentMessage
. Этот объект содержит экземпляр Symfony\Component\Mailer\SentMessage
, доступный через метод getSymfonySentMessage
или путем динамического вызова методов объекта.
Различные методы, связанные со SwiftMailer, некоторые из которых не были задокументированы, были переименованы в их аналоги Symfony Mailer. Например, метод withSwiftMessage
был переименован в withSymfonyMessage
:
// Laravel 8.x...
$this->withSwiftMessage(function ($message) {
$message->getHeaders()->addTextHeader(
'Custom-Header', 'Header Value'
);
});
// Laravel 9.x...
use Symfony\Component\Mime\Email;
$this->withSymfonyMessage(function (Email $message) {
$message->getHeaders()->addTextHeader(
'Custom-Header', 'Header Value'
);
});
Предупреждение
Пожалуйста, внимательно изучите документацию Symfony Mailer для взаимодействий с объектомSymfony\Component\Mime\Email
.
Список ниже содержит более подробный обзор переименованных методов. Многие из этих методов являются низкоуровневыми методами, используемыми для прямого взаимодействия со SwiftMailer / Symfony Mailer, поэтому могут не использоваться в большинстве приложений Laravel:
Message::getSwiftMessage();
Message::getSymfonyMessage();
Mailable::withSwiftMessage($callback);
Mailable::withSymfonyMessage($callback);
MailMessage::withSwiftMessage($callback);
MailMessage::withSymfonyMessage($callback);
Mailer::getSwiftMailer();
Mailer::getSymfonyTransport();
Mailer::setSwiftMailer($swift);
Mailer::setSymfonyTransport(TransportInterface $transport);
MailManager::createTransport($config);
MailManager::createSymfonyTransport($config);
Illuminate\Mail\Message
обычно проксирует отсутствующие методы базовому экземпляру Swift_Message
. Однако отсутствующие методы теперь вместо этого проксируются экземпляру Symfony\Component\Mime\Email
. Таким образом, любой код, который ранее полагался на отсутствующие методы для проксирования SwiftMailer, должен быть обновлен до соответствующих аналогов Symfony Mailer.
Опять же, многие приложения могут не взаимодействовать с этими методами, поскольку они не описаны в документации Laravel:
// Laravel 8.x...
$message
->setFrom('[email protected]')
->setTo('[email protected]')
->setSubject('Order Shipped')
->setBody('<h1>HTML</h1>', 'text/html')
->addPart('Plain Text', 'text/plain');
// Laravel 9.x...
$message
->from('[email protected]')
->to('[email protected]')
->subject('Order Shipped')
->html('<h1>HTML</h1>')
->text('Plain Text');
SwiftMailer предлагал возможность определить собственный домен для включения в сгенерированные идентификаторы сообщений с помощью параметра конфигурации mime.idgenerator.idright
. Это не поддерживается в Symfony Mailer. Вместо этого Symfony Mailer автоматически сгенерирует идентификатор сообщения на основе отправителя.
Больше невозможно принудительно переподключиться к транспорту (например, когда почтовая программа работает через процесс-демон). Вместо этого Symfony Mailer попытается автоматически переподключиться к транспорту и выдаст исключение, если переподключение не удастся.
Определение параметров потока для транспорта SMTP больше не поддерживается. Вместо этого вы должны определить соответствующие параметры непосредственно в конфигурации, если они поддерживаются. Например, чтобы отключить одноранговую проверку TLS:
'smtp' => [
// Laravel 8.x...
'stream' => [
'ssl' => [
'verify_peer' => false,
],
],
// Laravel 9.x...
'verify_peer' => false,
],
Чтобы узнать больше о доступных параметрах конфигурации, ознакомьтесь с документацией Symfony Mailer.
Предупреждение
Несмотря на приведенный выше пример, обычно не рекомендуется отключать проверку SSL, поскольку это создает возможность атак типа «man-in-the-middle».
Определение параметра auth_mode
SMTP в конфигурационном файле mail
больше не требуется. Режим аутентификации будет автоматически согласован между Symfony Mailer и SMTP-сервером.
Больше невозможно получить список неуспешных получателей после отправки сообщения. Вместо этого будет выброшено исключение Symfony\Component\Mailer\Exception\TransportExceptionInterface
, если сообщение не будет отправлено. Вместо того, чтобы полагаться на получение недействительных адресов электронной почты после отправки сообщения, мы рекомендуем вам проверять адреса электронной почты перед отправкой сообщения.
Вероятность воздействия: средняя
В новых приложениях Laravel каталог resources/lang
теперь находится в корневом каталоге проекта (lang
). Если ваш пакет публикует языковые файлы в этом каталоге, то вы должны убедиться, что ваш пакет вместо жестко заданного пути публикует файлы в app()->langPath()
.
Вероятность воздействия: низкая
Зависимость Laravel от opis/closure
была заменена на laravel/serializable-closure
. Это не должно привести к каким-либо критическим изменениям в вашем приложении, если только вы не взаимодействуете с библиотекой opis/closure
напрямую. Кроме того, были удалены ранее объявленные устаревшими классы Illuminate\Queue\SerializableClosureFactory
и Illuminate\Queue\SerializableClosure
. Если вы взаимодействуете с библиотекой opis/closure
напрямую или используете какой-либо из удаленных классов, вместо этого вы можете использовать Laravel Serializable Closure.
Вероятность воздействия: низкая
Метод flush
, определенный интерфейсом Illuminate\Queue\Failed\FailedJobProviderInterface
, теперь принимает аргумент $hours
, который определяет, насколько старым должно быть неудачное задание (в часах), прежде чем оно будет удалено командой queue:flush
. Если вы самостоятельно реализуете FailedJobProviderInterface
, то вы должны убедиться, что ваша реализация обновлена, чтобы отразить этот новый аргумент:
public function flush($hours = null);
Вероятность воздействия: низкая
Класс Symfony\Component\HttpFoundaton\Request
, расширенный классом Illuminate\Http\Request
Laravel, предлагает метод getSession
для получения текущего обработчика хранилища сессии. Этот метод не задокументирован Laravel, так как большинство приложений Laravel взаимодействуют с сессией через метод session
Laravel.
Метод getSession
ранее возвращал экземпляр Illuminate\Session\Store
или null
; однако из-за того, что в версии Symfony 6.x принудительно используется тип возвращаемого значения Symfony\Component\HttpFoundation\Session\SessionInterface
, то getSession
теперь корректно возвращает реализацию SessionInterface
или выбрасывает Symfony\Component\HttpFoundation\Exception\SessionNotFoundException
, когда сессия недоступна.
Вероятность воздействия: средняя
Все вызовы метода assertDeleted
должны быть заменена на assertModelMissing
.
Вероятность воздействия: низкая
Если вы обновляете свой проект Laravel 8 до Laravel 9, импортируя существующий код приложения в совершенно новый скелет приложения Laravel 9, вам может потребоваться обновить посредник «доверенного прокси» вашего приложения.
В вашем файле app/Http/Middleware/TrustProxies.php
измените use Fideloper\Proxy\TrustProxies as Middleware
на use Illuminate\Http\Middleware\TrustProxies as Middleware
.
Там же вы должны обновить определение свойства $headers
:
// До ...
protected $headers = Request::HEADER_X_FORWARDED_ALL;
// После ...
protected $headers =
Request::HEADER_X_FORWARDED_FOR |
Request::HEADER_X_FORWARDED_HOST |
Request::HEADER_X_FORWARDED_PORT |
Request::HEADER_X_FORWARDED_PROTO |
Request::HEADER_X_FORWARDED_AWS_ELB;
Наконец, вы можете удалить зависимость fideloper/proxy
Composer из своего приложения:
composer remove fideloper/proxy
Вероятность воздействия: низкая
Метод validated
, предлагаемый запросами формы, теперь принимает аргументы $key
и $default
. Если вы самостоятельно определяете этот метод, то вам следует обновить сигнатуру вашего метода, чтобы отразить эти новые аргументы:
public function validated($key = null, $default = null)
Вероятность воздействия: средняя
Правило password
, которое проверяет, соответствует ли заданное входное значение текущему паролю аутентифицированного пользователя, было переименовано в current_password
.
Вероятность воздействия: средняя
В предыдущих релизах Laravel вам приходилось вручную указывать валидатору Laravel исключать непроверенные ключи массива из «провалидированных» данных, которые он возвращает, особенно в сочетании с правилом array
, которое не указывает список разрешенных ключей.
Однако в Laravel 9.x непроверенные ключи массива всегда исключаются из «провалидированных» данных, даже если в правиле array
не указаны разрешенные ключи. Как правило, такое поведение является наиболее ожидаемым поведением, и предыдущий метод excludeUnvalidatedArrayKeys
был добавлен в Laravel 8.x только как временная мера для сохранения обратной совместимости.
Хотя это не рекомендуется, но вы можете отказаться от предыдущего поведения Laravel 8.x, вызвав новый метод includeUnvalidatedArrayKeys
в методе boot
одного из поставщика служб вашего приложения:
use Illuminate\Support\Facades\Validator;
/**
* Загрузка любых служб приложения.
*
* @return void
*/
public function boot()
{
Validator::includeUnvalidatedArrayKeys();
}
Мы также рекомендуем вам просматривать изменения в GitHub-репозитории laravel/laravel
. Хотя многие из этих изменений могут быть неважны, но вы можете синхронизировать эти файлы с вашим приложением. Некоторые из этих изменений будут рассмотрены в данном руководстве по обновлению, но другие, такие как изменения файлов конфигурации или комментарии, не будут. Вы можете легко просмотреть изменения с помощью инструмента сравнения GitHub и выбрать, какие обновления важны для вас.