2022-01-09 03:50:38 +08:00
<? php
defined ( 'APP_PATH' ) or define ( 'APP_PATH' , realpath ( __DIR__ . '/../../' ));
use JetBrains\PhpStorm\Pure ;
2023-05-25 16:59:20 +08:00
use Kiri\Config\ConfigProvider ;
2022-01-09 03:50:38 +08:00
use Kiri\Core\ArrayAccess ;
2023-04-21 17:50:33 +08:00
use Kiri\Error\StdoutLogger ;
2022-01-09 03:50:38 +08:00
use Kiri\Events\EventDispatch ;
use Kiri\Events\EventProvider ;
use Kiri\Exception\ConfigException ;
2023-04-21 17:50:33 +08:00
use Kiri\Router\Request ;
use Kiri\Router\Response ;
2023-07-20 17:12:31 +08:00
use Kiri\Router\Router ;
2023-04-19 10:39:28 +08:00
use Psr\Container\ContainerExceptionInterface ;
use Psr\Container\NotFoundExceptionInterface ;
2023-04-21 17:50:33 +08:00
use Psr\Http\Message\RequestInterface ;
use Psr\Http\Message\ResponseInterface ;
2022-01-09 03:50:38 +08:00
use Swoole\Process ;
if ( ! function_exists ( 'make' )) {
2023-04-15 23:32:00 +08:00
2023-07-20 17:12:31 +08:00
/**
* @param $name
* @param $default
* @return mixed
* @throws
*/
function make ( $name , $default = NULL ) : mixed
{
if ( ! class_exists ( $name ) && ! interface_exists ( $name )) {
return Kiri :: getDi () -> get ( $default );
}
return Kiri :: getDi () -> get ( $name );
}
2023-04-15 23:32:00 +08:00
}
2022-09-23 18:59:35 +08:00
if ( ! function_exists ( 'isJson' )) {
2023-04-15 23:32:00 +08:00
2023-07-20 17:12:31 +08:00
function isJson ( ? string $string ) : bool
{
if ( is_null ( $string )) return false ;
return ( str_starts_with ( $string , '{' ) && str_ends_with ( $string , '}' ))
|| ( str_ends_with ( $string , '[' ) && str_starts_with ( $string , ']' ));
}
2023-04-15 23:32:00 +08:00
2022-06-22 16:29:42 +08:00
}
if ( ! function_exists ( 'instance' )) {
2023-04-15 23:32:00 +08:00
2023-07-20 17:12:31 +08:00
/**
* @param $class
* @param array $constrict
* @param array $config
* @return null|object
* @throws
*/
function instance ( $class , array $constrict = [], array $config = []) : ? object
{
return Kiri :: getDi () -> make ( $class , $constrict , $config );
}
2023-04-15 23:32:00 +08:00
2022-06-16 17:38:23 +08:00
}
if ( ! function_exists ( 'call' )) {
2023-04-15 23:32:00 +08:00
2023-07-31 23:09:00 +08:00
2023-07-20 17:12:31 +08:00
/**
* @param $handler
* @param mixed ...$params
* @return mixed
* @throws Exception
*/
function call ( $handler , ... $params ) : mixed
{
if ( is_array ( $handler ) && is_string ( $handler [ 0 ])) {
$handler [ 0 ] = di ( $handler [ 0 ]);
}
if ( ! is_callable ( $handler , true )) {
throw new Exception ( 'Call function not exists.' );
}
return call_user_func ( $handler , ... $params );
}
2023-04-15 23:32:00 +08:00
2022-01-09 03:50:38 +08:00
}
if ( ! function_exists ( 'map' )) {
2023-04-15 23:32:00 +08:00
2023-07-20 17:12:31 +08:00
/**
* @param array $params
* @param Closure $closure
* @return mixed
*/
function map ( array $params , Closure $closure ) : mixed
{
return array_map ( $closure , $params );
}
2023-04-15 23:32:00 +08:00
2022-01-09 03:50:38 +08:00
}
if ( ! function_exists ( 'checkPortIsAlready' )) {
2023-04-15 23:32:00 +08:00
2023-07-20 17:12:31 +08:00
/**
* @param $port
* @return bool|string
* @throws Exception
*/
function checkPortIsAlready ( $port ) : bool | string
{
if ( ! Kiri :: getPlatform () -> isLinux ()) {
exec ( "lsof -i :" . $port . " | grep -i 'LISTEN' | awk '{print $2}'" , $output );
if ( empty ( $output )) return FALSE ;
$output = explode ( PHP_EOL , $output [ 0 ]);
return $output [ 0 ];
}
$serverPid = file_get_contents ( storage ( '.swoole.pid' ));
if ( ! empty ( $serverPid ) && shell_exec ( 'ps -ef | grep ' . $serverPid . ' | grep -v grep' )) {
Process :: kill ( $serverPid , 0 ) && Process :: kill ( $serverPid , SIGTERM );
}
exec ( 'netstat -lnp | grep ' . $port . ' | grep "LISTEN" | awk \'{print $7}\'' , $output );
if ( empty ( $output )) {
return FALSE ;
}
return explode ( '/' , $output [ 0 ])[ 0 ];
}
2023-04-15 23:32:00 +08:00
2022-01-09 03:50:38 +08:00
}
if ( ! function_exists ( 'set_env' )) {
2023-04-15 23:32:00 +08:00
2023-07-20 17:12:31 +08:00
/**
* @param $key
* @param $value
*/
2023-07-31 23:09:00 +08:00
function set_env ( $key , $value ) : void
2023-07-20 17:12:31 +08:00
{
putenv ( sprintf ( '%s=%s' , $key , $value ));
}
2023-04-15 23:32:00 +08:00
2022-01-09 03:50:38 +08:00
}
if ( ! function_exists ( 'enable_file_modification_listening' )) {
2023-04-15 23:32:00 +08:00
2023-07-20 17:12:31 +08:00
function enable_file_modification_listening () : void
{
putenv ( 'enable_file_modification_listening=on' );
}
2023-04-15 23:32:00 +08:00
2022-01-09 03:50:38 +08:00
}
if ( ! function_exists ( 'is_enable_file_modification_listening' )) {
2023-04-15 23:32:00 +08:00
2023-07-20 17:12:31 +08:00
/**
* @return bool
*/
#[Pure] function is_enable_file_modification_listening(): bool
{
return env ( 'enable_file_modification_listening' , 'off' ) == 'on' ;
}
2023-04-15 23:32:00 +08:00
2022-01-09 03:50:38 +08:00
}
if ( ! function_exists ( 'disable_file_modification_listening' )) {
2023-04-15 23:32:00 +08:00
2023-07-31 23:09:00 +08:00
function disable_file_modification_listening () : void
2023-07-20 17:12:31 +08:00
{
putenv ( 'enable_file_modification_listening=off' );
}
2023-04-15 23:32:00 +08:00
2022-01-09 03:50:38 +08:00
}
if ( ! function_exists ( 'now' )) {
2023-04-15 23:32:00 +08:00
2023-07-20 17:12:31 +08:00
/**
* @return string
*/
function now () : string
{
return date ( 'Y-m-d H:i:s' ) . '.' . str_replace ( time () . '.' , '' , ( string ) microtime ( TRUE ));
}
2022-01-09 03:50:38 +08:00
}
if ( ! function_exists ( 'directory' )) {
2023-04-15 23:32:00 +08:00
2023-07-20 17:12:31 +08:00
/**
* @param $name
* @return string
*/
2023-07-31 23:09:00 +08:00
function directory ( $name ) : string
2023-07-20 17:12:31 +08:00
{
return realpath ( APP_PATH . $name );
}
2023-04-15 23:32:00 +08:00
2022-01-09 03:50:38 +08:00
}
if ( ! function_exists ( 'isUrl' )) {
2023-04-15 23:32:00 +08:00
2023-07-20 17:12:31 +08:00
/**
* @param $url
* @param bool $get_info
* @return false|array
*/
function isUrl ( $url , bool $get_info = TRUE ) : bool | array
{
if ( str_starts_with ( $url , '/' )) {
return FALSE ;
}
$queryMatch = '/((http[s]?):\/\/)?(([\w\-\_]+\.)+\w+(:\d+)?)(\/.*)?/' ;
if ( ! preg_match ( $queryMatch , $url , $outPut )) {
return FALSE ;
}
[ $scheme , $host , $port , $user , $pass , $query , $path , $fragment ] = parse_url ( $url );
if ( $scheme == 'https' && empty ( $port )) {
$port = 443 ;
}
if ( ! empty ( $query )) $path .= '?' . $query ;
if ( ! empty ( $fragment )) $path .= '#' . $fragment ;
return [ $scheme == 'https' , $host , $port , $path ];
}
2023-04-15 23:32:00 +08:00
2022-01-09 03:50:38 +08:00
}
2023-04-21 17:50:33 +08:00
if ( ! function_exists ( 'request' )) {
2023-07-20 17:12:31 +08:00
/**
* @return Request
* @throws
*/
function request () : RequestInterface
{
return Kiri :: getDi () -> get ( RequestInterface :: class );
}
2023-04-21 17:50:33 +08:00
}
if ( ! function_exists ( 'response' )) {
2023-07-20 17:12:31 +08:00
/**
* @return Response
* @throws
*/
function response () : ResponseInterface
{
2023-05-26 10:16:22 +08:00
return Kiri :: getDi () -> get ( ResponseInterface :: class );
2023-07-20 17:12:31 +08:00
}
2023-04-21 17:50:33 +08:00
}
2022-01-09 03:50:38 +08:00
if ( ! function_exists ( 'split_request_uri' )) {
2023-04-15 23:32:00 +08:00
2023-07-20 17:12:31 +08:00
/**
* @param $url
* @return false|array
*/
function split_request_uri ( $url ) : bool | array
{
if (( $parse = isUrl ( $url , NULL )) === FALSE ) {
return FALSE ;
}
[ $isHttps , $domain , $port , $path ] = $parse ;
$uri = $isHttps ? 'https://' . $domain : 'http://' . $domain ;
if ( ! empty ( $port )) {
$uri .= ':' . $port ;
}
return [ $uri , $path ];
}
2023-04-15 23:32:00 +08:00
2022-01-09 03:50:38 +08:00
}
if ( ! function_exists ( 'redis' )) {
2023-04-15 23:32:00 +08:00
2023-07-20 17:12:31 +08:00
/**
* @return \Kiri\Redis\Redis|Redis
* @throws Exception
*/
function redis () : \Kiri\Redis\Redis | Redis
{
return Kiri :: getDi () -> get ( \Kiri\Redis\Redis :: class );
}
2022-01-09 03:50:38 +08:00
}
if ( ! function_exists ( 'fire' )) {
2023-04-15 23:32:00 +08:00
2023-07-20 17:12:31 +08:00
/**
* @param object $event
2023-07-31 23:09:00 +08:00
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
* @throws ReflectionException
2023-07-20 17:12:31 +08:00
*/
2023-07-31 23:09:00 +08:00
function fire ( object $event ) : void
2023-07-20 17:12:31 +08:00
{
di ( EventDispatch :: class ) -> dispatch ( $event );
}
2022-01-09 03:50:38 +08:00
}
if ( ! function_exists ( 'exif_imagetype' )) {
2023-04-15 23:32:00 +08:00
2023-07-20 17:12:31 +08:00
/**
* @param $name
* @return string
*/
function exif_imagetype ( $name ) : string
{
return get_file_extension ( $name );
}
2022-01-09 03:50:38 +08:00
}
if ( ! function_exists ( 'trim_blank' )) {
2023-04-15 23:32:00 +08:00
2023-07-20 17:12:31 +08:00
/**
* 空白字符替换
* @param string $content 内容
* @param int $len 截取长度
* @param string $encode 编码
* @param bool $htmlTags
* @return array|string|null
*/
function trim_blank ( string $content , int $len = 0 , string $encode = 'utf-8' , bool $htmlTags = TRUE ) : array | string | null
{
$str = trim ( $content );
if ( $htmlTags ) {
$str = strip_tags ( $str );
}
$str = preg_replace ( '/[\n|\r|\t]+/' , '' , $str );
$str = preg_replace ( "/(\s|\ \;| | \xc2\xa0 )/" , '' , $str );
if ( $len > 0 ) {
return mb_substr ( $str , 0 , $len , $encode );
} else {
return $str ;
}
}
2022-01-09 03:50:38 +08:00
}
if ( ! function_exists ( 'get_file_extension' )) {
2023-04-15 23:32:00 +08:00
2023-07-20 17:12:31 +08:00
function get_file_extension ( $filename ) : bool | int | string
{
$mime_types = [
'txt' => 'text/plain' ,
'htm' => 'text/html' ,
'html' => 'text/html' ,
'php' => 'text/html' ,
'css' => 'text/css' ,
'js' => 'application/javascript' ,
'json' => 'application/json' ,
'xml' => 'application/xml' ,
'swf' => 'application/x-shockwave-flash' ,
'flv' => 'video/x-flv' ,
// images
'png' => 'image/png' ,
'jpeg' => 'image/jpeg' ,
'gif' => 'image/gif' ,
'bmp' => 'image/bmp' ,
'ico' => 'image/vnd.microsoft.icon' ,
'tiff' => 'image/tiff' ,
'svg' => 'image/svg+xml' ,
// archives
'zip' => 'application/zip' ,
'rar' => 'application/x-rar-compressed' ,
'exe' => 'application/x-msdownload' ,
'msi' => 'application/x-msdownload' ,
'cab' => 'application/vnd.ms-cab-compressed' ,
// audio/video
'mp3' => 'audio/mpeg' ,
'qt' => 'video/quicktime' ,
'mov' => 'video/quicktime' ,
// adobe
'pdf' => 'application/pdf' ,
'psd' => 'image/vnd.adobe.photoshop' ,
'ai' => 'application/postscript' ,
'eps' => 'application/postscript' ,
'ps' => 'application/postscript' ,
// ms office
'doc' => 'application/msword' ,
'rtf' => 'application/rtf' ,
'xls' => 'application/vnd.ms-excel' ,
'ppt' => 'application/vnd.ms-powerpoint' ,
// open office
'odt' => 'application/vnd.oasis.opendocument.text' ,
'ods' => 'application/vnd.oasis.opendocument.spreadsheet' ,
'323' => 'text / h323' ,
'acx' => 'application/internet-property-stream' ,
'aif' => 'audio/x-aiff' ,
'aifc' => 'audio/x-aiff' ,
'aiff' => 'audio/x-aiff' ,
'asf' => 'video/x-ms-asf' ,
'asr' => 'video/x-ms-asf' ,
'asx' => 'video/x-ms-asf' ,
'au' => 'audio/basic' ,
'avi' => 'video/x-msvideo' ,
'axs' => 'application/olescript' ,
'bas' => 'text/plain' ,
'bcpio' => 'application/x-bcpio' ,
'bin' => 'application/octet-stream' ,
'c' => 'text/plain' ,
'cat' => 'application/vnd.ms-pkiseccat' ,
'cdf' => 'application/x-cdf' ,
'cer' => 'application/x-x509-ca-cert' ,
'class' => 'application/octet-stream' ,
'clp' => 'application/x-msclip' ,
'cmx' => 'image/x-cmx' ,
'cod' => 'image/cis-cod' ,
'cpio' => 'application/x-cpio' ,
'crd' => 'application/x-mscardfile' ,
'crl' => 'application/pkix-crl' ,
'crt' => 'application/x-x509-ca-cert' ,
'csh' => 'application/x-csh' ,
'dcr' => 'application/x-director' ,
'der' => 'application/x-x509-ca-cert' ,
'dir' => 'application/x-director' ,
'dll' => 'application/x-msdownload' ,
'dms' => 'application/octet-stream' ,
'dot' => 'application/msword' ,
'dvi' => 'application/x-dvi' ,
'dxr' => 'application/x-director' ,
'etx' => 'text/x-setext' ,
'evy' => 'application/envoy' ,
'fif' => 'application/fractals' ,
'flr' => 'x-world/x-vrml' ,
'gtar' => 'application/x-gtar' ,
'gz' => 'application/x-gzip' ,
'h' => 'text/plain' ,
'hdf' => 'application/x-hdf' ,
'hlp' => 'application/winhlp' ,
'hqx' => 'application/mac-binhex40' ,
'hta' => 'application/hta' ,
'htc' => 'text/x-component' ,
'htt' => 'text/webviewhtml' ,
'ief' => 'image/ief' ,
'iii' => 'application/x-iphone' ,
'ins' => 'application/x-internet-signup' ,
'isp' => 'application/x-internet-signup' ,
'jfif' => 'image/pipeg' ,
'jpe' => 'image/jpeg' ,
'jpg' => 'image/jpeg' ,
'latex' => 'application/x-latex' ,
'lha' => 'application/octet-stream' ,
'lsf' => 'video/x-la-asf' ,
'lsx' => 'video/x-la-asf' ,
'lzh' => 'application/octet-stream' ,
'm13' => 'application/x-msmediaview' ,
'm14' => 'application/x-msmediaview' ,
'm3u' => 'audio/x-mpegurl' ,
'man' => 'application/x-troff-man' ,
'mdb' => 'application/x-msaccess' ,
'me' => 'application/x-troff-me' ,
'mht' => 'message/rfc822' ,
'mhtml' => 'message/rfc822' ,
'mid' => 'audio/mid' ,
'mny' => 'application/x-msmoney' ,
'movie' => 'video/x-sgi-movie' ,
'mp2' => 'video/mpeg' ,
'mpa' => 'video/mpeg' ,
'mpe' => 'video/mpeg' ,
'mpeg' => 'video/mpeg' ,
'mpg' => 'video/mpeg' ,
'mpp' => 'application/vnd.ms-project' ,
'mpv2' => 'video/mpeg' ,
'ms' => 'application/x-troff-ms' ,
'mvb' => 'application/x-msmediaview' ,
'nws' => 'message/rfc822' ,
'oda' => 'application/oda' ,
'p10' => 'application/pkcs10' ,
'p12' => 'application/x-pkcs12' ,
'p7b' => 'application/x-pkcs7-certificates' ,
'p7c' => 'application/x-pkcs7-mime' ,
'p7m' => 'application/x-pkcs7-mime' ,
'p7r' => 'application/x-pkcs7-certreqresp' ,
'p7s' => 'application/x-pkcs7-signature' ,
'pbm' => 'image/x-portable-bitmap' ,
'pfx' => 'application/x-pkcs12' ,
'pgm' => 'image/x-portable-graymap' ,
'pko' => 'application/ynd.ms-pkipko' ,
'pma' => 'application/x-perfmon' ,
'pmc' => 'application/x-perfmon' ,
'pml' => 'application/x-perfmon' ,
'pmr' => 'application/x-perfmon' ,
'pmw' => 'application/x-perfmon' ,
'pnm' => 'image/x-portable-anymap' ,
'pot' => 'application/vnd.ms-powerpoint' ,
'ppm' => 'image/x-portable-pixmap' ,
'pps' => 'application/vnd.ms-powerpoint' ,
'prf' => 'application/pics-rules' ,
'pub' => 'application/x-mspublisher' ,
'ra' => 'audio/x-pn-realaudio' ,
'ram' => 'audio/x-pn-realaudio' ,
'ras' => 'image/x-cmu-raster' ,
'rgb' => 'image/x-rgb' ,
'rmi' => 'audio/mid' ,
'roff' => 'application/x-troff' ,
'rtx' => 'text/richtext' ,
'scd' => 'application/x-msschedule' ,
'sct' => 'text/scriptlet' ,
'setpay' => 'application/set-payment-initiation' ,
'setreg' => 'application/set-registration-initiation' ,
'sh' => 'application/x-sh' ,
'shar' => 'application/x-shar' ,
'sit' => 'application/x-stuffit' ,
'snd' => 'audio/basic' ,
'spc' => 'application/x-pkcs7-certificates' ,
'spl' => 'application/futuresplash' ,
'src' => 'application/x-wais-source' ,
'sst' => 'application/vnd.ms-pkicertstore' ,
'stl' => 'application/vnd.ms-pkistl' ,
'stm' => 'text/html' ,
'sv4cpio' => 'application/x-sv4cpio' ,
'sv4crc' => 'application/x-sv4crc' ,
't' => 'application/x-troff' ,
'tar' => 'application/x-tar' ,
'tcl' => 'application/x-tcl' ,
'tex' => 'application/x-tex' ,
'texi' => 'application/x-texinfo' ,
'texinfo' => 'application/x-texinfo' ,
'tgz' => 'application/x-compressed' ,
'tif' => 'image/tiff' ,
'tr' => 'application/x-troff' ,
'trm' => 'application/x-msterminal' ,
'tsv' => 'text/tab-separated-values' ,
'uls' => 'text/iuls' ,
'ustar' => 'application/x-ustar' ,
'vcf' => 'text/x-vcard' ,
'vrml' => 'x-world/x-vrml' ,
'wav' => 'audio/x-wav' ,
'wcm' => 'application/vnd.ms-works' ,
'wdb' => 'application/vnd.ms-works' ,
'wks' => 'application/vnd.ms-works' ,
'wmf' => 'application/x-msmetafile' ,
'wps' => 'application/vnd.ms-works' ,
'wri' => 'application/x-mswrite' ,
'wrl' => 'x-world/x-vrml' ,
'wrz' => 'x-world/x-vrml' ,
'xaf' => 'x-world/x-vrml' ,
'xbm' => 'image/x-xbitmap' ,
'xla' => 'application/vnd.ms-excel' ,
'xlc' => 'application/vnd.ms-excel' ,
'xlm' => 'application/vnd.ms-excel' ,
'xlt' => 'application/vnd.ms-excel' ,
'xlw' => 'application/vnd.ms-excel' ,
'xof' => 'x-world/x-vrml' ,
'xpm' => 'image/x-xpixmap' ,
'xwd' => 'image/x-xwindowdump' ,
'z' => 'application/x-compress' ,
];
$explode = explode ( '.' , $filename );
$ext = strtolower ( array_pop ( $explode ));
if ( array_key_exists ( $ext , $mime_types )) {
return $ext ;
} else if ( function_exists ( 'finfo_open' )) {
$fInfo = finfo_open ( FILEINFO_MIME );
$mimeType = finfo_file ( $fInfo , $filename );
finfo_close ( $fInfo );
$mimeType = current ( explode ( '; ' , $mimeType ));
2023-07-31 23:09:00 +08:00
if ( ! ( $search = array_search ( $mimeType , $mime_types ))) {
2023-07-20 17:12:31 +08:00
return $mimeType ;
}
return $search ;
} else {
return 'application/octet-stream' ;
}
}
2022-01-09 03:50:38 +08:00
}
if ( ! function_exists ( 'storage' )) {
2023-04-15 23:32:00 +08:00
2023-07-20 17:12:31 +08:00
/**
* @param string|null $fileName
* @param string|null $path
* @return string
* @throws Exception
*/
function storage ( ? string $fileName = '' , ? string $path = '' ) : string
{
$basePath = rtrim ( Kiri :: getStoragePath (), '/' );
if ( ! empty ( $path )) {
$path = ltrim ( $path , '/' );
if ( ! is_dir ( $basePath . '/' . $path )) {
mkdir ( $basePath . '/' . $path , 0777 , TRUE );
}
}
if ( empty ( $fileName )) {
return $basePath . '/' . $path ;
}
$fileName = $basePath . '/' . $path . $fileName ;
if ( ! file_exists ( $fileName )) {
touch ( $fileName );
}
return $fileName ;
}
2022-01-09 03:50:38 +08:00
}
2023-04-19 10:39:28 +08:00
if ( ! function_exists ( 'on' )) {
2023-04-15 23:32:00 +08:00
2023-07-20 17:12:31 +08:00
/**
* @param $name
* @param $callback
* @param int $index
* @throws
*/
function on ( $name , $callback , int $index = 0 ) : void
{
$pro = di ( EventProvider :: class );
$pro -> on ( $name , $callback , $index );
}
2023-04-15 23:32:00 +08:00
2022-01-09 03:50:38 +08:00
}
2023-07-31 23:09:00 +08:00
if ( ! function_exists ( 'process_name_set' )) {
2023-04-15 23:32:00 +08:00
2023-07-20 17:12:31 +08:00
/**
* @param int $pid
* @param string|null $prefix
* @throws Exception
*/
2023-07-31 23:09:00 +08:00
function process_name_set ( int $pid , string $prefix = NULL ) : void
2023-07-20 17:12:31 +08:00
{
if ( Kiri :: getPlatform () -> isMac ()) {
return ;
}
$name = \config ( 'id' , 'system' ) . '[' . $pid . ']' ;
if ( ! empty ( $prefix )) {
$name .= '.' . $prefix ;
}
swoole_set_process_name ( $name );
}
2023-04-15 23:32:00 +08:00
2022-01-09 03:50:38 +08:00
}
if ( ! function_exists ( 'zero_full' )) {
2023-07-31 23:09:00 +08:00
/**
* @param int $data
* @param int $length
* @return string
*/
2023-07-20 17:12:31 +08:00
function zero_full ( int $data = 1 , int $length = 10 ) : string
{
return sprintf ( '%0' . $length . 'd' , $data );
}
2022-01-09 03:50:38 +08:00
}
if ( ! function_exists ( 'env' )) {
2023-04-15 23:32:00 +08:00
2023-07-20 17:12:31 +08:00
/**
* @param $key
* @param null $default
* @return array|string|null
*/
2023-07-31 23:09:00 +08:00
function env ( $key , $default = NULL ) : null | array | string
2023-07-20 17:12:31 +08:00
{
$env = getenv ( $key );
if ( $env === FALSE ) {
return $default ;
}
return $env ;
}
2023-04-15 23:32:00 +08:00
}
if ( ! function_exists ( 'config' )) {
2023-05-26 10:26:13 +08:00
/**
* @param $key
* @param null $default
2023-05-26 11:16:45 +08:00
* @return mixed
2023-05-26 10:26:13 +08:00
*/
2023-07-20 17:12:31 +08:00
function config ( $key , $default = NULL ) : mixed
{
return make ( ConfigProvider :: class ) -> get ( $key , $default );
}
2023-05-25 16:59:20 +08:00
}
if ( ! function_exists ( 'created' )) {
/**
* @param $key
* @param array $construct
* @param array $config
2023-05-26 11:21:36 +08:00
* @return null|object
2023-05-25 16:59:20 +08:00
* @throws ReflectionException
*/
2023-07-20 17:12:31 +08:00
function created ( $key , array $construct = [], array $config = []) : ? object
{
return Kiri :: getDi () -> make ( $key , $construct , $config );
}
2023-04-15 23:32:00 +08:00
2022-01-09 03:50:38 +08:00
}
if ( ! function_exists ( 'di' )) {
2023-04-15 23:32:00 +08:00
2023-07-20 17:12:31 +08:00
/**
* @param string|object $className
* @return mixed
* @throws ReflectionException
*/
function di ( string | object $className ) : mixed
{
if ( is_object ( $className )) {
return $className ;
}
return Kiri :: getDi () -> get ( $className );
}
2023-04-15 23:32:00 +08:00
2022-01-09 03:50:38 +08:00
}
if ( ! function_exists ( 'sweep' )) {
2023-04-15 23:32:00 +08:00
2023-07-20 17:12:31 +08:00
/**
* @param string $configPath
* @return array|false|string|null
*/
function sweep ( string $configPath = APP_PATH . 'config' ) : bool | array | string | null
{
$array = [];
foreach ( glob ( $configPath . '/*.php' ) as $config ) {
$array = array_merge ( require " $config " , $array );
}
return $array ;
}
2023-04-15 23:32:00 +08:00
2022-01-09 03:50:38 +08:00
}
if ( ! function_exists ( 'merge' )) {
2023-04-15 23:32:00 +08:00
2023-07-20 17:12:31 +08:00
/**
* @param $param
* @param $param1
* @return array
*/
function merge ( $param , $param1 ) : array
{
return ArrayAccess :: merge ( $param , $param1 );
}
2023-04-15 23:32:00 +08:00
2022-01-09 03:50:38 +08:00
}
if ( ! function_exists ( 'jTraceEx' )) {
2023-04-15 23:32:00 +08:00
2023-07-20 17:12:31 +08:00
/**
* @param $e
* @param null $seen
* @param bool $toHtml
* @return string
*/
function jTraceEx ( $e , $seen = NULL , bool $toHtml = FALSE ) : string
{
$starter = $seen ? 'Caused by: ' : '' ;
$result = [];
if ( ! $seen ) $seen = [];
$trace = $e -> getTrace ();
$prev = $e -> getPrevious ();
$result [] = sprintf ( '%s%s: %s' , $starter , $e :: class , $e -> getMessage ());
$file = $e -> getFile ();
$line = $e -> getLine ();
foreach ( $trace as $value ) {
$result [] = sprintf ( ' at %s%s%s(%s%s%s)' ,
count ( $value ) && array_key_exists ( 'class' , $value ) ? str_replace ( '\\' , '.' , $value [ 'class' ]) : '' ,
count ( $value ) && array_key_exists ( 'class' , $value ) && array_key_exists ( 'function' , $value ) ? '.' : '' ,
count ( $value ) && array_key_exists ( 'function' , $value ) ? str_replace ( '\\' , '.' , $value [ 'function' ]) : '(main)' ,
$line === NULL ? $file : basename ( $file ),
$line === NULL ? '' : ':' ,
$line === NULL ? '' : $line );
$file = array_key_exists ( 'file' , $value ) ? $value [ 'file' ] : 'Unknown Source' ;
$line = array_key_exists ( 'file' , $value ) && array_key_exists ( 'line' , $value ) && $value [ 'line' ] ? $value [ 'line' ] : NULL ;
}
$result = join ( $toHtml ? "<br>" : " \n " , $result );
if ( $prev ) {
$result .= ( $toHtml ? "<br>" : " \n " ) . jTraceEx ( $prev , $seen , $toHtml );
}
return $result ;
}
2023-04-15 23:32:00 +08:00
2022-01-09 03:50:38 +08:00
}
if ( ! function_exists ( 'error' )) {
2023-04-15 23:32:00 +08:00
2023-07-20 17:12:31 +08:00
/**
* @param mixed $message
* @param array $method
* @return void
* @throws
*/
function error ( mixed $message , array $method = []) : void
{
2023-07-31 23:09:00 +08:00
Kiri :: getLogger () -> failure ( $message );
2023-07-20 17:12:31 +08:00
}
2022-01-09 03:50:38 +08:00
}
2023-04-18 23:47:31 +08:00
2023-07-31 23:09:00 +08:00
if ( ! function_exists ( 'trigger_print_error' )) {
2023-04-18 23:47:31 +08:00
2023-07-20 17:12:31 +08:00
/**
* @param mixed $message
* @param string $method
* @return bool
* @throws
*/
2023-07-31 23:09:00 +08:00
function trigger_print_error ( mixed $message , string $method = 'app' ) : bool
2023-07-20 17:12:31 +08:00
{
2023-07-31 23:09:00 +08:00
return Kiri :: getLogger () -> failure ( $message , $method );
2023-07-20 17:12:31 +08:00
}
2023-04-18 23:47:31 +08:00
}
2022-01-09 03:50:38 +08:00
2023-04-19 10:39:28 +08:00
if ( ! function_exists ( 'event' )) {
2023-07-20 17:12:31 +08:00
/**
* @param object $object
* @return void
* @throws ReflectionException
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
*/
function event ( object $object ) : void
{
Kiri :: getDi () -> get ( EventDispatch :: class ) -> dispatch ( $object );
}
2023-04-19 10:39:28 +08:00
}
2022-01-11 16:16:05 +08:00
2022-06-22 16:29:42 +08:00
if ( ! function_exists ( 'throwable' )) {
2023-04-15 23:32:00 +08:00
2023-07-20 17:12:31 +08:00
/**
* @param Throwable|Error $throwable
* @return string
*/
function throwable ( \Throwable | \Error $throwable ) : string
{
2023-07-26 17:26:47 +08:00
$message = " \033 [31m" . $throwable :: class . ' ' . $throwable -> getMessage () . " \033 [0m" . PHP_EOL ;
$message .= $throwable -> getFile () . " at line " . $throwable -> getLine () . PHP_EOL ;
$file = $throwable -> getFile ();
$line = $throwable -> getLine ();
2023-07-20 17:12:31 +08:00
foreach ( $throwable -> getTrace () as $value ) {
if ( ! isset ( $value [ 'file' ])) {
2023-07-26 17:26:47 +08:00
$value [ 'file' ] = $file ;
2023-07-20 17:12:31 +08:00
}
2023-07-26 17:26:47 +08:00
if ( ! isset ( $value [ 'line' ])) {
$value [ 'line' ] = $line ;
}
$file = $value [ 'file' ];
$line = $value [ 'line' ];
$message .= $value [ 'file' ] . ' -> ' . ( isset ( $value [ 'class' ]) ? $value [ 'class' ] . '::' : '' ) . ( $value [ 'function' ] ?? 'Closure' ) . "(" . implode ( "," , $value [ 'args' ] ?? []) . ")" . ' line ' . $line . PHP_EOL ;
2023-07-20 17:12:31 +08:00
}
return $message ;
}
2023-04-15 23:32:00 +08:00
2022-01-11 16:16:05 +08:00
}
2022-06-22 16:29:42 +08:00
if ( ! function_exists ( 'map' )) {
2023-04-15 23:32:00 +08:00
2023-07-20 17:12:31 +08:00
/**
* @param array $map
* @param Closure $closure
* @return void
*/
function map ( array $map , Closure $closure ) : void
{
foreach ( $map as $key => $value ) {
$closure ( $key , $value );
}
}
2022-06-22 16:29:42 +08:00
}