← Предыдущая · Назад к README · Следующая →
Расположение
По умолчанию фиды хранятся на диске public, а имя файла автоматически формируется из части имени класса фида после App\Feeds\ в формате kebab-case. Например:
# App\Feeds\UserFeed
user.xml
# App\Feeds\Sitemaps\ProductFeed
sitemaps-product.xml
Эти значения можно изменить, переопределив свойство $storage и метод filename:
use DragonCode\LaravelFeed\Feeds\Feed;
class UserFeed extends Feed
{
protected string $storage = 's3';
public function filename(): string
{
return 'some/path/will/be/here.xml';
}
}
Поддерживаемые диски
Генерация фидов поддерживает диски Laravel, которые разрешаются в Illuminate\Filesystem\FilesystemAdapter. К ним относятся драйверы local, s3, sftp и ftp, если соответствующие адаптеры Flysystem установлены и настроены. Пользовательские адаптеры поддерживаются, если через Flysystem они предоставляют потоки для записи, перемещение файлов, управление каталогами и их списками, а также удаление.
Диски только для чтения и пользовательские диски, реализующие только Illuminate\Contracts\Filesystem\Filesystem, не поддерживаются. Пользовательский диск, который не разрешается в Illuminate\Filesystem\FilesystemAdapter, приводит к UnsupportedStorageDiskException ещё до начала запроса фида к базе данных. Диск Laravel только для чтения всё равно разрешается в FilesystemAdapter, поэтому запрос фида и локальная подготовка завершаются до ошибки записи при публикации. GeneratorService оборачивает эту ошибку хранилища в FeedGenerationException.
Контракт путей
storage()возвращает настроенныйFilesystemAdapter.storagePath()возвращает путь относительно диска, используемый в операциях с хранилищем, включая необязательный суффикс разделённого файла.path()возвращает путь, разрешённый адаптером Laravel. Для локального диска это абсолютный путь файловой системы, для удалённого — путь, разрешённый адаптером.
Гарантии публикации
Каждая часть фида полностью завершается до начала публикации. На локальных дисках подготовленные файлы публикуются через перемещение в файловой системе под эксклюзивной блокировкой приложения. Если перемещение завершается ошибкой, Laravel Feeds пытается восстановить каждый предыдущий файл из его подготовленной резервной копии.
Удалённые диски получают полностью подготовленные файлы через потоки Flysystem до изменения опубликованных объектов. Затем каждый подготовленный объект перемещается на место. При ошибке выполняется такая же попытка отката.
Удалённое перемещение может быть реализовано как копирование с последующим удалением и иметь согласованность с задержкой. Поэтому атомарная замена одного объекта или всего разделённого фида не гарантируется. Блокировка публикации действует только на узле приложения. Если генераторы на разных узлах могут одновременно публиковать один фид, требуется внешняя распределённая блокировка.