laravel程序员

Laravel 基础学习 第四天

2018-05-17  本文已影响16人  那就远走

完成账户信息修改功能

public function edit(User $user) //这里通过依赖注入实例化了 $user
{
    return view('user.edit', compact('user')); //这里将 $user 传给视图
}
@extends('layouts.master') 

@section('title', '修改资料') 

@section('content')
<div class="container">
    <h1 class="text-center">修改资料</h1>
    @include('components._error', ['errors' => $errors])

    <form method="POST" action=" {{ route('user.update', $user->id) }} ">
        {{-- 重点: 因为 user.update 路由要求method="PUT/PATCH" 但是普通form并不支持,所以需要我们自己添加一个 input.hidden 表单项来伪造 --}}
        @method('PATCH')
        @csrf
        <div class="form-group">
            <label for="name">用户名</label>
            <input type="text" class="form-control" id="name" placeholder="请输入用户名" name="name" value="{{ old('name') ? old('name') : $user->name }}">
            {{-- 这里是判断 old('name') 是否有值,如果没有,就用我们传过来的$user --}}
        </div>
        <div class="form-group">
            <label for="password">新密码</label>
            <input type="password" class="form-control" id="password" placeholder="请输入密码" name="password">
            <input type="password" class="form-control" placeholder="请在此输入密码以确认" name="password_confirmation">
        </div>
        <button type="rest" class="btn btn-secondary">重置</button>
        <button type="submit" class="btn btn-primary">修改</button>
    </form>
</div>
@endsection
<a href="{{ route('user.edit', Auth::id()) }}" class="btn btn-outline-success"> {{ Auth::user()->name }} </a>
public function update(UserRequest $request, User $user)
{
    // ...
}
return [
    'name' => 'required|min:8|max:32|unique:users,name,' . Auth::id(), // unique:表,字段,排除校验自己
    'email' => 'sometimes|required|email|unique:users', // sometimes 只有在表单提交的数据中,存在 email 字段时校验
    'password' => 'required|min:8|confirmed'
];
public function rules()
    {
        return [
            'name' => 'required|min:8|max:32|unique:users,name,' . Auth::id(),
            'password' => 'nullable|min:8|confirmed'
        ];
    }
public function update(UserEditRequest $request, User $user) // 这里通过 UserEditRequest 验证
{
    // 判断是否修改过用户名或者密码
    if($request->name == $user->name || Hash::check($request->password, $user->password)) { // Hash::check(v1, v2) 判断v1加密后是否等于v2
        session()->flash('danger', '您未修改任何内容');
        return redirect()->back();
    }
    // 处理数据
    $data['name'] = $request->name;
    if($request->password) {
        $data['password'] = Hash::make($request->password);
    }
    // 执行更新和跳转
    $user->update($data);
    session()->flash('success', '编辑资料成功!');
    return redirect()->route('user.show', [$user]);
}

用户资料编辑总结

使用中间件 middleware 判断用户是否登陆

 public function __construct()
{
    $this->middleware('auth'); //调用 中间件auth 判断用户是否登陆
}
/**
    * 定义可以被公开访问(不需要登陆)的方法
    */
private $public = ['create', 'store'];

/**
    * 通过构造函数调用中间件判断用户是否登陆
    */
public function __construct()
{
    // 调用中间件 “auth” 判断用户是否登陆 -> 排除(可以被公开访问的方法)
    $this->middleware('auth')->except($this->public);
}

使用 Policy 来控制权限

上面实现的编辑用户资料的功能其实有很严重的权限错误:应该设置只能自己编辑自己!但是其实通过修改浏览器地址指向的url,我们可以编辑所有其他的用户。

<?php

namespace App\Policies;

use App\User;
use Illuminate\Auth\Access\HandlesAuthorization;

class UserPolicy
{
    use HandlesAuthorization; //引用trait

    public function view(User $user, User $model) //view策略
    {
        //
    }
    public function create(User $user) //create策略
    {
        //
    }
    public function update(User $user, User $model) //update策略
    {
        //
    }

    public function delete(User $user, User $model) //delete策略
    {
        //
    }
}

// 只要对应的策略返回 true,则表明可以执行接下来的操作。
protected $policies = [
    'App\Model' => 'App\Policies\ModelPolicy',
    'App\User' => 'App\policies\UserPolicy', //这里填写UserPolicy的命名空间
];
public function update(UserEditRequest $request, User $user) // 这里通过 UserEditRequest 验证
{
    // 判断用户是否在权限策略内进行操作(自己正在更新自己,而不是越权更新他人)
    $this->authorize('update', $user); //这里的 'update' 对应 UserPolicy@update, $user 对应 当前用户 
    ...
}
public function update(User $user, User $model) //第一个参数表示当前登陆的用户,第二个参数表示被修改的用户
{
    // 判断当前登陆的用户是否为当前被修改的用户
    return $user == $model;
}

总结 Policy 的使用

protected $policies = [
    'App\Model' => 'App\Policies\ModelPolicy',
    'App\User' => 'App\policies\UserPolicy', // 模型命名空间 => 策略命名空间
];
上一篇 下一篇

猜你喜欢

热点阅读