延误
第八章延误了3天学习,因为工作的原因,家庭的原因,每天都很累回家,完全没有注意力学习。有一种愧疚感,今天终于把第八章啃完了。为什么是啃,因为这章比前面的章节涉及的知识量级是不同的。我觉得第八章可以再细分两章,第一章是用户的用户的权限设置,第二张是数据的填充和处理。
复盘
登录
laravel是一个全面的框架,考虑得非常细致,我之前自己构建的权限实在太麻烦了,特别是权限和界面之间的联系,让我非常苦恼。但是在Laravel里面,权限和界面的控制结合和分配的非常巧妙。
1.首先在登录页面跳转到SessionController中的store,在store中验证字段
$credentials = $this->validate($request,[
'email' => 'required|email|max:255',
'password'=>'required'
])
字段验证错误会自动记录错误信息,在登录界面的错误message位置显示。
2.强大的Auth::attempt() 完成身份认证(认证过后默认记录2小时)。
if(Auth::attempt(['email' => $email, 'password' => $password])) {
//用户存在数据库切密码相同
}
attempt代码执行逻辑:
(1)使用email在数据库理查找;
(2)如果用户被找到:
- 将password使用哈希加密后与数据库匹配;
- 如果两个密码一致,则创建一个session给通过认证的用户,同时让浏览器记录一个laravel_session 的cookie,记录登录状态,最后返回true
- 密码不匹配返回false
(3)如果用户未找到,则返回false
然后是blade模版使用
@if {{ Auth::user()->name }}
//显示用户列表 和 个人信息
@else
//就显示登录
权限系统
权限系统,这里就是指用户和管理员的权限的管理,laravel权限系统包括 Middleware、Policy、ServiceProviders、controller中的authorize 几个部分的相互作用。
- Middleware 相当于一个过滤器,过滤HTTP请求。例如使用auth中间件验证用户身份,如果用户未登录,中间件就会把http所有请求重定向到登录页面。except 方法来设定 指定动作 不使用 Auth 中间件进行过滤,相反的还有 only 白名单方法,将只过滤指定动作。Laravel 提供的 Auth 中间件在过滤指定动作时,如该用户未通过身份验证(未登录用户),默认将会被重定向到 /login 登录页面。
- Policy 授权策略对用户的操作权限进行验证,在用户未经授权进行操作时将返回 403 禁止访问的异常。这是对model操作进行限制的策略,所以还要用provider将policy 关联model 。
使用方法:
1.创建策略
php artisan make:policy UserPolicy
2.应用模型
use App\Models\User;
3.编写策略
use HandlesAuthorization;
public function update(User $currentUser, User $user) //这里方法名就是策略的名称,在后面调用的时候authorize需要的第一个参数。
{
return $currentUser->id === $user->id;
}
使用授权策略需要注意以下两点:
1)我们并不需要检查 $currentUser 是不是 NULL。未登录用户,框架会自动为其 所有权限 返回 false;
2)调用时,默认情况下,我们 不需要 传递当前登录用户至该方法内,因为框架会自动加载当前登录用户(接着看下去,后面有例子);
- ServiceProviders 服务供应者,我初步理解这里用于关联模型和对应的策略。关联的方法需要在AuthServiceProvider 的 policies属性中写入。
protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy',
\App\Models\User::class => \App\Policies\UserPolicy::class,
];
授权策略关联之后,我们可以在控制器中使用authorize方法来验证策略。authorize是Controller中AuthorizesRequests中的trait,这里接受两个参数,第一个是策略,第二个是进行验证的数据。
$this->authorize('update', $user);
Otherwise,在前端可以使用@can判断策略
@can ('destroy',$user)
@endcan
分页
Laravel实现分页相当简单,直接使用User::paginate(10)就可以了,这里参数10是每页10条数据。
public function index()
{
$users = User::paginate(10);
return view('users.index', compact('users'));
}
分页前端也超级简单:
{!! $users->render() !!}
批量生成假数据
假数据的生成分为两个阶段:
- 对要生成假数据的模型指定字段进行赋值 - 『模型工厂』;
$factory->define(App\Models\User::class, function (Faker $faker) {
$date_time = $faker->date . ' ' . $faker->time;
static $password;
return [
'name' => $faker->name,
'email' => $faker->safeEmail,
'password' => $password ?: $password = bcrypt('secret'),
'remember_token' => str_random(10),
'created_at' => $date_time,
'updated_at' => $date_time,
];
});
- 批量生成假数据模型 - 『数据填充』;
在 Laravel 中我们使用 Seeder 类来给数据库填充测试数据。所有的 Seeder 类文件都放在 database/seeds 目录下,文件名需要按照『驼峰式』来命名,且严格遵守大小写规范。Laravel 默认为我们定义了一个 DatabaseSeeder 类,我们可以在该类中使用 call 方法来运行其它的 Seeder 类,以此控制数据填充的顺序。我们可以使用下面命令来生成一个 UsersTableSeeder 文件,用于填充用户相关的假数据。
php artisan make:seeder UserTableSeeder
在我们定义好了用户模型工厂之后,便可以在生成的用户数据填充文件中使用 factory 这个辅助函数来生成一个使用假数据的用户对象。
database/seeds/UsersTableSeeder.php
public function run()
{
$users = factory(User::class)->times(50)->make();
User::insert($users->makeVisible(['password', 'remember_token'])->toArray());
$user = User::find(1);
$user->name = 'Aufree';
$user->email = 'aufree@yousails.com';
$user->password = bcrypt('password');
$user->save();
}
times
和 make
方法是由 FactoryBuilder 类 提供的 API。times
接受一个参数用于指定要创建的模型数量,make
方法调用后将为模型创建一个 集合。makeVisible
方法临时显示 User 模型里指定的隐藏属性 $hidden
,接着我们使用了 insert
方法来将生成假用户列表数据批量插入到数据库中。最后我们还对第一位用户的信息进行了更新,方便后面我们使用此账号登录。
接着我们还需要在 DatabaseSeeder
中调用 call
方法来指定我们要运行假数据填充的文件。
database/seeds/DatabaseSeeder.php
public function run()
{
Model::unguard();
$this->call(UsersTableSeeder::class);
Model::reguard();
}
完成上面操作之后,我们便可以开始为用户生成批量假数据了,在运行生成假数据的命令之前,我们需要使用 migrate:refresh 命令来重置数据库,之后再使用 db:seed 执行数据填充。
$ php artisan migrate:refresh
$ php artisan db:seed
如果我们要单独指定执行 UserTableSeeder 数据库填充文件,则可以这么做:
$ php artisan migrate:refresh
$ php artisan db:seed --class=UsersTableSeeder
你也可以使用下面一条命令来同时完成数据库的重置和填充操作:
$ php artisan migrate:refresh --seed
网友评论