Initial project files: BESCMS full source
This commit is contained in:
@@ -0,0 +1,405 @@
|
||||
<?php
|
||||
/**
|
||||
* 运行目录
|
||||
*/
|
||||
|
||||
// PHP版本检测
|
||||
$min = '8.0';
|
||||
$max = '8.6';
|
||||
if (version_compare(PHP_VERSION, $min) < 0 || version_compare(PHP_VERSION, $max) > 0) {
|
||||
exit("<font color=red>PHP版本要求大于".$min.".0且小于".$max.",当前".PHP_VERSION."不满足运行环境</font>");
|
||||
}
|
||||
|
||||
define('FRAME_PHP_VERSION', $min);
|
||||
define('FRAME_NAME', 'System');
|
||||
define('FRAME_VERSION', '4.7');
|
||||
|
||||
defined('EXIT_SUCCESS') || define('EXIT_SUCCESS', 0); // no errors
|
||||
defined('EXIT_ERROR') || define('EXIT_ERROR', 1); // generic error
|
||||
defined('EXIT_CONFIG') || define('EXIT_CONFIG', 3); // configuration error
|
||||
defined('EXIT_UNKNOWN_FILE') || define('EXIT_UNKNOWN_FILE', 4); // file not found
|
||||
defined('EXIT_UNKNOWN_CLASS') || define('EXIT_UNKNOWN_CLASS', 5); // unknown class
|
||||
defined('EXIT_UNKNOWN_METHOD') || define('EXIT_UNKNOWN_METHOD', 6); // unknown class member
|
||||
defined('EXIT_USER_INPUT') || define('EXIT_USER_INPUT', 7); // invalid user input
|
||||
defined('EXIT_DATABASE') || define('EXIT_DATABASE', 8); // database error
|
||||
defined('EXIT__AUTO_MIN') || define('EXIT__AUTO_MIN', 9); // lowest automatically-assigned error code
|
||||
defined('EXIT__AUTO_MAX') || define('EXIT__AUTO_MAX', 125); // highest automatically-assigned error code
|
||||
|
||||
/**
|
||||
* @deprecated Use \CodeIgniter\Events\Events::PRIORITY_LOW instead.
|
||||
*/
|
||||
define('EVENT_PRIORITY_LOW', 200);
|
||||
|
||||
/**
|
||||
* @deprecated Use \CodeIgniter\Events\Events::PRIORITY_NORMAL instead.
|
||||
*/
|
||||
define('EVENT_PRIORITY_NORMAL', 100);
|
||||
|
||||
/**
|
||||
* @deprecated Use \CodeIgniter\Events\Events::PRIORITY_HIGH instead.
|
||||
*/
|
||||
define('EVENT_PRIORITY_HIGH', 10);
|
||||
|
||||
|
||||
require CMSPATH . 'Core/Auto.php';
|
||||
require CMSPATH . 'Core/Service.php';
|
||||
require CMSPATH . 'Core/Hooks.php';
|
||||
require FRAMEPATH . 'Extend/Run.php';
|
||||
|
||||
if (! function_exists('csrf_token')) {
|
||||
/**
|
||||
* Get the CSRF token value.
|
||||
*
|
||||
* @return string
|
||||
*
|
||||
* @throws \RuntimeException
|
||||
*/
|
||||
function csrf_token()
|
||||
{
|
||||
return \Phpcmf\Service::L('Security')->csrf_token();
|
||||
}
|
||||
}
|
||||
|
||||
if (! function_exists('csrf_hash')) {
|
||||
/**
|
||||
* Get the CSRF token value.
|
||||
*
|
||||
* @return string
|
||||
*
|
||||
* @throws \RuntimeException
|
||||
*/
|
||||
function csrf_hash()
|
||||
{
|
||||
return \Phpcmf\Service::L('Security')->csrf_hash();
|
||||
}
|
||||
}
|
||||
|
||||
if (! function_exists('lang')) {
|
||||
function lang(...$param) {
|
||||
|
||||
if (empty($param)) {
|
||||
return '';
|
||||
}
|
||||
|
||||
// 取第一个作为语言名称
|
||||
$string = $param[0];
|
||||
unset($param[0]);
|
||||
|
||||
// 调用语言包内容
|
||||
//$string = \Phpcmf\Service::L('lang')->text($string);
|
||||
if ($param) {
|
||||
//foreach ($param as $k => $t) {
|
||||
//$param[$k] = \Phpcmf\Service::L('lang')->text($t);
|
||||
//}
|
||||
return vsprintf($string, $param);
|
||||
}
|
||||
|
||||
return $string;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (! function_exists('config')) {
|
||||
function config(string $name, bool $getShared = true)
|
||||
{
|
||||
if ($getShared) {
|
||||
return \CodeIgniter\Config\Factories::get('config', $name);
|
||||
}
|
||||
|
||||
return \CodeIgniter\Config\Factories::config($name, ['getShared' => $getShared]);
|
||||
}
|
||||
}
|
||||
|
||||
if (! function_exists('is_really_writable')) {
|
||||
/**
|
||||
* Tests for file writability
|
||||
*
|
||||
* is_writable() returns TRUE on Windows servers when you really can't write to
|
||||
* the file, based on the read-only attribute. is_writable() is also unreliable
|
||||
* on Unix servers if safe_mode is on.
|
||||
*
|
||||
* @see https://bugs.php.net/bug.php?id=54709
|
||||
*
|
||||
* @throws Exception
|
||||
*
|
||||
* @codeCoverageIgnore Not practical to test, as travis runs on linux
|
||||
*/
|
||||
function is_really_writable(string $file): bool
|
||||
{
|
||||
// If we're on a Unix server we call is_writable
|
||||
if (! is_windows()) {
|
||||
return is_writable($file);
|
||||
}
|
||||
|
||||
/* For Windows servers and safe_mode "on" installations we'll actually
|
||||
* write a file then read it. Bah...
|
||||
*/
|
||||
if (is_dir($file)) {
|
||||
$file = rtrim($file, '/') . '/' . bin2hex(random_bytes(16));
|
||||
if (($fp = @fopen($file, 'ab')) === false) {
|
||||
return false;
|
||||
}
|
||||
|
||||
fclose($fp);
|
||||
@chmod($file, 0777);
|
||||
@unlink($file);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
if (! is_file($file) || ($fp = @fopen($file, 'ab')) === false) {
|
||||
return false;
|
||||
}
|
||||
|
||||
fclose($fp);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (! function_exists('is_windows')) {
|
||||
/**
|
||||
* Detect if platform is running in Windows.
|
||||
*/
|
||||
function is_windows(?bool $mock = null): bool
|
||||
{
|
||||
static $mocked;
|
||||
|
||||
if (func_num_args() === 1) {
|
||||
$mocked = $mock;
|
||||
}
|
||||
|
||||
return $mocked ?? DIRECTORY_SEPARATOR === '\\';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (! function_exists('helper')) {
|
||||
/**
|
||||
* Loads a helper file into memory. Supports namespaced helpers,
|
||||
* both in and out of the 'Helpers' directory of a namespaced directory.
|
||||
*
|
||||
* Will load ALL helpers of the matching name, in the following order:
|
||||
* 1. app/Helpers
|
||||
* 2. {namespace}/Helpers
|
||||
* 3. system/Helpers
|
||||
*
|
||||
* @param array|string $filenames
|
||||
*
|
||||
* @throws FileNotFoundException
|
||||
*/
|
||||
function helper($filenames): void
|
||||
{
|
||||
static $loaded = [];
|
||||
|
||||
|
||||
if (! is_array($filenames)) {
|
||||
$filenames = [$filenames];
|
||||
}
|
||||
|
||||
// Store a list of all files to include...
|
||||
$includes = [];
|
||||
|
||||
foreach ($filenames as $filename) {
|
||||
// Store our system and application helper
|
||||
// versions so that we can control the load ordering.
|
||||
$systemHelper = '';
|
||||
$appHelper = '';
|
||||
$localIncludes = [];
|
||||
|
||||
if (! str_contains($filename, '_helper')) {
|
||||
$filename .= '_helper';
|
||||
}
|
||||
|
||||
// Check if this helper has already been loaded
|
||||
if (in_array($filename, $loaded, true)) {
|
||||
continue;
|
||||
}
|
||||
$path = FRAMEPATH.'Helpers/'.$filename.'.php';
|
||||
$includes[] = $path;
|
||||
$loaded[] = $filename;
|
||||
}
|
||||
|
||||
// Now actually include all of the files
|
||||
foreach ($includes as $path) {
|
||||
include_once $path;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (! function_exists('service')) {
|
||||
/**
|
||||
* Allows cleaner access to the Services Config file.
|
||||
* Always returns a SHARED instance of the class, so
|
||||
* calling the function multiple times should always
|
||||
* return the same instance.
|
||||
*
|
||||
* These are equal:
|
||||
* - $timer = service('timer')
|
||||
* - $timer = \CodeIgniter\Config\Services::timer();
|
||||
*
|
||||
* @param array|bool|float|int|object|string|null ...$params
|
||||
*/
|
||||
function service(string $name, ...$params): ?object
|
||||
{
|
||||
if ($params === []) {
|
||||
return \CodeIgniter\Config\Services::get($name);
|
||||
}
|
||||
|
||||
return \CodeIgniter\Config\Services::$name(...$params);
|
||||
}
|
||||
}
|
||||
|
||||
function site_url() {
|
||||
return FC_NOW_HOST;
|
||||
}
|
||||
|
||||
|
||||
if (! function_exists('clean_path')) {
|
||||
function clean_path(string $path): string
|
||||
{
|
||||
|
||||
return $path;
|
||||
}
|
||||
}
|
||||
|
||||
if (!class_exists('Locale')) {
|
||||
class Locale {
|
||||
|
||||
static private $locale;
|
||||
|
||||
public static function getDefault() {
|
||||
return self::$locale;
|
||||
}
|
||||
|
||||
public static function setDefault($locale) {
|
||||
self::$locale = $locale;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if (! function_exists('env')) {
|
||||
/**
|
||||
* Allows user to retrieve values from the environment
|
||||
* variables that have been set. Especially useful for
|
||||
* retrieving values set from the .env file for
|
||||
* use in config files.
|
||||
*
|
||||
* @param array<int|string, mixed>|bool|float|int|object|string|null $default
|
||||
*
|
||||
* @return array<int|string, mixed>|bool|float|int|object|string|null
|
||||
*/
|
||||
function env(string $key, $default = null)
|
||||
{
|
||||
$value = $_ENV[$key] ?? $_SERVER[$key] ?? getenv($key);
|
||||
|
||||
// Not found? Return the default value
|
||||
if ($value === false) {
|
||||
return $default;
|
||||
}
|
||||
|
||||
// Handle any boolean values
|
||||
return match (strtolower($value)) {
|
||||
'true' => true,
|
||||
'false' => false,
|
||||
'empty' => '',
|
||||
'null' => null,
|
||||
default => $value,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
if (! function_exists('esc')) {
|
||||
/**
|
||||
* Performs simple auto-escaping of data for security reasons.
|
||||
* Might consider making this more complex at a later date.
|
||||
*
|
||||
* If $data is a string, then it simply escapes and returns it.
|
||||
* If $data is an array, then it loops over it, escaping each
|
||||
* 'value' of the key/value pairs.
|
||||
*
|
||||
* @param array|string $data
|
||||
* @param 'attr'|'css'|'html'|'js'|'raw'|'url' $context
|
||||
* @param string|null $encoding Current encoding for escaping.
|
||||
* If not UTF-8, we convert strings from this encoding
|
||||
* pre-escaping and back to this encoding post-escaping.
|
||||
*
|
||||
* @return array|string
|
||||
*
|
||||
* @throws InvalidArgumentException
|
||||
*/
|
||||
function esc($data, string $context = 'html', ?string $encoding = null)
|
||||
{
|
||||
$context = strtolower($context);
|
||||
|
||||
// Provide a way to NOT escape data since
|
||||
// this could be called automatically by
|
||||
// the View library.
|
||||
if ($context === 'raw') {
|
||||
return $data;
|
||||
}
|
||||
|
||||
if (is_array($data)) {
|
||||
foreach ($data as &$value) {
|
||||
$value = esc($value, $context);
|
||||
}
|
||||
}
|
||||
|
||||
if (is_string($data)) {
|
||||
if (! in_array($context, ['html', 'js', 'css', 'url', 'attr'], true)) {
|
||||
throw new InvalidArgumentException('Invalid escape context provided.');
|
||||
}
|
||||
|
||||
$method = $context === 'attr' ? 'escapeHtmlAttr' : 'escape' . ucfirst($context);
|
||||
|
||||
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 应用插件的自动识别
|
||||
$loader = new \Phpcmf\Auto();
|
||||
$myloader = new \Phpcmf\AutoConfig();
|
||||
$myloader->psr4 = [
|
||||
'CodeIgniter' => FRAMEPATH,
|
||||
'Config' => FRAMEPATH.'Config',
|
||||
];
|
||||
$loader->initialize(\Phpcmf\Service::Auto($myloader));
|
||||
$loader->register();
|
||||
|
||||
// 挂钩点 程序运行之前
|
||||
\Phpcmf\Hooks::trigger('cms_run');
|
||||
|
||||
// 初始化异常处理
|
||||
//\CodeIgniter\Exceptions\FrameworkException::initialize();
|
||||
\CodeIgniter\Config\Services::exceptions()->initialize();
|
||||
|
||||
if (CI_DEBUG) {
|
||||
\CodeIgniter\Events\Events::on('pre_system', function () {
|
||||
|
||||
/*
|
||||
* --------------------------------------------------------------------
|
||||
* Debug Toolbar Listeners.
|
||||
* --------------------------------------------------------------------
|
||||
* If you delete, they will no longer be collected.
|
||||
*/
|
||||
|
||||
\CodeIgniter\Events\Events::on('DBQuery', 'CodeIgniter\Debug\Toolbar\Collectors\Database::collect');
|
||||
|
||||
$config = config(\Config\Toolbar::class);
|
||||
|
||||
$tool = new \CodeIgniter\Debug\Toolbar($config);
|
||||
|
||||
$tool->respond();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
// 启动框架
|
||||
$run = new \Frame\Run();
|
||||
$run->bootWeb();
|
||||
|
||||
Reference in New Issue
Block a user