← Попередня · Назад до README · Наступна →
Eloquent
FeedObserver::saving() виконується під час кожного виклику методів моделі create(), update() або save() з увімкненими подіями. Після PR #335 він присвоює $feed->slug = $feed->title, лише коли $feed->isDirty('slug') повертає false. SlugCast застосовує Str::slug() як до автоматично створених, так і до заданих вручну slug. Наприклад, Products стає products.
Явно змінений slug зберігається під час поточного збереження, зокрема за одночасної зміни title. Це не закріплює власний slug назавжди: під час наступного звичайного збереження незмінений slug перераховується з title, навіть якщо назва не змінилася. Присвоєння того самого slug або значення, яке нормалізується в поточний slug, не вважається зміною.
Observer читає поточну властивість title з урахуванням сучасних і класичних accessors та вже застосованих сеттерів. Це не сире збережене значення й не обов’язково остаточне значення в базі. Accessor, що повертає Display: Stored: Product Catalog, дає display-stored-product-catalog. Винесіть форматування для показу в окремий accessor, якщо воно не має впливати на slug.
saveQuietly() і збереження всередині withoutEvents() пропускають observer. За такої зміни title попередній slug залишається, якщо застосунок не задає його явно. Якщо події потрібні, використовуйте звичайне збереження. Для тихого збереження за правилом observer:
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 і всі поля, потрібні його accessor. Відсутність title не вимикає генерування slug. Масові вставки й оновлення Query Builder не запускають observer; явно підтримуйте обидва значення. У власних моделях зберігайте успадковані observer та casts.
Для вибору окремих фідів і запуску за розкладом зберігайте різні непорожні slug. Обчислюючи slug із назв, вибирайте назви, які нормалізуються в різні непорожні значення. Порожній збережений slug не можна вибрати. Якщо slug збігається в кількох невидалених реєстрацій, пошук викидає Illuminate\Database\MultipleRecordsFoundException; суфікси автоматично не додаються.
Власна модель реєстрації фіду
Установіть 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,
Додайте власні стовпці до таблиці фідів у міграції застосунку. Усі атрибути, доступні для масового присвоєння, мають залишатися в $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 під час поточного збереження.
Модель застосунку також може використовувати звичайний API Eloquent:
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;
}
}