← Папярэдняя · Назад да 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;
}
}