转载自:https://www.xiaohuihui.net/posts/dc085173.html

安装 webman

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

目前使用 php7.4

composer 安装

1、创建项目

composer create-project workerman/webman

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

php start.php start

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

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 安装

composer require topthink/think-template

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

<?php
use support\view\ThinkPHP;

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

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

return [
    'handler' => ThinkPHP::class,
    'options' => [
        'view_suffix' => 'html',
        'tpl_begin' => '{',
        'tpl_end' => '}'
    ]
];

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

<?php
use support\view\ThinkPHP;

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

app/controller/User.php 如下

<?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 如下

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>webman</title>
</head>
<body>
hello {$name}
</body>
</html>

更多文档参考 think-template

安装 ThinkORM

composer -W require webman/think-orm

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

安装 ThinkCache

composer -W require webman/think-cache

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

配置文件

配置文件为 config/thinkcache.php

使用

<?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 配置文件。

安装

composer require -W illuminate/redis
## 配置
redis配置文件在`config/redis.php`

return [
    'default' => [
        'host'     => '127.0.0.1',
        'password' => null,
        'port'     => 6379,
        'database' => 0,
    ]
];

示例

<?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 验证器

安装

composer require topthink/think-validate

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

基本用法

<?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'        => '邮箱格式错误'
    ];
}

验证器调用代码如下:

$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

安装

composer require gregwar/captcha 1.*

基本使用 1

建立文件 app/controller/Login.php

<?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

<!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 (直接在控制器里使用并验证)

$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 等访问控制模型。

依赖

安装

composer require casbin/webman-permission

使用

  1. 依赖注入配置
    修改配置 config/container.php,其最终内容如下:
$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 数据表

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

php start.php restart

或者

php start.php restart -d

用法

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

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');

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

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

具体教程:

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

路由自动解析

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

安装

composer require webman/auto-route

常用依赖composer.json

{
  "name": "workerman/webman",
  "type": "project",
  "keywords": [
    "high performance",
    "http service"
  ],
  "homepage": "http://www.workerman.net",
  "license": "MIT",
  "description": "High performance HTTP Service Framework.",
  "authors": [
    {
      "name": "walkor",
      "email": "walkor@workerman.net",
      "homepage": "http://www.workerman.net",
      "role": "Developer"
    }
  ],
  "support": {
    "email": "walkor@workerman.net",
    "issues": "https://github.com/walkor/webman/issues",
    "forum": "http://wenda.workerman.net/",
    "wiki": "http://workerman.net/doc/webman",
    "source": "https://github.com/walkor/webman"
  },
  "require": {
    "php": ">=7.2",
    "workerman/webman-framework": "^1.3.14",
    "monolog/monolog": "^2.0", 
    "vlucas/phpdotenv": "^5.4",
    "workerman/mysql": "^1.0",
    "workerman/validation": "^3.0",
    "workerman/crontab": "^1.0",
    "webman/log": "^1.0",
    "webman/console": "^1.0",
    "psr/container": "v1",
    "illuminate/database": "^8.83",
    "illuminate/pagination": "^8.83",
    "illuminate/events": "^8.83",
    "ext-soap": "*",
    "ext-json": "*",
    "tinywan/exception-handler": "^0.1.0",
    "topthink/think-validate": "^2.0",
    "topthink/think-template": "^2.0",
    "topthink/think-orm": "^2.0",
    "topthink/think-cache": "^2.0"
  },
  "suggest": {
    "ext-event": "For better performance. "
  },
  "autoload": {
    "psr-4": {
      "": "./",
      "App\\": "./app"
    },
    "files": [
      "./support/helpers.php"
    ]
  },
  "scripts": {
    "post-package-install": [
      "support\\Plugin::install"
    ],
    "post-package-update": [
      "support\\Plugin::install"
    ],
    "pre-package-uninstall": [
      "support\\Plugin::uninstall"
    ]
  }
}