technicalguru / utils
PHP 开发的基本类
Requires
- php: >=7.0.0
- ext-mbstring: *
- ezyang/htmlpurifier: ^4
- technicalguru/i18n: ~1
Requires (Dev)
- phpunit/phpunit: ^9
- dev-main
- v1.2.4
- v1.2.3
- v1.2.2
- v1.2.1
- v1.2.0
- v1.1.24
- v1.1.23
- v1.1.22
- v1.1.21
- v1.1.20
- v1.1.19
- v1.1.18
- v1.1.17
- v1.1.16
- v1.1.15
- v1.1.14
- v1.1.13
- v1.1.12
- v1.1.11
- v1.1.10
- v1.1.9
- v1.1.8
- v1.1.7
- v1.1.6
- v1.1.5
- v1.1.4
- v1.1.3
- v1.1.2
- v1.1.1
- v1.1.0
- v1.0.4
- v1.0.3
- v1.0.2
- v1.0.1
- v1.0.0
- dev-1.2-dev
- dev-1.0-dev
- dev-2.0-dev
This package is auto-updated.
Last update: 2024-09-07 17:37:48 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.));
注册不仅会记住消息,当它是 Debug、Error、Warning 或 Info 实例时,还会将其打印到错误日志中。
在另一个调用或脚本中,您可以再次检索您的消息以显示
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();
身份验证助手
提供了一个简单的身份验证助手接口及其默认实现
- TgUtils\Auth\CredentialsProvider - 提供用户名和密码给其他对象的接口
- TgUtils\Auth\DefaultCredentialsProvider - 简单的接口默认实现
敏感数据混淆
如今,发布电子邮件地址和电话号码等敏感数据是危险的,因为垃圾邮件发送者会自动从网站上抓取此类信息。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问题跟踪器报告错误、请求增强或发起拉取请求。