虽然我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
小知识点:
- 如果是模版文件里需要有默认值的地方,如上面的title,那么可以在
yield里穿两个参数,第一个是名字,第二个是默认值。如果用了两个参数,那么继承模版用@section的时候可以不需要结束符。 @section的结尾可以用@stop结束。
验证
- 在修改用户密码并且可以修改个人资料的时候,有的时候只想修改一下资料,并不想修改密码,如图所示:
这个时候,后台的密码验证就需要做出一些改变,而不是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指的就是如果为空也能验证通过。所以下面需要进行判断是否密码有值,有就修改,没有就跳过,仅仅修改个人资料了。
个人权限
在个人中心页面相关的板块,需要处理一些个人的权限问题。比如,没有登录,不能进入到个人中心页面,而是跳到登录页面。还有,你不能去修改别人的个人修改资料页面,和一些逻辑操作。下面就以最规范的操作处理一下这个问题。
-
没登陆。限制进入个人中心相关页面
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以外的方法,全部得登录了,才能进行访 问。
-
限制已登录用户修改他人信息
还有可能有这么一种情况发生,就是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的用户的话,那么会给你一个错误页面。
.
.
.