109 lines
3.0 KiB
PHP
109 lines
3.0 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Models;
|
|
|
|
use App\Models\Concerns\HasPublication;
|
|
use App\Policies\WeddingPackagePolicy;
|
|
use Database\Factories\WeddingPackageFactory;
|
|
use Illuminate\Database\Eloquent\Attributes\Fillable;
|
|
use Illuminate\Database\Eloquent\Attributes\UsePolicy;
|
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Support\Carbon;
|
|
use Illuminate\Support\Str;
|
|
|
|
/**
|
|
* @property string $name
|
|
* @property string|null $slug
|
|
* @property string $level
|
|
* @property string|null $tag
|
|
* @property string|null $subtitle
|
|
* @property string $summary
|
|
* @property list<string> $scope_items
|
|
* @property string $cta_label
|
|
* @property string|null $compare_heading
|
|
* @property string|null $compare_summary
|
|
* @property string|null $eyebrow
|
|
* @property string|null $title_line
|
|
* @property string|null $title_emphasis
|
|
* @property string|null $hero_lead
|
|
* @property string|null $hero_image_path
|
|
* @property string|null $hero_image_alt
|
|
* @property list<array{icon_key: string, label: string}>|null $benefits
|
|
* @property list<array{icon_key: string, title: string, description: string}>|null $included_items
|
|
* @property string|null $audience_heading
|
|
* @property string|null $audience_intro
|
|
* @property list<string>|null $audience_points
|
|
* @property string|null $audience_image_path
|
|
* @property string|null $audience_image_alt
|
|
* @property string|null $final_cta_heading
|
|
* @property string|null $final_cta_body
|
|
* @property string|null $meta_title
|
|
* @property string|null $meta_description
|
|
* @property int $sort_order
|
|
* @property Carbon|null $published_at
|
|
*/
|
|
#[Fillable([
|
|
'name',
|
|
'slug',
|
|
'level',
|
|
'tag',
|
|
'subtitle',
|
|
'summary',
|
|
'scope_items',
|
|
'cta_label',
|
|
'compare_heading',
|
|
'compare_summary',
|
|
'sort_order',
|
|
'published_at',
|
|
'eyebrow',
|
|
'title_line',
|
|
'title_emphasis',
|
|
'hero_lead',
|
|
'hero_image_path',
|
|
'hero_image_alt',
|
|
'benefits',
|
|
'included_items',
|
|
'audience_heading',
|
|
'audience_intro',
|
|
'audience_points',
|
|
'audience_image_path',
|
|
'audience_image_alt',
|
|
'final_cta_heading',
|
|
'final_cta_body',
|
|
'meta_title',
|
|
'meta_description',
|
|
])]
|
|
#[UsePolicy(WeddingPackagePolicy::class)]
|
|
class WeddingPackage extends Model
|
|
{
|
|
/** @use HasFactory<WeddingPackageFactory> */
|
|
use HasFactory;
|
|
|
|
use HasPublication;
|
|
|
|
protected static function booted(): void
|
|
{
|
|
static::saving(function (WeddingPackage $weddingPackage): void {
|
|
if (blank($weddingPackage->slug) && filled($weddingPackage->name)) {
|
|
$weddingPackage->slug = Str::slug($weddingPackage->name);
|
|
}
|
|
});
|
|
}
|
|
|
|
/** @return array<string, string|class-string> */
|
|
protected function casts(): array
|
|
{
|
|
return [
|
|
'scope_items' => 'array',
|
|
'benefits' => 'array',
|
|
'included_items' => 'array',
|
|
'audience_points' => 'array',
|
|
'sort_order' => 'integer',
|
|
'published_at' => 'datetime',
|
|
];
|
|
}
|
|
}
|