'date', 'is_published' => 'boolean', ]; protected $appends = [ 'banner_url', 'content_html', ]; public function bannerUrl(): Attribute { return Attribute::get(function () { if (! $this->banner) { return ''; } $path = ltrim($this->banner, '/'); return \URL::temporarySignedRoute( 'api.v1.branding.asset', now()->addMinutes(30), ['path' => $path] ); }); } public function contentHtml(): Attribute { return Attribute::get(function () { $markdown = $this->getTranslation('content', app()->getLocale()); $environment = new Environment(); $environment->addExtension(new CommonMarkCoreExtension()); $environment->addExtension(new TableExtension()); $environment->addExtension(new AutolinkExtension()); $environment->addExtension(new StrikethroughExtension()); $environment->addExtension(new TaskListExtension()); $converter = new MarkdownConverter($environment); return (string) $converter->convert($markdown); }); } public function scopePublished(Builder $query) { return $query->whereNotNull('published_at')->where('is_published', true); } public function scopeDraft(Builder $query) { return $query->whereNull('published_at'); } public function category(): BelongsTo { return $this->belongsTo(BlogCategory::class, 'blog_category_id'); } public function author(): BelongsTo { return $this->belongsTo(BlogAuthor::class, 'blog_author_id'); } }