PHP code example of veasin / ff-web

1. Go to this page and download the library: Download veasin/ff-web library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

veasin / ff-web example snippets


use function ff\web\{user};

user();                              // 从默认 storage 读取当前用户
user($userData);                     // 记录用户到默认 storage,返回 token
user(true);                          // 检测默认 storage 是否有凭证
user(false);                         // 销毁默认 storage 的凭证
user($userData, 'session');          // 指定 storage 写入
user(null, 'jwt');                   // 从 jwt storage 读取

// 默认 storage:基于 session
container('#user.default', user\session());

// 自定义 storage:基于 token
container('#user.token', user\token(
    fn(string $token): ?array => lookupUserByToken($token)
));

// 自定义 storage:基于 JWT
container('#user.jwt', user\jwt('your-secret-key', ttl: 3600));

use function ff\web\user\session;

container('#user.default', user\session());

use function ff\web\user\token;

// Redis 后端
container('#user.default', user\token(
    fn(string $op, string $key, ...$a) => match($op){
        'get' => redis($key),
        'set' => redis($key, $a[0], $a[1] ?? 86400),
        'del' => redis($key, null),
    },
));

use function ff\web\user\jwt;

container('#user.default', user\jwt('my-secret-key'));
container('#user.default', user\jwt('my-secret-key', ttl: 3600, algo: 'HS256'));

use function ff\web\middleware\{cors, serve, json};
use function ff\web\middleware\auth\{basic, token, jwt, apikey};
use function ff\web\middleware\{csrf, error, gzip, log as mw_log, rate};

middleware(cors(), basic(), log(), $handler);

use function ff\web\middleware\auth\basic;
container('#web/auth/validators', [fn($user, $pass) => $user]);//设置验证器
middleware(basic(), $handler);//使用中间件
container('#web/auth/user');//获取认证用户

use function ff\web\middleware\auth\token;
container('#web/auth/validators', [fn($token) => $user]);//设置验证器
middleware(token(), $handler);//使用中间件,从 Authorization 头提取
middleware(token('#web/auth', 'X-Auth-Token'), $handler);//自定义请求头

use function ff\web\middleware\auth\jwt;
container('#web/auth/secret', 'your-secret-key');//设置 HMAC 签名密钥
container('#web/auth/validators', [fn($payload) => $user]);//设置验证器
middleware(jwt(), $handler);//使用中间件
container('#web/auth/payload');//获取解码后的 JWT payload
container('#web/auth/user');//获取认证用户

use function ff\web\middleware\auth\apikey;
container('#web/auth/validators', [fn($apiKey) => $user]);//设置验证器
middleware(apikey(), $handler);//使用中间件

middleware(cors(), $handler);//基础使用
middleware(cors(['origin' => 'https://example.com']), $handler);//自定义配置

middleware(csrf(), $handler);//生成 token
middleware(csrf(verify: true), $handler);//验证 token

middleware(error(), $handler);                                            // 默认 500,状态描述为空
middleware(error([\InvalidArgumentException::class => 400]), $handler);   // int:仅状态码,状态描述为空
middleware(error([\RuntimeException::class => [500, '#ff.error.msg']]), $handler);// [code, msg]:i18n(msg) 作为 HTTP 状态描述
middleware(error([\DomainException::class => [422, '{message}']]), $handler);// {message} 替换为 $e->getMessage()

container('#web/error/400', 'myapp.bad_request');
container('i18n.myapp.bad_request', ['错误的请求', 'en_US' => 'Bad request']);

middleware(gzip(), $handler);//默认压缩级别 6
middleware(gzip(9), $handler);//最高压缩级别

middleware(json(), $handler);//默认输出
middleware(json(pretty: true), $handler);//格式化输出

middleware(log(), $handler);//默认 info 级别
middleware(log('warning'), $handler);//自定义级别

middleware(rate(), $handler);//60次/分钟
middleware(rate(100, 60), $handler);//100次/分钟
middleware(rate(30, 60, 'api'), $handler);//自定义 key 前缀

container('#web/rate/storage', fn($key) => [...]);//读取
container('#web/rate/storage', fn($key, $value, $ttl) => 1);//写入

middleware(serve('/var/www/public'), $handler);//基础使用(无缓存头)
middleware(serve('/var/www/public', false), $handler);//强制不缓存
middleware(serve('/var/www/public', 31536000), $handler);//自定义 max-age
middleware(serve('/var/www/public', 'etag'), $handler);//ETag 条件缓存
middleware(serve('/var/www/public', 'modified'), $handler);//Last-Modified 条件缓存
middleware(serve('/var/www/public', ['control' => 'etag,modified', 'age' => 86400]), $handler);//组合策略

container('#web/static/mimes', ['webp' => 'image/webp']);//扩展 MIME 类型
container('#web/static/cache', 86400);//全局默认缓存 1 天