NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky
Posts for Laravel

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ódaStavpublished_atUdalosť
Posts::publish($post, ?$at)Published$at ?? now()PostPublished
Posts::schedule($post, $at)Scheduled$atPostScheduled
Posts::archive($post)Archivedbez zmenyPostArchived
Posts::unpublish($post)DraftnullPostDrafted

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 allowed

Publikovanie 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 → int

Naplá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::Published

Pravidlo 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 kryptomien

Odoslaní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.