Laravel-Admin提交表单时根据变化内容更新其他字段

需求

现在需要判断审核字段是否被修改,如果修改,则获取当前登录管理员姓名,把姓名放入跟新表单中。

应对办法

我采用的方法是在Controller里进行设置和判断,这样的代码不会污染Model。在采用这个方法的时候,涉及到Laravel-Admin提供的两个表单回调函数来获取和更新表单内容,并在控制器中设置一个private的变量。

//保存前回调
$form->saving(function (Form $form) {
    //填写获取表单内容
   	$this->beforeStatus = $form->model()->pass_status;
});

//保存后回调(指的在写入数据库之后的回调)
$form->saved(function (Form $form) {
    //添加要判断及更改的字段
    if($this->beforeStatus != $form->model()->pass_status)
    {
    	$checkedBy = Admin::user()->name;
    	$form->model()->checked_by = $checkedBy;
	}
});

完整代码




namespace App\Admin\Controllers;

use App\Admin\Extensions\UserExporter;
use App\Models\User;
use App\Http\Controllers\Controller;
use Encore\Admin\Controllers\HasResourceActions;
use Encore\Admin\Facades\Admin;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Layout\Content;
use Encore\Admin\Show;


class UserController extends Controller
{
    use HasResourceActions;
    /**
    * 用来记录用户状态变化
    */
    private $beforePassStatus;
    /**
     * Index interface.
     *
     * @param Content $content
     * @return Content
     */
    public function index(Content $content)
    {
        return $content
            ->header('用户管理')
            ->body($this->grid());
    }

    /**
     * Show interface.
     *
     * @param mixed $id
     * @param Content $content
     * @return Content
     */
    public function show($id, Content $content)
    {
        return $content
            ->header('用户管理')
            ->body($this->detail($id));
    }

    /**
     * Edit interface.
     *
     * @param mixed $id
     * @param Content $content
     * @return Content
     */
    public function edit($id, Content $content)
    {
        return $content
            ->header('用户管理')
            ->body($this->form()->edit($id));
    }

    /**
     * Create interface.
     *
     * @param Content $content
     * @return Content
     */
    public function create(Content $content)
    {
        return $content
            ->header('用户管理')
            ->body($this->form());
    }

    /**
     * Make a grid builder.
     *
     * @return Grid
     */
    protected function grid()
    {
        $grid = new Grid(new User);
        $grid->model()->orderBy('is_pass','asc')
	        ->orderBy('id','desc');
        
        $grid->id('编号')->display(function ($id){
            return sprintf('%06d', $id) ;
        })->sortable();
        $grid->username('用户名');
     
        $grid->is_pass('审核')->display(function($item){
        	$table = [
		        0 => '未审核',
		        1 => '通过',
		        2 => '拒绝'
	        ];
        	return $table[$item];
		})->sortable();
	    $grid->checked_by('审核人')->sortable();
      

        return $grid;
    }

    /**
     * Make a show builder.
     *
     * @param mixed $id
     * @return Show
     */
    protected function detail($id)
    {

        $show = new Show(User::findOrFail($id));

        $show->id('编号');
        $show->username('姓名');
       
        $show->is_pass('审核状态')->as(function ($item){
	        $table = [
		        0 => '未审核',
		        1 => '通过',
		        2 => '拒绝'
	        ];
	        return $table[$item];
        });
       
        return $show;
    }

    /**
     * Make a form builder.
     *
     * @return Form
     */
    protected function form()
    {
        $form = new Form(new User);

        $form->display('id', '编号')->with(function ($id){
            return sprintf('%06d',$id);
        });
        $form->text('username', '姓名');
      
	    $form->select('is_pass','审核')->options([
		    0 => '未审核',
		    1 => '通过',
		    2 => '拒绝'
	    ]);
	  
	    $form->saving(function (Form $form){
	    	//填写获取表单内容
		    $this->beforePassStatus = $form->model()->is_pass;

        });

	    $form->saved(function (Form $form){
			//添加要判断及更改的字段
			if($this->beforePassStatus != $form->model()->is_pass)
			{
				$checkedBy = Admin::user()->name;
				$user = User::find($form->model()->id);
				$user->checked_by = $checkedBy;
				$user->save();
			}
	    });

        return $form;
    }

}

以上是我在处理这个问题的方法,但感觉不是个最优雅的解决方法,如果有更好的编码方式,欢迎留言告诉我。

参考:

[1]. http://laravel-admin.org/docs/zh/model-form-callback

你可能感兴趣的:(PHP,Laravel,Laravel-Admin)