Перайсці да асноўнага змесціва
Версія: 2.x

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

Глядзіце таксама​