Resolvery a predvyplnenie
Resolver určuje, ako sa hodnota poľa číta z requestu (toStorable) a späť z úložiska (fromStorage). Balík obsahuje DefaultResolver a MediaFileResolver. Implementujte RoundlyConsulting\Forms\Resolvers\Resolver — jeho konštruktor dostane Field — a namapujte ho na typ poľa v config/forms.php:
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
use RoundlyConsulting\Forms\Models\Field;
use RoundlyConsulting\Forms\Resolvers\Resolver;
class CheckboxResolver implements Resolver
{
public function __construct(private Field $field) {}
public function toStorable(Request $request, ?Model $sender = null): array
{
return ['value' => $request->boolean($this->field->path())];
}
public function fromStorage(?Model $sender = null): mixed
{
return $this->field->submissions()
->where('field_id', $this->field->getKey())
->value('value')['value'] ?? null;
}
}// config/forms.php
'fields' => [
'default' => \RoundlyConsulting\Forms\Resolvers\DefaultResolver::class,
'checkbox' => \App\Forms\CheckboxResolver::class,
],Hodnotu vracajte zabalenú ako ['value' => …] — presne tento tvar rozbaľuje typedValue() aj čítač odpovedí. Typ bez vlastného mapovania použije fields.default; ak chýba aj ten, vyhodí sa UnresolvableFieldException.
Resolvery, ktoré potrebujú uložený riadok
Resolver, ktorý pred uložením hodnoty potrebuje existujúci riadok odpovede, navyše implementuje AttachesToSubmission — jeho attach() beží po vytvorení riadku v tej istej transakcii a restoreUpload() vráti dočasnú kópiu uloženého súboru (alebo null), aby ho finalizácia konceptu mohla zvalidovať podľa pravidiel poľa. Referenčnou implementáciou je MediaFileResolver:
// RoundlyConsulting\Forms\Resolvers\AttachesToSubmission
public function attach(Submission $submission, Request $request, ?Model $sender = null): void;
// A temporary copy of the stored file (or null), so finalizing a draft can validate it
// against the field's rules — the caller deletes the copy once validation has run.
public function restoreUpload(Submission $submission): ?UploadedFile;
// How MediaFileResolver implements attach() — the row exists, so it can own media:
public function attach(Submission $submission, Request $request, ?Model $sender = null): void
{
$file = $request->file($this->field->path());
if (! $file instanceof UploadedFile) {
return;
}
$media = $submission->addMedia($file)->toBucket($submission->attachmentBucket());
$submission->update(['value' => ['value' => $media->uuid]]);
}Predvyplnenie (autofill)
Nastavte autofill poľa na triedu implementujúcu RoundlyConsulting\Forms\Autofill\Autofill a predvolenú hodnotu vypočítate za behu:
use RoundlyConsulting\Forms\Autofill\Autofill;
use RoundlyConsulting\Forms\Models\Field;
class CurrentUserEmail implements Autofill
{
public function fill(Field $field): mixed
{
return auth()->user()?->email;
}
}
// $field->getAutofillValue() resolves the class and returns its fill() result,
// or the raw `autofill` string when it isn't an Autofill class — such a class is never built.$g->field('email', 'Email')->email()->autofill(CurrentUserEmail::class);
$field->getAutofillValue(); // '[email protected]' for the signed-in userTriedy Autofill sa resolvujú cez kontajner, takže funguje injektovanie závislostí v konštruktore. Stĺpec autofill sú dáta: trieda, ktorá nie je Autofill, sa nikdy nevytvorí — vráti sa jej reťazec bez zmeny. FieldResource sprístupní vypočítanú hodnotu vášmu frontendu.
Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.