From 5ada399adf3ce51758f0bb12d1c50d1f426a70da Mon Sep 17 00:00:00 2001 From: ncoronel Date: Thu, 23 Jul 2026 15:57:14 -0300 Subject: [PATCH] feat(menu): enhance validation for content_type and static_content_schema in Menu model --- .../Menu/Controllers/MenuController.php | 14 +++++++---- app/Domains/Menu/Models/Menu.php | 23 +++++++++++++++++++ 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/app/Domains/Menu/Controllers/MenuController.php b/app/Domains/Menu/Controllers/MenuController.php index 5a8588d..1947792 100644 --- a/app/Domains/Menu/Controllers/MenuController.php +++ b/app/Domains/Menu/Controllers/MenuController.php @@ -27,8 +27,11 @@ class MenuController extends Controller Rule::exists('menues', 'code'), 'different:code', ], - 'content_type' => ['sometimes', Rule::in(['static', 'dynamic'])], - 'static_content_schema' => 'nullable|array', + 'content_type' => [ + 'sometimes', + Rule::in([Menu::CONTENT_TYPE_STATIC, Menu::CONTENT_TYPE_DYNAMIC]), + ], + 'static_content_schema' => 'required_if:content_type,static|nullable|array', 'route' => 'required|string', ]); @@ -52,8 +55,11 @@ class MenuController extends Controller Rule::exists('menues', 'code'), Rule::notIn([$menu->code]), ], - 'content_type' => ['sometimes', Rule::in(['static', 'dynamic'])], - 'static_content_schema' => 'nullable|array', + 'content_type' => [ + 'sometimes', + Rule::in([Menu::CONTENT_TYPE_STATIC, Menu::CONTENT_TYPE_DYNAMIC]), + ], + 'static_content_schema' => 'required_if:content_type,static|nullable|array', 'route' => 'sometimes|required|string', ]); diff --git a/app/Domains/Menu/Models/Menu.php b/app/Domains/Menu/Models/Menu.php index a767df5..8728779 100644 --- a/app/Domains/Menu/Models/Menu.php +++ b/app/Domains/Menu/Models/Menu.php @@ -8,13 +8,22 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Validation\ValidationException; class Menu extends Model { use HasFactory; + public const CONTENT_TYPE_DYNAMIC = 'dynamic'; + + public const CONTENT_TYPE_STATIC = 'static'; + protected $table = 'menues'; + protected $attributes = [ + 'content_type' => self::CONTENT_TYPE_DYNAMIC, + ]; + protected $fillable = [ 'code', 'parent_menu_code', @@ -30,6 +39,20 @@ class Menu extends Model ]; } + protected static function booted(): void + { + static::saving(function (self $menu): void { + if ( + $menu->content_type === self::CONTENT_TYPE_STATIC + && empty($menu->static_content_schema) + ) { + throw ValidationException::withMessages([ + 'static_content_schema' => 'El schema es obligatorio para los menús estáticos.', + ]); + } + }); + } + public function parent(): BelongsTo { return $this->belongsTo(self::class, 'parent_menu_code', 'code');