PHP 开发的基本类

v1.2.4 2023-10-07 15:49 UTC

README

这是一个收集了日常PHP生活中有用的类和函数的集合。它包括以下内容

  • 处理日期和时间及其各种表现形式
  • 对象数组的搜索和排序
  • 以不同级别记录到 error_log
  • 在会话中的多个请求之间通知用户
  • 从当前HTTP请求中提取信息
  • 混淆敏感信息以保护数据免受垃圾邮件机器人侵害
  • 将字符串slugify以供URL使用
  • 生成随机字符串
  • 格式化价格和单位
  • 简单的文本模板

这些类并不是什么高深的技术,只是简单的辅助函数,可以防止你一次又一次地编写相同代码的多种变体。

许可证

该项目采用 GNU LGPL 3.0 许可。

安装

通过 Composer

composer require technicalguru/utils

通过包下载

您可以从 GitHub 发布页面 下载源代码包。

请求类

请求类从当前HTTP请求中提取许多有用的信息。它提供

  • 头部信息
  • GET 和 POST 参数值,如果没有提供则分配默认值
  • 从HTTP请求中获取方法、协议、主机和路径信息
  • 检查请求的经过时间

您可以自己创建对象,但建议使用单例

$request = \TgUtils\Request::getRequest();

查看 源代码 了解可用的各种方法。

日期类

日期类处理本地化、时区和转换到不同格式或从各种格式创建的问题。以下是一些示例

use TgUtils\Date;

$timezone = 'Europe/Berlin';

// Creating instances with local timezone
$date = new Date(time(), $timezone);
$date = Date::createLocalInstance(time(), $timezone);
$date = Date::createFromMysql($mySqlTimestampString, $timezone);

// The Epoch time in seconds
$unixTimestamp = $date->toUnix();

// Converting and formatting with local timezone 
$mysqlTimstamp = $date->toMysql(TRUE);
$iso8601       = $date->toISO8601(TRUE);
$someString    = $date->format('d.m.Y H:i:s', TRUE);

// Converting to UTC timezones instances
$mysqlTimstamp = $date->toMysql();
$iso8601       = $date->toISO8601();
$someString    = $date->format('d.m.Y H:i:s');

查看 源代码 了解可用的各种方法。

日志记录

日志记录非常简单。设置您的日志级别(如果不是INFO),然后开始记录

use TgLog\Log;

// Set default settings before using the log:
Log::setDefaultLogLevel(Log::ERROR);
Log::setDefaultAppName('MyApplication');

// Or just on the singleton logging instance
Log::instance()->setLogLevel(Log::ERROR);
Log::instance()->setAppName('MyAppName');

// Simple line
Log::error('A simple error message');

// This message will not go into the log
Log::info('This message is lost.');

// Log an exception
Log::error('An expception was caught: ', $exception);

// Log an object for later debugging
Log::error('We have some problem here:', $object);

当您需要调试某事物时,日志也可能很有帮助

use TgLog\Log;

// Get the stacktrace
$stacktrace = Log::getStackTrace(__FILE__);

// Or log it with INFO level
Log::infoStackTrace(__FILE__);

使用 __FILE__ 参数可以阻止当前文件出现在堆栈跟踪中。您可以在没有此参数的情况下轻松使用该函数,以将当前文件包含在内

$stacktrace = Log::getStackTrace();
Log::infoStackTrace();

最后,您可以创建特定模块的特殊日志实例并从中记录,例如

$moduleLog = new Log(Log::ERROR, 'MyAppModule');

$moduleLog->logInfo('Module started');
$moduleLog->logError('Exception occurred:', $exception);

用户通知

有时很难显示成功或错误消息,因为消息需要在另一个脚本、另一个HTTP调用或甚至稍后显示。以下代码片段将记住会话中多个调用中的消息。

use TgLog\Log;
use TgLog\Success;

Log::register(new Success('Your data was saved successfully.));

注册不仅会记住消息,当它是 DebugErrorWarningInfo 实例时,还会将其打印到错误日志中。

在另一个调用或脚本中,您可以再次检索您的消息以显示

use TgLog\Log;
use TgLog\Success;

foreach (Log::get() AS $message) {
	switch ($message->getType()) {
	case 'success':
		echo '<div class="text-success">'.$message->getMessage().'</div>';
		break;
	case 'error':
		echo '<div class="text-danger">'.$message->getMessage().'</div>';
		break;
	}
}

// Finally, clean all messages
Log::clean();

身份验证助手

提供了一个简单的身份验证助手接口及其默认实现

敏感数据混淆

如今,发布电子邮件地址和电话号码等敏感数据是危险的,因为垃圾邮件发送者会自动从网站上抓取此类信息。utils包提供了一种基于javascript的方法来在网站上混淆此类信息。其想法基于rot13混淆方法,但使用随机字符映射而不是固定旋转。选择这个想法是因为rot13似乎是一种混淆标准,垃圾邮件发送者可能已经能够阅读它们。

需要注意的是,即使混淆了信息,仍然有可能读取信息。但这需要更多的复杂努力(javascript执行)来获取敏感信息。

想法:要混淆的文本将被逐个字符替换为映射中的其他字符。这个映射是为这个特殊的混淆实例唯一生成的。同一页上的其他混淆将使用不同的映射。HTML源仅显示:[javascript protected]。然而,在页面加载后,将运行一个特殊的javascript,将此文本替换为真实内容。

存在两种混淆方法:简单的文本混淆和电子邮件混淆,后者还创建一个用户可以点击的mailto:链接。

以下是使用方法

user \TgUtils\Obfuscation;

/*** Just create everything and put it in your HTML page **/
$htmlSource = Obfuscation::obfuscateText('+49 555 0123456');
$emailLink  = Obfuscation::obfuscateEmail('john.doe@example.com');

/*************************** OR ***************************/
// Use your own tag ID 
$id         = Obfuscation::generateObfuscationId();

// Use this ID to get the bot-resistent HTML source
$htmlSource = Obfuscation::getObfuscatedHtmlSpan($id);

// And get the javascript
$textJavascript   = Obfuscation::obfuscateText('+49 555 0123456', $id);
$emailJavascript  = Obfuscation::obfuscateEmail('john.doe@example.com', $id);

请注意,默认字符映射不支持所有字符。它主要涵盖电子邮件地址和电话号码。然而,您可以将自己的字符集作为混淆方法的第三个参数传递。有关更多详细信息,请参阅源代码

文本模板化

为了简化动态文本的生成,提供了一个模板处理器。该处理器可以处理包含花括号中的变量({{variable-definition}})的文本。处理器了解对象、片段和格式化程序。

对象是应用程序对象,它们包含您想要替换的属性。对象的属性将使用{{objectKey.attributeName}}在模板中引用,例如{{user.name}}

片段是更复杂的替换,将被插入到模板中。当您需要在多个模板生成中使用相同的复杂文本结构时,例如页脚或页眉文本,这很有用。片段仅通过其键在模板中引用:{{snippetKey}}。片段由Snippet接口实现。片段可以接受参数,例如{{snippetKey:param1:param2...}}

格式化程序可以用于格式化对象的属性。格式化程序可以接受参数以进一步自定义格式化。一个很好的例子是DateFormatter。格式化程序通过对象的属性使用{{objectKey.attribute:formatterKey:param1:param2...}}引用,例如{{user.created_on:date:rfc822}}

这三个元素——对象、片段和格式化程序——都在其构造函数中将它们提供给Processor

$objects    = array('user'   => $myUser);
$snippets   = array('header' => new HeaderSnippet(), 'footer' => $new FooterSnippet());
$formatters = array('date'   => new DateFormatter());
$language   = 'en';
$processor = new Processor($objects, $snippets, $formatters, $language);

该语言用于信息,可用于片段或格式化程序以选择正确的文本。

最后,您可以处理一个模板

$template = '{{header}} Hello {{user.name}}! Your account was created on {{user.created_on:date:d/m/Y}}.{{footer}}';
echo $processor->process($template);

// Output is:
// IMPORTANT MESSAGE! Hello John Doe! Your account was created on 02/03/2017. Best regards!

其他Utils

在应用程序中需要完成一些日常任务。Utils类解决了其中的一些。

use TgUtils\Utils;
use TgUtils\FormatUtils;
use TgUtils\Slugify;

// create a random string
$myId = Utils::generateRandomString(20);

// Find an object with UID 1
$myObject = Utils::findByUid($objectList, 3);

// Find an object with a certain name
$myObject = Utils::findBy($objectList, 'name', 'John');

// Sort an array of objects by its names
Utils::sort($objectList, 'name');

// Sort an array of objects in reverse order of names
Utils::sort($objectList, 'name', TRUE);

// Sort an array of objects in reverse order of names, ignore upper/lower case
Utils::sort($objectList, 'name', TRUE, TRUE);

// Get all names from the list of objects
$allNames = Utils::extractAttributeFromList($objectList, 'name');

// Mask a sensitive string
$masked = Utils::anonymize($aPhoneNumber);

// Slugify a string
$slug = Slugify::slugify('A text that turn into an URL');

// Format a price
$priceString = FormatUtils::formatPrice(3000.643, 'EUR');

// Format a file size
$fileSize = FormatUtils::formatUnit(3000643, 'B');

查看源代码以获取有关可用方法的更多信息。

贡献

GitHub问题跟踪器报告错误、请求增强或发起拉取请求。