跳到主要内容
版本:2.x

← 上一页 · 返回 README · 下一页 →

Eloquent

每次启用事件的模型调用 create()、update() 或 save() 时,都会运行 FeedObserver::saving()。PR #335 之后,仅当 $feed->isDirty('slug') 为 false 时,它才执行 $feed->slug = $feed->title。SlugCast 会对生成的 slug 和手动指定的 slug 都应用 Str::slug()。例如,Products 变为 products。

显式修改的 slug 会在本次保存中保留,即使同时修改了 title。这并不意味着自定义 slug 会永久固定:后续普通保存时,未修改的 slug 会根据 title 重新计算,即使标题未变。赋予相同的 slug,或规范化结果与当前 slug 相同的值,都不算修改。

观察者读取当前的 title 属性,包括现代或传统访问器以及已应用的设置器。它不读取原始存储值,也不保证使用最终写入数据库的标题。返回 Display: Stored: Product Catalog 的访问器会生成 display-stored-product-catalog。如果显示格式不应影响 slug,请使用单独的访问器。

saveQuietly() 和 withoutEvents() 内的保存会跳过观察者。这样修改 title 会保留原 slug,除非应用显式赋值。需要事件时请使用普通保存。若要静默保存并采用与观察者相同的生成规则:

use DragonCode\LaravelFeed\Models\Feed;

$feed = Feed::query()->findOrFail(42);
$feed->title = 'New Title';
$feed->slug = $feed->title;
$feed->saveQuietly();

如果之后执行的 saving 监听器,或 creating、updating 监听器修改 title,软件包不会再次计算 slug。建议在保存前设置标题或使用修改器。如果必须在后续监听器中修改,请在同一监听器中修改后立即执行 $feed->slug = $feed->title,不要递归调用 save()。请通过应用测试验证监听器顺序。

保存仅选择部分字段且未显式修改 slug 的模型时,请加载 title 及其访问器所需的所有属性。缺少 title 不会禁用 slug 生成。查询构造器的批量插入和更新不运行此观察者,请显式维护两个值。在自定义模型中保留继承的观察者和类型转换。

对于指定或按计划运行的 Feed,请确保已存储的 slug 不同且非空。从标题生成 slug 时,请选择规范化结果不同且非空的标题。已存储的 slug 为空时无法被选择。多条未删除的注册记录具有相同 slug 时,查找会抛出 Illuminate\Database\MultipleRecordsFoundException;系统不会自动添加后缀。

自定义 Feed 注册模型​

当 Feed 注册记录需要额外的列、类型转换、关系或方法时,请将 feeds.model 设置为应用模型。自定义模型必须继承 DragonCode\LaravelFeed\Models\Feed。

namespace App\Models;

use DragonCode\LaravelFeed\Models\Feed as BaseFeed;

class Feed extends BaseFeed
{
protected $fillable = [
'slug',
'class',
'title',
'expression',
'is_active',
'last_activity',
'is_foo',
'is_bar',
];

protected function casts(): array
{
return [
...parent::casts(),
'is_foo' => 'boolean',
'is_bar' => 'boolean',
];
}
}

在 config/feeds.php 中注册模型:

'model' => App\Models\Feed::class,

通过应用迁移向 Feed 表添加自定义列。所有允许批量赋值的属性都必须保留在 $fillable 中。

FeedQuery 使用配置的模型执行创建、查找、列表、更新、删除和恢复操作。创建记录时,通过 extra 传入应用专用值。这些值最后应用,因此可以覆盖方法参数:

$feed = app(FeedQuery::class)->create(
class: SomeFeed::class,
title: 'Some',
expression: '0 */12 * * *',
extra: [
'slug' => 'Custom Some',
'is_foo' => true,
'is_bar' => true,
]
);

这会创建 slug 为 custom-some 的注册记录。模型的 create() 和 update() 也接受显式指定的 slug;同时修改 title 和 slug 时,本次保存会保留修改后的 slug。

应用模型也可以使用常规 Eloquent API:

use App\Models\Feed;

$feed = Feed::create([
'class' => SomeFeed::class,
'title' => 'Some',
'expression' => '0 */12 * * *',
'is_active' => true,
'is_foo' => true,
'is_bar' => true,
]);
备注

配置的模型在运行时解析。静态分析会将 FeedQuery::create() 的结果视为包的基础模型。需要自动补全应用专用属性时,请使用 App\Models\Feed::create() 或显式的局部类型。

分块大小​

数据库查询采用分块处理,默认每块包含 1000 项。可以通过覆盖 chunkSize 方法进行更改:

use DragonCode\LaravelFeed\Feeds\Feed;

class UserFeed extends Feed
{
public function chunkSize(): int
{
return 500;
}
}

另请参阅​