Перейти к основному содержимому

Сервисы и контракты выполнения

Эти точки входа поддерживают программную генерацию, регистрацию фидов, интеграцию с планировщиком, преобразование скалярных значений и необязательные поля.

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, Expressionstring $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 сохраняет столбец и записывает пустое поле.

Смотрите также