jmouriz/mof

框架外Mockup

1.3.2 2018-02-15 20:20 UTC

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)

内部使用函数,由 storerestore 使用,用于根据变量名确定文件名,请尽量不使用。

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 目录中,为了使其工作,目录 logstorage 必须对 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>