Сервисы и контракты выполнения
Эти точки входа поддерживают программную генерацию, регистрацию фидов, интеграцию с планировщиком, преобразование скалярных значений и необязательные поля.
GeneratorService
DragonCode\LaravelFeed\Services\GeneratorService генерирует и публикует один фид.
public function feed(Feed $feed, ?OutputStyle $output = null): GenerationResultData
Метод публикует все части как одну операцию, обновляет время последней активности записи, отправляет события жизненного цикла и возвращает пути с количеством записей в каждом файле. Диск и выходной путь разрешаются до начала генерации. Для обычного фида исключения этого предварительного этапа, включая UnsupportedStorageDiskException, выбрасываются напрямую. Для настроенного фида, реализующего HasFeedTargets, ошибки предварительного этапа оборачиваются в FeedGenerationException, чтобы сохранить ключ цели. После успешной предварительной проверки ошибки генерации оборачиваются для каждого фида, а исходное исключение сохраняется как предыдущее.
Получайте сервис через контейнер Laravel, а не создавайте его внутренние зависимости вручную.
use App\Feeds\UserFeed;
use DragonCode\LaravelFeed\Services\GeneratorService;
$result = app(GeneratorService::class)->feed(app(UserFeed::class));
foreach ($result->records as $path => $count) {
processFeedResult($path, $count);
}
GeneratorService генерирует один настроенный фид и не перечисляет цели. При прямом вызове сначала разрешите цель:
use App\Feeds\PartnerFeed;
use DragonCode\LaravelFeed\Services\GeneratorService;
use RuntimeException;
$feed = app(PartnerFeed::class);
$target = $feed->findTarget('42')
?? throw new RuntimeException('Feed target [42] not found.');
$result = app(GeneratorService::class)->feed(
$feed->forTarget($target),
);
FeedQuery
DragonCode\LaravelFeed\Queries\FeedQuery управляет сохранёнными записями регистрации фидов.
| Метод | Результат |
|---|---|
| `create(string $class, string $title, Expression | string $expression = '0 * * * *', bool $isActive = true, array $extra = []): Feed` |
find(int $id): Feed | Возвращает запись или выбрасывает FeedNotFoundException. |
all(): Builder | Возвращает все записи по идентификатору. |
active(): Builder | Возвращает активные записи по идентификатору. |
setLastActivity(string $class): void | Обновляет last_activity для класса фида. |
delete(int $id): void | Мягко удаляет запись по идентификатору. |
deleteByClass(string $class): void | Окончательно удаляет записи класса, включая ранее удалённые. |
restore(int $id): void | Восстанавливает мягко удалённую запись. |
$expression принимает обычную строку cron-выражения, включая поддерживаемые dragonmantank/cron-expression псевдонимы вроде @daily, или DragonCode\LaravelFeed\Scheduling\Expression. Объект с цепочкой методов преобразуется в cron-строку до проверки и сохранения. При чтении модель возвращает сохранённую строку. Пример приведён в разделе «Выражение расписания».
Для обычных изменений используйте сгенерированную миграцию или операцию развёртывания, чтобы они воспроизводились во всех окружениях.
ScheduleFeedHelper
DragonCode\LaravelFeed\Helpers\ScheduleFeedHelper::register() добавляет активные записи в планировщик Laravel. Каждая запись использует сохранённое выражение cron и блокировку пересечения. Фоновое выполнение и TTL блокировки задаются в feeds.schedule.
Если настроенная таблица фидов не существует, регистрация безопасно пропускается.
Transformer
Реализуйте DragonCode\LaravelFeed\Contracts\Transformer, чтобы преобразовывать поддерживаемые значения до сериализации.
public function allow(mixed $value): bool
public function transform(mixed $value): string
allow() определяет, принимает ли преобразователь значение. transform() возвращает его сериализованное скалярное представление. Добавьте класс через Feed::transformers() или feeds.transformers.
OptionalData
Возвращайте новый DragonCode\LaravelFeed\Data\OptionalData для поля, которое нужно пропустить при отсутствии значения. XML, RSS, JSON и JSON Lines пропускают его. CSV сохраняет столбец и записывает пустое поле.