<?php namespace App\Form\Fields; use Illuminate\Support\Collection; abstract class Field { abstract public static function name(): string; abstract public static function meta(): array; abstract public static function default(); public static function asMeta(): array { return self::classNames()->map(fn ($class) => $class::allMeta())->toArray(); } /** * @return Collection<int, class-string<self>> */ private static function classNames(): Collection { return collect(glob(base_path('app/Form/Fields/*.php'))) ->filter(fn ($fieldClass) => preg_match('/[A-Za-z]Field\.php$/', $fieldClass) === 1) ->map(fn ($fieldClass) => str($fieldClass)->replace(base_path(''), '')->replace('/app', '/App')->replace('.php', '')->replace('/', '\\')->toString()) ->values(); } public static function allMeta(): array { return [ 'id' => class_basename(static::class), 'name' => static::name(), 'default' => [ 'name' => '', 'type' => class_basename(static::class), 'columns' => ['mobile' => 2, 'tablet' => 4, 'desktop' => 12], 'default' => static::default(), 'required' => false, ...static::meta(), ], ]; } }