Laravel学习笔记(11)用户修改信息(模型策略)

  1. 父视图
// auth()->user()可以获取当前用户信息
<a href="{{route('user.edit', auth()->user())}}" class="btn btn-danger my-2 my-sm-0 mr-2">修改</a>
  1. 资源控制器的edit方法(负责修改页面)
    public function edit(User $user)
    {
        return view('user.edit', compact('user'));
    }
  1. 子视图
@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
  1. 资源控制器的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可以用来更新数据

  1. 在控制器中追加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');
  1. 使用模型策略来处理用户授权动作,防止未授权的用户修改信息
    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 方法。

发布了40 篇原创文章 · 获赞 0 · 访问量 781

猜你喜欢

转载自blog.csdn.net/qj4865/article/details/104184410