← Попередня · Назад до 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 до зміни опублікованих об’єктів. Потім публікація переміщує кожен підготовлений об’єкт на його місце й у разі помилки намагається виконати таке саме відновлення.
Віддалене переміщення може бути реалізоване як копіювання з подальшим видаленням і мати лише узгодженість у кінцевому підсумку. Тому атомарна заміна одного об’єкта або всього розділеного фіду не гарантується. Блокування публікації діє лише на хості застосунку, тому генераторам на різних хостах потрібне зовнішнє розподілене блокування, якщо вони можуть одночасно публікувати той самий фід.