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

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)PostVytvorí príspevok z DTO.
draft()PendingPostFluentný builder — nižšie.
publish(Post $post, ?CarbonInterface $at = null)PostPublikuje teraz alebo k $at; spustí PostPublished.
schedule(Post $post, CarbonInterface $at)PostNaplánuje; spustí PostScheduled.
archive(Post $post)PostArchivuje so zachovaným dátumom publikovania; spustí PostArchived.
unpublish(Post $post)PostVráti do konceptu a vymaže dátum publikovania; spustí PostDrafted.
seo(Post $post, SeoData $data)PostUloží SEO polia a príspevok.
syncTags(Post $post, iterable $tags)PostSynchronizuje tagy — modely alebo názvy v aktuálnom jazyku.
publishDue()intPublikuje každý naplánovaný príspevok, ktorého čas nastal (to spúšťa posts:publish-scheduled).
findBySlug(string $slug, ?string $locale = null)?PostNá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()PostsFakeNasadí 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(): Postcreate(data()) ako Draft, potom syncTags(), ak ste zadali tagy.
publish(?CarbonInterface $at = null): Postsave(), potom publish($post, $at).
schedule(CarbonInterface $at): Postsave(), potom schedule($post, $at).
data(): CreatePostDataDTO, 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 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.