安装 webman

初始备注:
不要使用 php8.0 及以上版本(除非不用 think-cache 缓存插件)think-cache 无法友好的支持 php8.0 及以上版本。

目前使用 php7.4

composer 安装

1、创建项目

1
composer create-project workerman/webman

2、运行
进入 webman 目录
debug 方式运行(用于开发调试)

1
php start.php start

daemon 方式运行(用于正式环境)

1
php start.php start -d

注意
webman 从 1.2.3 版本开始专门为 windows 系统提供了启动脚本(需要为 php 配置好环境变量),windows 用户请双击 windows.bat 即可启动 webman,或者运行 php windows.php 启动 webman。

3、访问
浏览器访问 http://ip 地址:8787

基础功能

需要安装的 composer 扩展(默认以熟悉的 tp 为主)

安装 think-template

1、composer 安装

1
composer require topthink/think-template

2、修改配置 config/view.php 为

1
2
3
4
5
6
<?php
use support\view\ThinkPHP;

return [
'handler' => ThinkPHP::class,
];

提示
其它配置选项通过 options 传入,例如

1
2
3
4
5
6
7
8
return [
'handler' => ThinkPHP::class,
'options' => [
'view_suffix' => 'html',
'tpl_begin' => '{',
'tpl_end' => '}'
]
];

3、thinkphp 模板的例子
修改配置 config/view.php 为

1
2
3
4
5
6
<?php
use support\view\ThinkPHP;

return [
'handler' => ThinkPHP::class
];

app/controller/User.php 如下

1
2
3
4
5
6
7
8
9
10
11
12
<?php
namespace app\controller;

use support\Request;

class User
{
public function hello(Request $request)
{
return view('user/hello', ['name' => 'webman']);
}
}

文件 app/view/user/hello.html 如下

1
2
3
4
5
6
7
8
9
10
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>webman</title>
</head>
<body>
hello {$name}
</body>
</html>

更多文档参考 think-template

安装 ThinkORM

1
composer -W require webman/think-orm

经测试实际安装此扩展会报错,所以我们使用手动安装并配置 think-orm。
webman/think-orm 实际上是一个自动化安装 toptink/think-orm 的插件,如果你的 webman 版本低于 1.2 无法使用插件请参考文章手动安装并配置 think-orm

安装 ThinkCache

1
composer -W require webman/think-cache

webman/think-cache 实际上是一个自动化安装 toptink/think-cache 的插件。
暂对 php8.0 及以上不友好,安装后使用会报错。

配置文件

配置文件为 config/thinkcache.php

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
namespace app\controller;

use support\Request;
use think\facade\Cache;

class User
{
public function db(Request $request)
{
$key = 'test_key';
Cache::set($key, rand());
return response(Cache::get($key));
}
}

Think-Cache 使用文档

ThinkCache 文档地址

安装 redis 组件

webman 的 redis 组件默认使用的是illuminate/redis,也就是 laravel 的 redis 库,用法与 laravel 相同。
使用 illuminate/redis 之前必须先给 php-cli 安装 redis 扩展。

使用命令 php -m | grep redis 查看 php-cli 是否装了 redis 扩展。注意:即使你在 php-fpm 安装了 redis 扩展,不代表你在 php-cli 可以使用它,因为 php-cli 和 php-fpm 是不同的应用程序,可能使用的是不同的 php.ini 配置。使用命令 php –ini 来查看你的 php-cli 使用的是哪个 php.ini 配置文件。

安装

1
composer require -W illuminate/redis
1
2
3
4
5
6
7
8
9
10
11
## 配置
redis配置文件在`config/redis.php`
```php
return [
'default' => [
'host' => '127.0.0.1',
'password' => null,
'port' => 6379,
'database' => 0,
]
];

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
namespace app\controller;

use support\Request;
use support\Redis;

class User
{
public function db(Request $request)
{
$key = 'test_key';
Redis::set($key, rand());
return response(Redis::get($key));
}
}

具体使用教程:

https://www.workerman.net/doc/webman/db/redis.html

安装 think 验证器

安装

1
composer require topthink/think-validate

验证器也不支持 php8.0 及以上,如果需要支持需要自行查找更多方案。

基本用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
namespace app\index\validate;

use Tinywan\Validate\Validate;

class UserValidate extends Validate
{
protected $rule = [
'name' => 'require|max:25',
'age' => 'require|number|between:1,120',
'email' => 'require|email'
];

protected $message = [
'name.require' => '名称必须',
'name.max' => '名称最多不能超过25个字符',
'age.require' => '年龄必须是数字',
'age.number' => '年龄必须是数字',
'age.between' => '年龄只能在1-120之间',
'email.require' => '邮箱必须是数字',
'email.email' => '邮箱格式错误'
];
}

验证器调用代码如下:

1
2
3
4
5
6
7
8
9
10
$data = [
'name' => 'Tinywan',
'age' => 24,
'email' => 'Tinywan@163.com'
];
$validate = new \app\index\validate\UserValidate;

if (!$validate->check($data)) {
var_dump($validate->getError());
}

更多用法可以参考 6.0 完全开发手册的验证章节

安装验证码

gregwar/captcha

项目地址 https://github.com/Gregwar/Captcha

安装

1
composer require gregwar/captcha 1.*

基本使用 1

建立文件 app/controller/Login.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?php
namespace app\controller;

use support\Request;
use Gregwar\Captcha\CaptchaBuilder;

class Login
{
/**
* 测试页面
*/
public function index(Request $request)
{
return view('login/index');
}

/**
* 输出验证码图像
*/
public function captcha(Request $request)
{
// 初始化验证码类
$builder = new CaptchaBuilder;
// 生成验证码
$builder->build();
// 将验证码的值存储到session中
$request->session()->set('captcha', strtolower($builder->getPhrase()));
// 获得验证码图片二进制数据
$img_content = $builder->get();
// 输出验证码二进制数据
return response($img_content, 200, ['Content-Type' => 'image/jpeg']);
}

/**
* 检查验证码
*/
public function check(Request $request)
{
// 获取post请求中的captcha字段
$captcha = $request->post('captcha');
// 对比session中的captcha值
if (strtolower($captcha) !== $request->session()->get('captcha')) {
return json(['code' => 400, 'msg' => '输入的验证码不正确']);
}
return json(['code' => 0, 'msg' => 'ok']);
}

}

建立模版文件 app/view/login/index.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>验证码测试</title>
</head>
<body>
<form method="post" action="/login/check">
<img src="/login/captcha" /><br />
<input type="text" name="captcha" />
<input type="submit" value="提交" />
</form>
</body>
</html>

基本使用 2 (直接在控制器里使用并验证)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

$this->validate = new \think\Validate();
$param = $request->all();

$this->validate->rule([
'captcha|验证码' => 'require',
'uniqid|uniqid' => 'require',
'username|用户名' => 'require',
'password|密码' => 'require',
]);
$this->validate->message([
'captcha.require' => '验证码不能为空',
'uniqid.require' => 'uniqid不能为空',
'username.require' => '登录名不能为空',
'password.require' => '密码不能为空',
]);
if ( ! $this->validate->check($param)) {
return json($this->validate->getError());
}

webman/casbin 权限控制插件

简介

webman casbin 权限控制插件。它基于 PHP-Casbin, 一个强大的、高效的开源访问控制框架,支持基于 ACL, RBAC, ABAC 等访问控制模型。

依赖

安装

1
composer require casbin/webman-permission

使用

  1. 依赖注入配置
    修改配置 config/container.php,其最终内容如下:
1
2
3
4
$builder = new \DI\ContainerBuilder();
$builder->addDefinitions(config('dependence', []));
$builder->useAutowiring(true);
return $builder->build();
  1. 数据库配置

    默认策略存储是使用的 ThinkORM。 如使用 laravel 的数据库 illuminate/database,请按照官方文档按照相应的依赖包:https://www.workerman.net/doc/webman/db/tutorial.html

🚀 (1) 模型配置
📒📒📒 使用 ThinkORM(默认) 📒📒📒

修改数据库 thinkorm.php 配置
📕📕📕 使用 laravel 数据库(可选) 📕📕📕

修改数据库 database.php 配置
修改数据库 permission.php 的 adapter 适配器为 laravel 适配器

(2) 创建 casbin_rule 数据表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE TABLE `casbin_rule` (
`id` BIGINT ( 20 ) UNSIGNED NOT NULL AUTO_INCREMENT,
`ptype` VARCHAR ( 128 ) NOT NULL DEFAULT '',
`v0` VARCHAR ( 128 ) NOT NULL DEFAULT '',
`v1` VARCHAR ( 128 ) NOT NULL DEFAULT '',
`v2` VARCHAR ( 128 ) NOT NULL DEFAULT '',
`v3` VARCHAR ( 128 ) NOT NULL DEFAULT '',
`v4` VARCHAR ( 128 ) NOT NULL DEFAULT '',
`v5` VARCHAR ( 128 ) NOT NULL DEFAULT '',
PRIMARY KEY ( `id` ) USING BTREE,
KEY `idx_ptype` ( `ptype` ) USING BTREE,
KEY `idx_v0` ( `v0` ) USING BTREE,
KEY `idx_v1` ( `v1` ) USING BTREE,
KEY `idx_v2` ( `v2` ) USING BTREE,
KEY `idx_v3` ( `v3` ) USING BTREE,
KEY `idx_v4` ( `v4` ) USING BTREE,
KEY `idx_v5` ( `v5` ) USING BTREE
) ENGINE = INNODB CHARSET = utf8mb4 COMMENT = '策略规则表';

(3) 配置 config/redis 配置
重启 webman

1
php start.php restart

或者

1
php start.php restart -d

用法

安装成功后,可以这样使用:

1
2
3
4
5
6
7
8
use Tinywan\Casbin\Permission;

// adds permissions to a user
Permission::addPermissionForUser('eve', 'articles', 'read');
// adds a role for a user.
Permission::addRoleForUser('eve', 'writer');
// adds permissions to a rule
Permission::addPolicy('writer', 'articles','edit');

你可以检查一个用户是否拥有某个权限:

1
2
3
4
5
if (Permission::enforce("eve", "articles", "edit")) {
echo '恭喜你!通过权限认证';
} else {
echo '对不起,您没有该资源访问权限';
}

具体教程:

https://github.com/php-casbin/webman-permission
更多 API 参考 Casbin API

路由自动解析

当 app 目录结构非常复杂,webman 无法自动解析时可以安装 webman 的自动路由插件,它会自动检索所有的控制器并为其自动配置对应的路由,让其通过 url 可以访问。

安装

1
composer require webman/auto-route

提示
你仍然可以在 config/route.php 中手动设置某些路由,自动路由插件会优先使用 config/route.php 里的配置。