Laravel 隐式路由模型绑定


假设我要实现一个用户信息状态修改的功能,我们先来定义一个路由

Route::get('user/{user}/mark{status}','UserStatusController@mark')->where(['status' => '[0,1]']);

然后我们回到控制器定义mark方法

public function mark(User $user,$status)//注意此处的$user命名要和路由中定义的{user}要一致
{
        dd($user);
}

这样我们就已经绑定了{user}参数到User的模型,如上控制器中的mark方法,通过注入User模型,Laravel会直接返回当前用户User的实例。
比如当前的请求为http://xxx.com/admin/user/1/mark/0 那么控制器中的$user就是数据库中id为1的实例。

但是当我做用户软删除的时候,需要彻底删除软删除的用户记录时,用上面的绑定方法却无法绑定到当前用户实例。
后来发现因为Laravel默认是隐藏已经软删除的用户数据的。除非调用User::withTrashed()才能将所有的用户实例都返回,那么有什么解决办法呢,别着急Laravel还提供了自定义路由模型绑定。
路由定义如下:

Route::get('user/{deletedUser}/delete', 'UserStatusController@delete')->name('user.delete-permanently');

我们在RouteServiceProvider中的boot()方法中添加如下代码

$this->bind('deletedUser',function($value){
            return User::withTrashed()->where('id',$value)->first(); //查找出所有User记录根据传进来的id返回指定User实例
                        //Laravel默认是使用id来作为主键、你也可以在模型定义getRouteKeyName()方法自动返回主键
 });

控制器中

public function delete(User $deletedUser)
 {
        dd($deletedUser);
}

这样就能找到已经标记软删除的用户实例了。
详细关于Laravel 隐式路由模型绑定见Laravel 5.2 新特性系列 —— 隐式路由模型绑定功能实现

本文地址:https://www.blear.cn/article/laravel-route-model-bind

转载时请以链接形式注明出处

评论