Closed6

Laravel Admin

スースー

resource配下にViewをおくことについて

結論

やめるべき

理由

おそらくresource配下のViewについてはカスタマイズを行う目的でおくことが多いかもしれないが、バージョンアップする際に結構Viewの変更が入っていることが多く、バージョンアップで簡単に大幅な変更が入る。
バージョンアップのたびにViewを結構修正する必要があることからやめた方が良い
もしViewをカスタマイズしたいのであれば、AdminControllerなどで、文字やツールなどを最低限変更する手段はあるので、できるだけそちらを使うか、別の手段を持って、Viewのカスタマイズを行うべき

やるにしてもできるだけ、ディレクトリを絞るとか考える方が修正する量を減らすことができるので、脳死でResourceに全てのViewをコピーすると辛い。

参考

https://tac-blog.tech/index.php/2019/09/23/laravel-admin-resource/

https://qiita.com/n-sawada-12345/items/91cebdc468aaa22ea6a3

http://dokuwiki.fl8.jp/11_php/02_framework/01_laravel/22_view_custom

スースー

Formの挙動について

  1. 何かの値をformのカラム などを並べた時点で個別で取得することはできない
  2. ある1カラムの値を別のカラムに対して詰めたいなどといった挙動は$form->saving$form->savedなどを使ってそこで値を取得して詰め直すといった作業が必要
スースー

後から値を上書きしたい場合

https://github.com/z-song/laravel-admin/issues/2354

$form->saving(function ($form) {
    $form->relationship['relationship_property'] = 'overwrite_text';
}

とやってしまいがちだが、これだと上書きできないことも多い。

Indirect modification of overloaded property Encore\Admin\Form::$address has no effect

こういうエラーが出るため。値によっては出ないこともあるが、不安定になりやすいため基本的には次の書き方が推奨される

$form->saving(function ($form) {
    $form->input('address.cep', preg_replace( '#[^0-9]#', '', $form->address['cep']));
});
スースー

An invalid form control with name='XXX' is not focusable.

tab()を使っている際に違うタブのrequired()メソッドの内容が発火してしまうため、送信できない

例えば、tabA, tabBというものを作成したとして。

再現実装手順

  1. tabAのcolumnAにrequired()を使って必須を実装
  2. tabBのcolumnAAにもrequired()を使って必須を実装
        $form->tab(
            'tabA',
            function (Form $form) {
                $form->text('columnA', 'TabATitle')
                    ->required();
        )->tab(
            'tabB',
            function (Form $tabform) use ($mentor){
                $form->text('columnAA', 'TabBTitle')
                    ->required();
            }
        );

これをやっちゃうとtabBの入力なしにtabAを送信すると、エラーも表示もなしにtabBの必須項目がないよとconsoleにエラーが出て送信できないという問題が存在します。

出るエラーについては、このような形式。ブラウザのコンソールに出ます。

An invalid form control with name='XXX' is not focusable.

↓該当のIssue
https://github.com/z-song/laravel-admin/issues/3368

回避方法

  1. required()を全てrules('required')に置換する
        $form->tab(
            'tabA',
            function (Form $form) {
                $form->text('columnA', 'TabATitle')
                    ->rules('required');
        )->tab(
            'tabB',
            function (Form $tabform) use ($mentor){
                $form->text('columnAA', 'TabBTitle')
                    ->rules('required');
            }
        );

これだけ。内部実装的な問題なので、興味がある方は、該当Issueに出ている内容を見てみると良いかもです。

このスクラップは2022/05/03にクローズされました