美文网首页
Laravel学习日记2018-07-02

Laravel学习日记2018-07-02

作者: Purson | 来源:发表于2018-07-02 22:54 被阅读0次

延误

第八章延误了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()  !!}

批量生成假数据

假数据的生成分为两个阶段:

  1. 对要生成假数据的模型指定字段进行赋值 - 『模型工厂』
$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,
    ];
});
  1. 批量生成假数据模型 - 『数据填充』
    在 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();
    }

timesmake 方法是由 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

相关文章

网友评论

      本文标题:Laravel学习日记2018-07-02

      本文链接:https://www.haomeiwen.com/subject/kjhruftx.html