跳到主要内容

运行时服务与契约

这些入口支持编程式生成、Feed 注册、调度器集成、标量转换和可选字段。

GeneratorService

DragonCode\LaravelFeed\Services\GeneratorService 生成并发布一个 Feed。

public function feed(Feed $feed, ?OutputStyle $output = null): GenerationResultData

该方法将所有分片作为一个操作发布,更新注册记录的最后活动时间,分发生命周期事件,并返回路径以及每个文件的记录数。系统会在生成开始前解析存储磁盘并查找输出路径。对于普通 Feed,此前置检查中发生的异常(包括 UnsupportedStorageDiskException)会直接抛出。对于已配置且实现 HasFeedTargets 的 Feed,前置检查失败会包装为 FeedGenerationException,以保留目标键。前置检查成功后,所有 Feed 的生成失败都会被包装,原始异常则作为前一个异常保留。

应通过 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 只生成一个已配置的 Feed,不会枚举目标。直接调用时,请先解析目标:

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 管理持久化的 Feed 注册记录。

方法结果
`create(string $class, string $title, Expressionstring $expression = '0 * * * *', bool $isActive = true, array $extra = []): Feed`
find(int $id): Feed返回注册记录,找不到时抛出 FeedNotFoundException
all(): Builder返回按 ID 排序的所有注册记录。
active(): Builder返回按 ID 排序的已启用注册记录。
setLastActivity(string $class): void更新 Feed 类的 last_activity
delete(int $id): void按 ID 软删除注册记录。
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 表达式和防重叠锁。后台执行和锁的有效期取自 feeds.schedule 配置。

配置的 Feed 表不存在时,会安全跳过注册。

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 会保留列并写入空字段。

另请参阅