8.5 列出所有用户

本节与下一节联动,通过添加管理员权限然后对所有用户进行查看,删除等操作。

列出用户

非常简单的,我们只需要在控制器里使用模型返回所有值即可。 application\user\controller\Auth.php

public function index()
{
return User::all();
}

打开浏览器访问 http://thinkphp.test/user/auth/index ,却直接跳转到“非法操作”的提示,原因在于我们上一节创建用户一致性策略时,判断了传入 idsession id 的一致性,可是在 index 控制器内,我们并没有传入 id,那么则会返回 falseapplication\behavior\UserPolicy.php

public function run($params)
{
$user_id = Session::get('user.id');
if (!is_null($params)) {
// 存在传入 ID $params
return
(int) $user_id === (int) $params
? true
: false;
} elseif (is_null($user_id)) {
// 用户未登录
return false;
} else {
/**
* 不存在传入 ID 但是用户已登录
* 效果等同于 if(is_null($params) && !is_null($user_id))
*/
return true;
}
}

再访问 http://thinkphp.test/user/auth/index ,即可看到从数据库拿到的 JSON 数据。

创建 Web 页面

resources\views\user\auth\index.blade.php

@extends('_layout.default')
@section('title', '查看所有用户')
@section('content')
<div class="offset-md-2 col-md-8">
<h2 class="mb-4 text-center">所有用户</h2>
<div class="list-group list-group-flush">
@foreach ($users as $user)
<div class="list-group-item">
<a href="{{ url('user/auth/read', ['id' => $user->id]) }}">
{{ $user->name }}
</a>
</div>
@endforeach
</div>
</div>
@stop

控制器中传入 users 数据 application\user\controller\Auth.php

public function index()
{
$this->assign([
'users' => User::all()
]);
return $this->fetch();
}

访问 http://thinkphp.test/user/auth/index 即可看到刚刚创建好的 Web 页面。 用户页面中,我们可以看到只有仅仅的几条手动创建的数据,数据太少不利于接下来进行删除操作的测试,所以我们添加一个“批量生成用户”的功能。

假数据填充

我们现在去创建一个 Users 的数据填充。 1. 键入命令 php think seed:create Users 2. 提示 Create seeds directory? [y]/n (yes/no) [yes]: 3. 键入 y 并回车 4. 提示创建成功 created .\database\seeds\Users.php

打开刚刚创建好的填充文件 database\seeds\Users.php

<?php
use think\migration\Seeder;
class Users extends Seeder
{
/**
* Run Method.
*
* Write your database seeder using this method.
*
* More information on writing seeders is available here:
* http://docs.phinx.org/en/latest/seeding.html
*/
public function run()
{
$faker = Faker\Factory::create();
$data = [];
for ($i = 0; $i < 200; $i++) {
$data[] = [
'name' => $faker->userName,
'password' => $faker->password,
'email' => $faker->email,
];
}
$this->table('users')->insert($data)->save();
}
}

以上方法中,我们使用了 Faker\Factory 方法,但是现在项目还未安装此包,我们现在在命令行中键入

# 由于 Laravel-China 维护的公共镜像过期,之前在 2.3开发环境搭建 这一节使用的镜像地址请更换为 阿里云镜像。键入命令
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
composer require fzaninotto/faker

等待 faker 包安装安装完成之后,运行数据填充命令 php think seed:run 再次访问 http://thinkphp.test/user/auth/index 则会看到刚刚生成好的假数据。

分页

打开控制器 application\user\controller\Auth.php

public function index()
{
$this->assign([
'users' => User::paginate(10)
]);
return $this->fetch();
}

paginate 为分页方法,参数 10 表示每页提取 10 个。

再打开模板 resources\views\user\auth\index.blade.php

@extends('_layout.default')
@section('title', '查看所有用户')
@section('content')
<div class="offset-md-2 col-md-8">
<h2 class="mb-4 text-center">
所有用户
</h2>
<div class="list-group list-group-flush">
@foreach ($users as $user)
<div class="list-group-item">
<a href="{{ url('user/auth/read', ['id' => $user->id]) }}">
{{ $user->name }}
</a>
</div>
@endforeach
</div>
<div class="mt-3">
{!! $users !!}
</div>
</div>
@stop

可以看到,我们在之前的基础上添加了个 {!! $users !!},要说明的是,{!! !!} 代表不通过安全过滤直接输出。 如果我们换成 ,则会输出已经过滤好的 HTML 代码 <ul class="pagination"><li class="disabled"><sp...

现在刷新页面,可以看到已经能够输出分页。可是每次都要通过手动输入链接才能够看到所有用户,这样用户体验不好,现在添加一个所有用户按钮。 resources\views\_layout\header.blade.php

...
<li class="nav-item">
<a class="nav-link" href="{{ url('welcome/index/help') }}">帮助</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{{ url('welcome/index/about') }}">关于</a>
</li>
+++
<li class="nav-item">
<a class="nav-link" href="{{ url('user/auth/index') }}">所有用户</a>
</li>
+++
...

现在刷新页面,顶部栏的所有用户按钮就显示出来了,点击进去也就是本节所创建好的页面。