jmouriz / mof
框架外Mockup
Requires
- php: ^5.3.3 || ^7.0
This package is not auto-updated.
Last update: 2024-09-29 02:49:44 UTC
README
MOF代表Mockup Outside Framework(框架外Mockup),是一个小型PHP文件(约12Kb),用于在制作原型阶段包含到项目中。它包含一些基本功能,对以下方面非常有用:
- 加密和比较加密密码(password)。
- 在文件中写入和读取复杂的数据结构(store/restore)。
- 指定文件保存的路径(storage)。
- 登录和注销(login/logout)。
- 验证用户是否已登录(logged)。
- 保护受限访问的页面(protect)。
- 读取用户通过GET、POST或php://input提供的输入数据(input)。
- 以HTML内容响应请求(html)。
- 以CSS样式响应请求(css)。
- 以JSON格式响应请求(json)。
- 响应客户请求的任何类型的内容,例如XML(response)。
- 指定一个备用内容读取文件(read)。
- 重定向(redirect)。
- 在日志记录中写入带有日期和时间的消息和结构化数据(log)。
- 指定日志记录保存的路径(logs)。
- 将文件上传到服务器(upload)。
- 告诉浏览器不要使用缓存(volatile)。
- 生成可变长度的唯一密码(id)。
- 验证一个字符串是否以、结束或包含另一个字符串(starts/ends/contains)。
MOF包含一系列最小有用的玩具函数,特别是用于创建新功能草图而不处理数据库、模型和SQL语句,并忘记会话。可以在框架内或框架外使用,尽管框架外是指它使用持久化数据结构而不是数据库。它优先选择简单的程序功能,为程序员提供制作有用的草图代码,以构建控制器原型或响应门户请求。特别是对于在会话之间保持变量持久性非常有用,例如配置、会话或cookie。
函数
id()
生成一个6位数字的密码。
id($size)
生成一个$size位数字的密码。
starts($string, $needle)
如果字符串$string以$needle开头,则返回true,否则返回false。类似于JavaScript的startsWith。
ends($string, $needle)
如果字符串$string以$needle结尾,则返回true,否则返回false。类似于JavaScript的endsWith。
contains($string, $needle)
如果字符串$string包含$needle,则返回true,否则返回false。
password($password)
给定明文密码$password,返回加密后的密码。
password($password, $hash)
给定密码$password及其加密版本$hash(已存储),比较它们并返回它们是否相等或返回false。
libraries()
将mof.php的位置设置为查找库的位置,以帮助PHP的自动加载功能。
libraries($path)
与libraries()相同,但将搜索路径设置为$path。
filename($backtrace)
内部使用函数,由 store 和 restore 使用,用于根据变量名确定文件名,请尽量不使用。
storage($path)
在 $path 中指定保存持久化数据文件的路径。
storage()
指定持久化数据文件保存到 mof.php 文件所在的路径。
store($variable)
将 $variable 中定义的结构保存到同名文件中,并进行压缩。例如,store($users) 将 $users 保存到 storage/users.dbz 文件中。
restore($variable)
从同名文件中恢复 $variable 的结构或如果文件不存在则返回空数组。例如,restore($users) 读取 storage/users.dbz 文件并将其保存到变量 $users 中。
read($filename)
如果存在,读取并返回 $filename 文件的 内容,否则返回 false。
read($filename, $fallback)
与 read($filename) 相同,如果文件不存在则返回 $fallback。
upload()
将新上传的文件放在当前目录下的 upload 文件夹中,根据 $_FILES 提供的数据,以 0640 模式。
upload($path)
与 upload() 相同,除了文件被放置在 $path/upload 中。
upload($path, $filename)
与 upload() 相同,除了文件被放置在 $path/upload 中,并以 $filename 为名。
upload($path, $filename, $mode)
与 upload() 相同,除了文件被放置在 $path/upload 中,并以 $filename 为名,同时以 $mode 模式。
volatile()
写入必要的头信息,请求浏览器不要使用缓存。
input($variable)
获取 $variable 的值,无论其定义在 GET、POST 还是 php://input 中。如果不在这三个中,则返回 false。
input($variable, $default)
与 input($variable) 相同,除非未在 GET、POST 或 php://input 中定义,否则返回 $default。
session()
返回现有会话的标识符,如果不存在则创建一个新的会话并返回其标识符。
protect()
检查用户是否已启动会话。如果没有,立即终止流程。
protect($location)
与 protect() 相同,除非没有启动会话,则重定向到 $location。
logged()
返回启动会话的用户或如果未启动任何用户,则返回 false。
logged($default)
与 logged() 相同,除非未启动任何用户,则返回 $default。
login($user)
为 $user 启动会话,$user 可以是用户名、唯一标识符、电子邮件地址或任何可以识别用户的资料。
login($user, true)
与 login($user) 相同,除了还会保存一个 cookie 以供未来使用。这对于保持持久会话非常有用。
logout()
关闭会话。
logout($location)
与 logout() 相同,除了还会重定向到 $location。
response($data)
写入带有相应头信息的 HTML 响应 $data 并立即退出。
response($data, $type)
与 response($data) 相同,除了写入 $type 类型的头信息,例如 text/xml。
json($data)
以带有相应头信息的 JSON 格式写入 $data 并立即退出。
json($data, true)
与 json($data) 相同,除了格式化输出。
css($css)
写入通过 $css 传递的 CSS 样式,并带有相应的头信息。
html($html)
将传递的HTML内容 $html 编写为相应的标题。与 response($data) 类似。
redirect($location)
重定向到 $location。
debug($data)
以适当的形式写入 $data 以在浏览器中显示。
debug($data, true)
与 debug($data) 相同,除了它还会立即终止流。
logs($path)
在 $path 中指定保存成功日志文件的路径。
logs()
指定成功日志文件将保存在 mof.php 所在的路径。
log($message)
将 $message 写入 logs/mof.log 文件。如果 $message 是一个变量,则写入其格式化内容。
示例
启动会话
<?php require 'mof.php'; $email = mof\input('email'); // obtener el usuario $password = mof\input('password'); // obtener la contraseña mof\restore($users); // leer la estructura de datos $users if (array_key_exists($email, $users)) { if (mof\password($password, $users[$email]['password'])) { // comparar contraseñas cifradas mof\login($email); // iniciar la sesión mof\json(array('status' => 'authorized')); // contestar el pedido } else { mof\json(array('status' => 'invalid-password')); // contestar el pedido } } else { mof\json(array('status' => 'unknown-email')); // contestar el pedido } ?>
关闭会话
<?php require 'mof.php'; mof\logout('goodbye.php'); // cerrar la sesión ?>
注册用户
<?php require 'mof.php'; $email = mof\input('email'); // obtener el usuario $password = mof\input('password'); // obtener la contraseña mof\restore($users); // leer la estructura de datos $users if ($email && $password) { if (array_key_exists($email, $users)) { mof\json(array('status' => 'already-exists')); // contestar el pedido } else { $users[$email] = array(); // crear el usuario $users[$email]['password'] = mof\password($password); // cifrar contraseña nueva $users[$email]['firstname'] = mof\input('firstname'); // obtener el nombre $users[$email]['lastname'] = mof\input('lastname'); // obtener el apellido $users[$email]['phone'] = mof\input('phone'); // obtener el teléfono mof\store($users); // guardar la estructura de datos $users mof\json(array('status' => 'ok')); // contestar el pedido } } ?>
编辑用户数据
<?php require 'mof.php'; mof\protect(); // esta página es privada $email = mof\input('email'); // obtener el usuario mof\restore($users); // leer la estructura de datos $users $users[$email]['name'] = mof\input('name'); // obtener el nombre $users[$email]['phone'] = mof\input('phone'); // obtener el teléfono $users[$email]['city'] = mof\input('city'); // obtener la ciudad mof\store($users); // guardar la estructura de datos $users mof\json(array('status' => 'ok')); // contestar el pedido ?>
更改密码
<?php require 'mof.php'; mof\protect(); // esta página es privada $email = mof\input('email'); // obtener el usuario $current = mof\input('current'); // obtener la contraseña actual $password = mof\input('new'); // obtener la contraseña nueva mof\restore($users); // leer la estructura de datos $users if (mof\password($current, $users[$email]['password'])) { // comparar contraseñas cifradas $users[$email]['password'] = mof\password($password); // cifrar contraseña nueva mof\store($users); // guardar la estructura de datos $users mof\json(array('status' => 'ok')); // contestar el pedido } else { mof\json(array('status' => 'invalid-password')); // contestar el pedido } ?>
CLI 列出用户
<?php require 'mof.php'; mof\restore($users); // leer la estructura de datos $users print_r($users); ?>
输出
Array
(
[jperez] => Array
(
[name] => Juan Perez
[password] => $2y$07$9025d1288eec924ee57fduU.wbLcxioeQBq32BWtNVm2BLIdhVT/6
)
)
一个带有登录保护的微型网站完整示例
注意 此处展示的代码位于
demo目录中,为了使其工作,目录log和storage必须对www-data组具有写入权限(这可能会根据服务器而异)。建议您在开始之前使用命令setfacl -m g:www-data:rwX -R mof授予这些权限。
register.php
<?php require 'mof.php'; $username = mof\input('username'); $password = mof\input('password'); $exists = false; mof\restore($users); if ($username && $password) { if (array_key_exists($username, $users)) { $exists = true; } else { $users[$username] = array(); $users[$username]['password'] = mof\password($password); $users[$username]['firstname'] = mof\input('firstname'); $users[$username]['lastname'] = mof\input('lastname'); $users[$username]['phone'] = mof\input('phone'); mof\store($users); mof\redirect('login.php?registered=1'); } } ?> <!doctype html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="initial-scale=1"> <title>Registro</title> </head> <body> <h1>Registro</h1> <?php if ($username || $password): ?> <p style="color:red">Faltan datos</p> <?php endif ?> <?php if ($exists): ?> <p style="color:red">El usuario ya existe, por favor, elige otro nombre</p> <?php endif ?> <form method="post" action="register.php"> <input name="username" placeholder="Usuario"> <br> <input name="password" placeholder="Contraseña" type="password"> <br> <input name="firstname" placeholder="Nombre"> <br> <input name="lastname" placeholder="Apellido"> <br> <input name="phone" placeholder="Teléfono"> <br> <button type="reset">Restablecer</button> <button type="submit">Enviar</button> </form> </body> </html>
login.php
<?php require 'mof.php'; $username = mof\input('username'); $password = mof\input('password'); $remember = mof\input('remember'); $registered = mof\input('registered'); mof\restore($users); if (array_key_exists($username, $users)) { if (mof\password($password, $users[$username]['password'])) { mof\login($username, $remember); mof\redirect('index.php'); } } ?> <!doctype html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="initial-scale=1"> <title>Ingresar</title> </head> <body> <h1>Ingresar</h1> <?php if ($username): ?> <p style="color:red">No autorizado</p> <?php endif ?> <?php if ($registered): ?> <p>Creaste una cuenta, ya puedes utilizarla para ingresar</p> <?php else: ?> <p>¿Aún no tienes cuenta? <a href="register.php">Crea una nueva</a></p> <?php endif ?> <form method="post" action="login.php"> <input name="username" placeholder="Usuario"> <br> <input name="password" placeholder="Contraseña" type="password"> <br> <input name="remember" type="checkbox"> Recordar sesión <br> <button type="reset">Restablecer</button> <button type="submit">Enviar</button> </form> </body> </html>
logout.php
<?php require 'mof.php'; logout('login.php'); ?>
index.php
<?php require 'mof.php'; mof\protect('login.php'); mof\restore($users); ?> <!doctype html> <html lang="es"> <head> <meta charset="utf-8"> <meta name="viewport" content="initial-scale=1"> <title>Bienvenido</title> </head> <body> <h1>Bienvenido <?php echo $users[mof\logged()]['name']; ?></h1> </body> </html>