Fasáda Posts
Všetko, čo hostiteľská aplikácia s príspevkami robí, ide cez jednu fasádu RoundlyConsulting\Posts\Facades\Posts, dostupnú aj ako alias Posts:
use RoundlyConsulting\Posts\DataTransferObjects\SeoData;
use RoundlyConsulting\Posts\Facades\Posts;
// Write a post with the builder, then save it as a draft, publish it or schedule it
$post = Posts::draft()
->title('en', 'Hello world')->title('sk', 'Ahoj svet')
->perex('en', 'A short intro')
->content('en', '<p>…</p>')
->by($user) // any author model, bigint/uuid/ulid keyed
->tags(['laravel', 'php']) // Tag models, or names found/created in the current locale
->seo(new SeoData(canonical: 'https://example.test/hello-world'))
->publish(); // or ->save() (draft), ->publish($at), ->schedule($at)
// Or from a DTO
Posts::create($createPostData);
// Lifecycle
Posts::publish($post); // now, or Posts::publish($post, $at)
Posts::schedule($post, now()->addDay());
Posts::archive($post);
Posts::unpublish($post); // back to draft
Posts::publishDue(); // publish every scheduled post whose time has come → int
// SEO and tags
Posts::seo($post, new SeoData(metaTitle: 'Custom title', robots: 'index,follow'));
Posts::syncTags($post, ['eloquent', $tag]);
// Reads — always the configured posts.model
Posts::findBySlug('hello-world'); // current locale → fallback → any locale
Posts::findBySlug('ahoj-svet', 'sk'); // exactly one locale — needs sk in sluggable.locales.supported
Posts::published()->latest('published_at')->paginate();
Posts::query()->inCategory('laravel')->get();| Posts::… | Vracia | Čo robí |
|---|---|---|
create(CreatePostData $data) | Post | Vytvorí príspevok z DTO. |
draft() | PendingPost | Fluentný builder — nižšie. |
publish(Post $post, ?CarbonInterface $at = null) | Post | Publikuje teraz alebo k $at; spustí PostPublished. |
schedule(Post $post, CarbonInterface $at) | Post | Naplánuje; spustí PostScheduled. |
archive(Post $post) | Post | Archivuje so zachovaným dátumom publikovania; spustí PostArchived. |
unpublish(Post $post) | Post | Vráti do konceptu a vymaže dátum publikovania; spustí PostDrafted. |
seo(Post $post, SeoData $data) | Post | Uloží SEO polia a príspevok. |
syncTags(Post $post, iterable $tags) | Post | Synchronizuje tagy — modely alebo názvy v aktuálnom jazyku. |
publishDue() | int | Publikuje každý naplánovaný príspevok, ktorého čas nastal (to spúšťa posts:publish-scheduled). |
findBySlug(string $slug, ?string $locale = null) | ?Post | Nájde podľa slugu cez nakonfigurovaný posts.model. |
published() | Builder<Post> | Publikované príspevky, ktorých dátum už nastal. |
query() | Builder<Post> | Dotaz nad nakonfigurovaným posts.model. |
fake() | PostsFake | Nasadí zaznamenávajúci fake — pozrite Testovanie. |
Čítania idú vždy cez nakonfigurovaný posts.model, takže findBySlug(), published() aj query() vrátia vašu podtriedu, ak ju nastavíte.
Builder draft()
Posts::draft() vráti PendingPost. Nastavte polia pre jednotlivé jazyky, autora, tagy a SEO a ukončite ho jednou z koncových metód:
$post = Posts::draft()
->title('en', 'Hello world') // per-locale fields, any number of locales
->slug('sk', 'Vlastny Slug') // manual slug: normalised + made unique
->perex('en', 'Intro')
->content('en', '<p>…</p>') // stored and rendered as is — sanitise untrusted input first
->metaTitle('en', 'Meta title')
->metaDescription('en', 'Meta description')
->by($author) // any Model; its morph class + key
->tags(['php', $tag]) // synced after create
->seo(new SeoData(canonical: '…'))
->save(); // Draft
$data = Posts::draft()->title('en', 'Queued')->data(); // the CreatePostData it would create| Ukončenie | Čo robí |
|---|---|
save(): Post | create(data()) ako Draft, potom syncTags(), ak ste zadali tagy. |
publish(?CarbonInterface $at = null): Post | save(), potom publish($post, $at). |
schedule(CarbonInterface $at): Post | save(), potom schedule($post, $at). |
data(): CreatePostData | DTO, ktoré by vytvoril — pre job vo fronte alebo create(). |
Každý krok ide cez manažér, takže fake zaznamená create, syncTags aj publish či schedule samostatne. Neuložený model autora sa ako autor nepriradí.
Metódy modelu
Model si ponecháva pohodlné metódy a každá ide cez ten istý manažér — správanie, udalosti aj fake sú rovnaké, nech použijete ktorýkoľvek zápis. Podtrieda posts.model ich môže prepísať a doplniť vlastnú logiku:
$post->publish(); // == Posts::publish($post)
$post->schedule(now()->addDay()); // == Posts::schedule($post, $at)
$post->archive(); // == Posts::archive($post)
$post->unpublish(); // == Posts::unpublish($post)
$post->syncTags(['php']); // == Posts::syncTags($post, [...])Fasáda nemá pod-prístupy ani handles s rozsahom: príspevok nepatrí pod žiadneho rodiča.
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.