📚

[laravel-admin]Form#edit() のレンダリング前に model() を参照する処理を差し込む

2021/03/19に公開

Issue

何かリソースを編集するフォームを提供する時に、特定のリソースだけFormのfieldの見た目を変えたい

方法

fieldの値に任意のClosureを適用する \Encore\Admin\Form\Field::with() を使いました

ユーザー編集画面でログインユーザー自身には任意のチェックボックスを操作されたくない。という状況を考えます。

$form->checkbox('delete')
    ->options([0 => 'YES', 1 => 'NO'])
    ->with(function ($value, $field){
        if (Admin::user()->is($this)) {
            $field->help('自分自身は削除できません')
                ->disable();
        }
        return $value;
    });

with() が呼ばれるのは Form#edit() が呼ばれ、model() の中身が決定した後なので、$this で概要のモデル参照できます。

編集ではなく、新規作成のときはモデルは dirty になります。

コメント

レンダリング中に入力値の変形される仕組みっぽいことはコードからわかったが、ドキュメントにwith() が載ってないので、こういう用途が想定されているか不明。

代案としてはFieldクラスを拡張するやり方もある。

Discussion