Publikačný cyklus
Stav príspevku je enum PostStatus — Draft, Scheduled, Published, Archived — spolu s časovou značkou published_at. Každý prechod cez fasádu Posts nastaví oboje, príspevok uloží, spustí svoju udalosť a vráti príspevok:
use RoundlyConsulting\Posts\Facades\Posts;
Posts::publish($post); // PostPublished — published_at = now()
Posts::publish($post, now()->addHour()); // Published with a future date — listed as scheduled until then
Posts::schedule($post, now()->addDay()); // PostScheduled
Posts::archive($post); // PostArchived — keeps published_at
Posts::unpublish($post); // PostDrafted — clears published_at
// The same verbs on the model go through the same manager:
$post->publish();
$post->unpublish();| Metóda | Stav | published_at | Udalosť |
|---|---|---|---|
Posts::publish($post, ?$at) | Published | $at ?? now() | PostPublished |
Posts::schedule($post, $at) | Scheduled | $at | PostScheduled |
Posts::archive($post) | Archived | bez zmeny | PostArchived |
Posts::unpublish($post) | Draft | null | PostDrafted |
Publikovanie, archivácia alebo vrátenie do konceptu pri príspevku, ktorý už daný stav má, nič nerobí: nič sa nezapíše, dátum publikovania zostane a nespustí sa žiadna udalosť. Opätovné naplánovanie vždy posunie dátum, preto vždy spustí PostScheduled. O každom prechode sa rozhoduje podľa uloženého stavu pod zámkom riadka, takže zastaraná kópia príspevku, ktorý medzitým archivoval moderátor, vyhodí výnimku namiesto zverejnenia.
Dátumy môžu byť v ľubovoľnom časovom pásme a uložia sa ako ten istý okamih v pásme aplikácie (config('app.timezone')) — v tom, s ktorým porovnávajú published() aj publishDue():
// Any timezone — stored as the same instant in config('app.timezone')
Posts::schedule($post, now('Asia/Tokyo')->addHour());Scopes
Post::query()->published()->get(); // status = published AND published_at <= now
Post::query()->draft()->get();
Post::query()->scheduled()->get(); // scheduled, or published with a future date
Post::query()->archived()->get();published() znamená stav Published a published_at <= now(), takže príspevok publikovaný s budúcim dátumom sa vo verejných výpisoch neobjaví a až do svojho času ho vráti scheduled().
Pravidlá prechodov
Archivovaný príspevok sa môže vrátiť len do stavu Draft (alebo zostať Archived). Čokoľvek iné vyhodí InvalidPostStatusTransitionException, ktorá rozširuje abstraktnú PostsException balíka:
use RoundlyConsulting\Posts\Exceptions\InvalidPostStatusTransitionException;
use RoundlyConsulting\Posts\Facades\Posts;
Posts::archive($post);
try {
Posts::publish($post);
} catch (InvalidPostStatusTransitionException $e) {
// "Cannot transition a post from [archived] to [published]."
}
Posts::publish(Posts::unpublish($post)); // archived → draft → published is allowedPublikovanie naplánovaných príspevkov
posts:publish-scheduled publikuje každý príspevok v stave Scheduled, ktorého published_at už nastal. Volá Posts::publishDue(), ktorý každý takýto príspevok nakonfigurovaného modelu publikuje k naplánovanému času, takže pre každý sa spustí PostPublished:
php artisan posts:publish-scheduled
# Published 3 scheduled post(s).Môžete ho zavolať aj sami, z jobu či vlastného príkazu:
$count = Posts::publishDue(); // publish every due scheduled post → intNaplánujte ho na spúšťanie každú minútu:
// routes/console.php
use Illuminate\Support\Facades\Schedule;
Schedule::command('posts:publish-scheduled')->everyMinute()->withoutOverlapping()->onOneServer();withoutOverlapping() a onOneServer() ušetria prácu, no správnosť na nich nezávisí: každý príspevok, ktorého čas nastal, sa pred publikovaním zamkne na úrovni riadka a znova overí — stále naplánovaný, čas stále nastal — takže prekrývajúce sa behy ho publikujú a PostPublished spustia len raz a príspevok, ktorý bol po načítaní behom archivovaný, vrátený do konceptu alebo preplánovaný, sa preskočí. onOneServer() vyžaduje cache úložisko zdieľané vašimi servermi.
Názvy stavov a možnosti pre formuláre
PostStatus používa trait Helpers z enums-for-laravel, takže každý stav má čitateľný názov, možnosti pre select, vyhľadávanie a validačné pravidlo:
use RoundlyConsulting\Posts\Enums\PostStatus;
PostStatus::Published->label(); // 'Published' (readable, translatable via __())
PostStatus::Published->isPublic(); // true — only Published is public
PostStatus::labels(); // Collection: ['Draft', 'Scheduled', 'Published', 'Archived']
PostStatus::values(); // Collection: ['draft', 'scheduled', 'published', 'archived']
PostStatus::toOptions(); // Collection: ['draft' => 'Draft', …] for a <select>
PostStatus::toArray(); // the same map as a plain array
PostStatus::options(); // Collection<EnumOption{ value, label, name }> for JS/Inertia
PostStatus::validationRule(); // 'in:draft,scheduled,published,archived'
PostStatus::fromName('Published'); // PostStatus::PublishedPravidlo použite vo validácii, aby sa zoznam povolených hodnôt nikdy nerozišiel so stavmi:
$request->validate([
'status' => ['required', PostStatus::validationRule()],
]);Názvy vznikajú z hodnoty stavu cez Str::headline a prechádzajú helperom __() z Laravelu, takže ich preložíte v JSON prekladoch aplikácie:
// lang/sk.json
{
"Draft": "Koncept",
"Scheduled": "Naplánovaný",
"Published": "Publikovaný",
"Archived": "Archivovaný"
}Trait ďalej poskytuje names(), tryFromName(), fromLabel(), tryFromLabel(), hasName(), hasValue(), random(), count(), is(), isNot(), isIn(), isNotIn() a podmienky whenIs() / whenIsNot() / whenIsIn() / whenIsNotIn().
Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.