【laravel-admin】delete 액션 커스터마이즈

디폴트의 ​​delete 액션이라면 특정의 조건만 삭제하고 싶은 경우나, 조건에 의해 확인 메세지를 바꾸고 싶은 경우에 대응할 수 없다.
관계를 붙이고 있는 테이블에서 관계원이 사라져 버리면 좋지 않은 경우라든가.

그 때문에 커스터마이즈할 필요가 있다. 실제로는 커스터마이즈가 아니고, 오리지날의 삭제 처리를 실장해 그쪽을 사용한다.

맞춤 액션 만들기


php artisan admin:action Post\\Delete --grid-row --name="delete"

다음 디렉토리에 만들어진다.app/Admin/Actions/Post/Delete.php
<?php

namespace App\Admin\Actions\Post;

use Carbon\Carbon;
use Encore\Admin\Actions\RowAction;

class Delete extends RowAction
{
    public $name = 'delete';

    public function handle()
    {
        // 削除処理
        $this->row->delete();

        return $this->response()->success('Delete Successful')->refresh();
    }

    public function dialog()
    {
        $auths = $this->row->auths;
        $auths = $auths->filter(function($el){
            $now = Carbon::now();
            return $now < $el->auth_expired;
        });
        if(empty($auths->toArray()))
        {
            $message = '削除しますか?';
        }
        else
        {
            $message = '認証済みのようです。本当に削除しますか?';
        }

        $this->confirm($message);
    }

}

posts 테이블에 auths 테이블이 붙어 있고, 인증이 끝났을 경우에 메세지를 전환하는 예.
내용의 처리는 적절히 변경해 주세요.
완전히 삭제 자체를 금지하는 것도 가능.
public function dialog()
{
...
}
dialog() 를 사용하면 확인 대화 상자가 나타납니다.
이런 ↓

public function form()
{
  $type = [
        1 => 'Advertising',
        2 => 'Illegal',
        3 => 'Fishing',
    ];

  $this->checkbox('type', 'type')->options($type);
  $this->textarea('reason', 'reason')->rules('required');
}
form() 를 사용하여 어떤 입력이나 선택을 할 수도 있습니다.
AWS와 같이 「삭제」라고 문자열을 보내지 않으면 삭제시키지 않는다든가.


만든 맞춤 동작을 사용하도록 설정



마지막으로 만든 사용자 지정 작업을 사용하도록 설정합니다.
함께 기본 삭제 작업을 disabled로 변경합니다.
<?php

namespace App\Admin\Controllers;

use App\Admin\Actions\Post\Delete;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Form;
use Encore\Admin\Grid;

class PostController extends AdminController
{
    ...

    /**
     * Make a grid builder.
     *
     * @return Grid
     */
    protected function grid()
    {
        ...
        $grid->actions(function ($actions) {
            $actions->disableDelete(); // オリジナルの削除は非表示
            $actions->add(new Delete);
        });
        ...

        return $grid;
    }

요약



상당히 자유도 높고 커스텀 액션 만들 수 있으므로 편리하네요.
통상은 디폴트로 준비되어 있는 delete 액션을 사용하면 좋다고 생각합니다만, 특수한 케이스에서는 커스텀 액션을 만들어 가면 문제 없을 것 같다.

좋은 웹페이지 즐겨찾기