Lavaral——书上的知识点总结与规范

423 阅读3分钟

虽然我laravel已经可以做项目了,可是在规范上或者是一些小知识点上肯定还有很多欠缺的地方,这里准备花些时间,在跟着laravel-china的三本书做项目的同时,总结一些我不知道的知识点。

继承模版

书上给出的写法是这样子的:

    //  resource/views/layouts/default.blade.php
    <!DOCTYPE html>
    <html>
    <head>
    <title>@yield('title', 'Sample App')- Laravel 入门教程</title>    //这样可以在不同的页面实现不同的title
    </head>
    <body>
        <!--前面加横线一般表示公用的部分片段-->
        @include('layouts._header') 
        
        <div class="container">
            @yield('content')
            @include('layouts._footer')
        </div>
    </body>
    
    //resource/views/indexs/index.blade.php
    @extends('layouts.default')
    <!--因为有了第二个参数的原因不需要结尾-->
    @section('title', '首页')  
    
    @section('content')
        <h1>首页</h1>
    @stop

小知识点:

  1. 如果是模版文件里需要有默认值的地方,如上面的title,那么可以在yield里穿两个参数,第一个是名字,第二个是默认值。如果用了两个参数,那么继承模版用@section的时候可以不需要结束符。
  2. @section的结尾可以用@stop结束。

验证

  1. 在修改用户密码并且可以修改个人资料的时候,有的时候只想修改一下资料,并不想修改密码,如图所示:
    更新资料
    这个时候,后台的密码验证就需要做出一些改变,而不是required,并且如果密码为空的时候不能更新到数据库,需要判断,所以是下面这样:
    public function update(User $user, Request $request) {
        $this->validate($request, [
            'name' => 'required|max:50',
            'password'=> 'nullable|confirmed|min:6'
        ]);
        
        $data = [];
        $data = ['name'=> $request->name];
        if($request->password) {
            $data['password'=> bcrypt($request->password]);
        }
        
        $user->update($data);
        
        session()->flash('success', '个人资料更新成功!');

        return redirect()->route('users.show', $user->id);
    }

这里的nullable指的就是如果为空也能验证通过。所以下面需要进行判断是否密码有值,有就修改,没有就跳过,仅仅修改个人资料了。

个人权限

在个人中心页面相关的板块,需要处理一些个人的权限问题。比如,没有登录,不能进入到个人中心页面,而是跳到登录页面。还有,你不能去修改别人的个人修改资料页面,和一些逻辑操作。下面就以最规范的操作处理一下这个问题。

  1. 没登陆。限制进入个人中心相关页面

app/Http/Controllers/UsersController.php

namespace App\Http\Controllers;
.
.
.
class UsersController extends Controller {
    public function __construct() {
        $this->middleware('auth', [
           'except'=> ['show', 'create', 'store']
        ]);
    }
    .
    .
}

__contstruct是php的构造器方法,在执行这个类的任何一个方法前,都会最先执行这个方法,所以将中间件放到这里,就可以将except以外的方法,全部得登录了,才能进行访 问。

  1. 限制已登录用户修改他人信息

还有可能有这么一种情况发生,就是id为1的用户去修改id为2的用户。这个时候应该返回给这个人一个错误页面,那么该怎么做呢?

首先,用以下命令来生成一个名为UserPolicy的策略类文件,用于管理用户模型的授权。

$ php artisan make:policy UserPolicy

会在app目录下面生成一个policy的策略文件夹,所有的策略都在这个目录下。
接下来,我们为默认生成的用户策略添加update方法,用于用户更新的权限验证。
app/Policies/UserPolicy.php

namspace App\Policies;
use Illuminate\Auth\Access\HandlesAuthorization;
use App\Models\User;

class UserPolicy
{
    use HandlesAuthorization;
    public function update(User $currentUser, User $user) {
        return $currentUser->id === $user->id
    }
}

update方法接收两个参数,第一个是当前的登录用户实例,第二个是需要修改的用户实例,如果两个id相等,就说明可以更改。
接下来,就要在AuthServiceProvider类中进行授权策略设置。我们需要把用户模型User指向授权策略UserPolicy
app/Providers/AuthServiceProvider.php

<?php

namespace App\Providers;
.
,
.
class AuthServiceProvider extends ServiceProvider
{
    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [
        'App\Model' => 'App\Policies\ModelPolicy',
        \App\Models\User::class  => \App\Policies\UserPolicy::class,
    ];
    .
    .
    .
}

策略定义完了,就可以通过控制器里使用authorize的方法来验证用户授权策略,这个方法是来自app\Http\Controllers\Controller里的AuthorizesRequeststrait。次trait提供了authorize方法,此方法接收两个参数,第一个是授权策略方法的名称,第二个为进行授权验证的数据。
所以我们要在edit或者是update方法里加上这个方法

$this->authorize('update', $user);

这里 update 是指授权类里的 update 授权方法,$user 对应传参 update 授权方法的第二个参数。正如上面定义 update 授权方法时候提起的,调用时,默认情况下,我们 不需要 传递第一个参数,也就是当前登录用户至该方法内,因为框架会自动加载当前登录用户。

写法如下:

<?php

namespace App\Http\Controllers;
.
.
.
class UsersController extends Controller
{
    .
    .
    .
    public function edit(User $user)
    {
        $this->authorize('update', $user);
        return view('users.edit', compact('user'));
    }

    public function update(User $user, Request $request)
    {
        $this->validate($request, [
            'name' => 'required|max:50',
            'password' => 'nullable|confirmed|min:6'
        ]);

        $this->authorize('update', $user);

        $data = [];
        $data['name'] = $request->name;
        if ($request->password) {
            $data['password'] = bcrypt($request->password);
        }
        $user->update($data);

        session()->flash('success', '个人资料更新成功!');

        return redirect()->route('users.show', $user->id);
    }
}

这样以来,id为1的用户如果访问id为2的用户的话,那么会给你一个错误页面。
.
.
.