📚
[laravel-admin]Form#edit() のレンダリング前に model() を参照する処理を差し込む
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