feat(menu): enhance validation for content_type and static_content_schema in Menu model

This commit is contained in:
2026-07-23 15:57:14 -03:00
parent aed818da6e
commit 5ada399adf
2 changed files with 33 additions and 4 deletions

View File

@@ -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',
]);

View File

@@ -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');