- 父视图
// auth()->user()可以获取当前用户信息
<a href="{{route('user.edit', auth()->user())}}" class="btn btn-danger my-2 my-sm-0 mr-2">修改</a>
- 资源控制器的edit方法(负责修改页面)
public function edit(User $user)
{
return view('user.edit', compact('user'));
}
- 子视图
@extends('layouts.default')
@section('content')
<form action={{route('user.update', $user)}} method="post">
@csrf
{{-- 模拟put方法--}}
@method('PUT')
<div class="card">
<div class="card-body">
<div class="form-group">
<label for="">昵称</label>
<input type="text" class="form-control" name="name" value={{$user->name}}>
</div>
<div class="form-group">
<label for="">密码</label>
<input type="text" class="form-control" name="password">
</div>
<div class="form-group">
<label for="">确认密码</label>
<input type="text" class="form-control" name="password_confirmation">
</div>
</div>
<div class="card-footer text-muted">
<button type="submit" class="btn btn-success">修改</button>
</div>
</div>
</form>
@endsection
- 资源控制器的update方法(负责验证和更新)
public function update(Request $request, User $user)
{
$request->validate([
'name' => 'required|min:3',
'password' => 'nullable|min:5|confirmed'
]);
session()->flash('success', '修改成功');
// 数据更新
$user->name = $request->name;
if ($request->password) {
$user->password = bcrypt($request->password);
}
$user->save();
return redirect()->route('user.show', $user);
}
save和create方法都可以用于创建数据,但是save可以用来更新数据
- 在控制器中追加auth中间件,防止没登陆的用户修改了数据
public function __construct()
{
$this->middleware('auth')->except('create', 'index', 'show');
}
以下三种方法类似
// except为排除'create', 'index', 'show'方法执行中间件
$this->middleware('auth')->except('create', 'index', 'show');
$this->middleware('auth', [
'except' => ['create', 'index', 'show']
]);
// only为只对'show'方法执行中间件
$this->middleware('auth')->only('show');
- 使用模型策略来处理用户授权动作,防止未授权的用户修改信息
Policy 其实就是将校验的逻辑从控制器转移到相对应的模型策略 (UserPolicy) 中。
生成Policy文件
// 添加--modle使之与模型关联
php artisan make:policy --modle=User UserPolicy
注册Policy文件
在 app/Providers/AuthServiceProvider.php 的 policies 数组中注册该策略,将 User模型与对应的 UserPolicy 策略进行绑定。
Laravel 5.8 版本之前,模型和策略之间的关系需要显示的进行绑定
protected $policies = [
// 'App\Model' => 'App\Policies\ModelPolicy',
'App\User' => UserPolicy::class,
];
5.8 引入模型策略自动发现机制,但需要遵循一定的规范,即策略类都必须位于模型类所在目录的Policies 目录中。例如 App\User 对应 App\Policies\UserPolicy,如果是 App\Models\User 的话,就需要对应 App\Models\Policies\UserPolicy。
编写验证逻辑
public function update(User $user, User $model)
{
return $user->id == $model->id;
}
在控制器中实行模型策略
public function edit(User $user)
{
// 使用模型策略
$this->authorize('update', $user);
authorize 的第一个参数表示本次验证使用 UserPolicy 里面的 update 方法。