arefshojaei / lite-php
微型PHP框架
Requires
- php: ^8.0
This package is auto-updated.
Last update: 2024-09-30 13:58:41 UTC
README
教程
介绍
什么是 Lite-PHP ?
Lite-PHP 是一个用于开发后端应用程序的微型框架
为什么选择 Lite-PHP ?
因为 Lite-PHP 具有
简单 & 快速开发环境
模块化结构
类似 MySQL 的 DBMS
测试模块
自定义插件 & 钩子
控制台中的自定义命令行
REST API 开发
函数式编程结构
文件夹结构
无 OOP & 无对象 & 无类
安装
使用 GIT
git clone https://github.com/ArefShojaei/Lite-PHP
使用 Composer
composer create-project arefshojaei/lite-php
文件夹结构
以下是启动新项目时默认的文件夹结构!
|- bootstrap/ | |- console/ | |- core/ | |- hooks/ | |- modules/ | |- plugins/ | |- public/ | |- resources/ | |- storage/ | | |- .env.example |- .gitignore |- .htaccess |- cli |- composer.json |- gulpfile.mjs |- init |- package.json |- README.md |- robots.txt |- server.php
core/
主要文件或 Lite-PHP 核心文件,可以作为每个项目的基文件提供!
bootstrap/
用于启动应用的基文件
modules/
作为主文件运行所需的应用模块
hooks/
让您开发 自定义钩子
plugins/
让您开发 自定义插件
public/
生产中的静态文件与入口点文件(index.php)
resources/
资产和视图文件
storage/
本地文件夹和文件,如 日志、缓存和上传...
根文件
.env.example
这是 ENV 的配置,然后您必须在开始项目之前将其从 .env.example 文件更改为 .env 文件!
.gitignore
这是配置以 隐藏文件,以便不在 Github 上推送
.htaccess
Apache 网络服务器配置
cli
控制台配置以 使用命令
composer.json
包信息护照
gulpfile.mjs
任务运行器配置以处理资产
init
用于开发应用的基本设置配置
package.json
任务运行器运行所需 包依赖项的列表
README.md
Lite-PHP 包信息
robots.txt
这是为 Google 爬虫的配置
server.php
主文件用于启动应用
模块
别名
提供注册自定义别名的功能
1-示例
# Before require_once "../../../modules/user/_controller.php"; require_once "../console/commands/package/_main.php"; # After + without using '.php' ext import("@modules/user/_controller") import("@commands/package/_main")
2-如何使用它?
移动到 "bootstrap/alias.php",然后按照这种方式注册别名
createAlias([ # Guide "@<alias>" => dirname(__DIR__) . "path", # Example "@core" => dirname(__DIR__) . "/core", "@modules" => dirname(__DIR__) . "/modules", ... ]);
配置
为模块注册新的配置
1-如何创建配置?
import("@core/modules/config/createConfig"); createConfig("name", [ "key" => "value" ])
2-如何使用配置?
import("@core/hooks/useConfig"); # Usage useConfig("name.key")
枚举
将枚举注册为常量
1-如何创建枚举?
import("@core/modules/enum/createEnum"); createEnum("name", [ "KEY" => "value" ])
2-如何使用枚举?
import("@core/hooks/useEnum"); # Usage useEnum("name::KEY")
插件
注册新的插件
注意:我们有两种使用插件的方式
- 运行类型需要在 "bootstrap/providers.php" 中注册
- 使用类型需要在 逻辑代码 中使用
1-如何创建运行插件?
import("@core/modules/plugin/createPlugin"); # Usage createPlugin("name", function ($params) {}, false);
2-如何使用运行插件?
移动到 "bootstrap/providers.php",然后使用这种方式注册运行插件
"plugins" => [ # Usage registerPlugin("name"), # Examples registerPlugin("logger", ["level" => "short"]), registerPlugin("security"), registerPlugin("cors"), ],
3-如何创建使用插件?
import("@core/modules/plugin/createPlugin"); # Usage createPlugin("name", function () {});
4-如何使用使用插件?
注意:使用插件时,您应该使用这种方式
import("@core/hooks/usePlugin"); # Usage list(...) = usePlugin("name");
模板引擎
提供以 专业 的方式与模板一起工作,而不是使用常用的 PHP 模板引擎!
示例
之前 - views/user.php
<?php foreach ($users as $user): ?> <div class="user-card"> <span>ID: <?php echo $user['id'] ?> </span> <h3>Name: <?php echo $user['name'] ?> </h3> <p>CV: <?php echo $user['cv'] ?> </p> </div> <?php endforeach; ?>
之后 - views/user.hbs
@foreach ($users as $user) <div class="user-card"> <span>ID: {{ $user['id'] }} </span> <h3>Name: {{ $user['name'] }} </h3> <p>CV: {{ $user['cv'] }} </p> </div> @endforeach
注意:我们希望像专业人士一样使用定制的 .hbs 模板引擎,我们没有这样的 JS 库(handlebars)模板引擎,您应该知道我们有一个定制的模板引擎!
语法
{{ $variable }} # to Protect XSS attack {{{ $variable }}} # Not to Protect XSS attack {{!-- comment message --}} # Writing Comment
指令
条件
# Directives
@if(expression)
@elseif
@else
@endif
{{!-- Example --}} @if ($role == 'manager') <h3>Welcome Manager</h3> @elseif ($role == 'admin') <h3>Welcome Admin</h3> @else <h3>The Role is not valid!</h3> @endif
循环
# Directives
@foreach(expression)
@endforeach
@while(expression)
@endwhile
@break(expression)
@continue(expression)
{{!-- Example-1 --}} @foreach($users as $user) <div> <h3>Name: {{ $user['name'] }} </h3> <p>Email: {{ $user['email'] }} </p> </div> @endforeach {{!-- Example-2 --}} @while($count < 100) <p>Count: {{ $count }}</p> @countinue($count < 10) @break($count == 90) $count++; @endwhile
部分
# Directives
@include(partialPath)
{{!-- Example --}} @include("/includes/header") <h1>Welcome Page</h1> @include("/includes/footer")
脚本
# Directives
@style
@endstyle
@linkStyle
@script
@endScript
@linkScript
@php
@endphp
@dump
@dd
{{!-- Example-1 --}} @style * { box-sizing: border-box; color : #e5e5e5; } @endStyle @linkStyle("https://domain.com/bootstrap/styles/grid.min.css") {{!-- Example-2 --}} @script const username = promt('Enter your userName:') alert(username) @endscript @linkScript("https://domain.com/jquery/jquery.min.css") {{!-- Example-3 --}} @php $message = "Welcome to Lite PHP" echo $message; @endphp {{!-- Example-4 --}} @dump($message, true, []) @dd([1,2,3,4,5])
验证
# Directives
@isset(expression)
@endisset
@empty(expression)
@endempty
{{!-- Example-1 --}} @isset($user['isCheckedRole']) <p>User role is checked</p> @endisset {{!-- Example-2 --}} @empty($posts) <p>Here we don't have any posts!</p> @endempty
身份验证
# Directives
@auth
@endauth
@authRole
@endauthRole
@guest
@endguest
{{!-- Example-1 --}} @auth <a href="...">Dashboard Panel</a> @endauth {{!-- Example-2 --}} @authRole("admin") <a href="...">Admin Dashboard</a> @endauthRole {{!-- Example-3 --}} @guest <a href="...">Login</a> <a href="...">Register</a> @endguest
助手
导入
通过别名加载文件
import("@modules/user/_controller") $user = getUser(); print_r($user);
路由
在模块中添加新路由
注意:您可以通过两种方式使用它
- 添加单个路由
- 分组路由
# Usage import("@core/helpers/route"); # Single Route addRoute("GET", "/user", "showUser"); # /user # Group Route groupRoute("/page", function() { addRoute("GET", "/", "__app__index"); # /page/home addRoute("GET", "/users", "__user__index"); # /page/users addRoute("GET", "/courses", "__course__index"); # /page/courses });
DD
在浏览器中转储并终止数组
注意:您不需要加载助手,因为助手已经加载了!
$user = [ "id" => 1, "name" => "Robert", "skills" => ["PHP", ...] ]; # Usage dd($user); # to dump and die dd($user, false); # just to dump and no die
解析
获取文件内容
import("@core/helpers/parse"); $file = "links.txt"; # Usage $links = prase($file); $links = @prase($file); # use @ to get boolean or content if you don't want to get error forach ($links as $link) { echo "[Link] {$link}" . PHP_EOL; }
视图
渲染视图模板
import("@core/helpers/view"); # Example 1 view("welcome"); # Example 2 $user = [ "id" => 267 "title" => "User Page", "name" => "Robert", ] view("user", $user);
命令
添加新的命令以在控制台中使用
注意:您可以通过两种方式使用它
- 添加单个命令
- 分组命令
# Usage import("@core/helpers/command"); # Single Command addCommand("database", fn() => "Hi from Lite PHP", "Database status"); # php cli database # Group Command groupCommand("fake:", function() { addCommand("city", "action", "description"); # php cli fake:city addCommand("company", "action", "description"); # php cli fake:company addCommand("user", "action", "description"); # php cli fake:user addCommand("book", "action", "description"); # php cli fake:book });
测试
测试模块
注意:您可以通过两种方式测试
- 通过名称测试单个模块
- 测试所有模块
# Usage import("@core/helpers/test"); # Definition describe('test-info', function() { it("test-description", function() { # use Asserts ... # Read "core/helpers/assertion.php" to use in this logic code ! }); }); # Usage # Test All Modules php cli test # Test Single Module php cli test [module-name]
构建
构建新的路径和 URL
import("@core/helpers/build"); # Guide buildURL("/products"); # [pre defined => (host:port)] + route buildPath("/resources", "/lang/en/public"); # base path + path + file ext
钩子
注意:您应该在逻辑代码中使用钩子,不要在逻辑代码之外使用它们!
UseHTTP
提供使用 http 作为 $_SERVER 超全局变量
import("@core/hooks/useHTTP"); function inspectRequest() { $method = useHTTP("REQUEST_METHOD"); echo $method; # GET, POST, PUT, PATCH, DELETE }
UseGET
提供使用 $_GET 超全局变量
import("@core/hooks/useGET"); function inspectRequest() { $username = useGET("username"); $password = useGET("password"); dd([ "username" => $username, "password" => $password ]); }
UsePOST
提供使用 $_POST 超全局变量
import("@core/hooks/usePOST"); function inspectRequest() { $token = usePOST("token"); echo $token; }
UseFetch
提供发送 http 请求
示例
# Send GET Request import("@core/hooks/useFetch"); $response = useFetch("http://domain.com/end-point"); dd($response);
# Send POST Request $params = [ "method" => "POST", "body" => [], "headers" => [], ]; $response = useFetch("http://domain.com/end-point", $params); dd($response);
# Send PUT Request $params = [ "method" => "PUT", "body" => [], "headers" => [], ]; $response = useFetch("http://domain.com/end-point", $params); dd($response);
# Send PATCH Request $params = [ "method" => "PATCH", "body" => [], "headers" => [], ]; $response = useFetch("http://domain.com/end-point", $params); dd($response);
# Send DELETE Request $params = [ "method" => "DELETE", "body" => [], "headers" => [], ]; $response = useFetch("http://domain.com/end-point", $params); dd($response);
UseID
提供获取随机数字 ID
import("@core/hooks/useID"); function createUser($name, $email, $passowrd) { $id = useID(); # logic code ... }
UseConfig
提供通过键获取配置
注意:有时您不希望从钩子使用中获取错误,首先您应该在当前文件或脚本中加载目标模块配置!
import("@core/hooks/useConfig"); function createUser($name, $email, $passowrd) { $applicationName = useConfig("app.name"); # logic code ... }
UseEnum
提供通过键获取枚举
注意:有时您不希望从钩子使用中获取错误,首先您应该在当前文件或脚本中加载目标模块配置!
import("@core/hooks/useEnum"); function createUser($name, $email, $passowrd) { # User SQL Table $userTable = useEnum("User::TABLE"); # HTTP Statuses $HTTP_200 = useEnum("HTTP::OK"); $HTTP_201 = useEnum("HTTP::SUCCESS"); $HTTP_400 = useEnum("HTTP::BAD"); # logic code ... }
UseState
提供在 容器 中定义为 $GLOBALS['container'] 超全局变量的状态
注意:钩子有更多您可能会喜欢的选项
- 将状态定义为 "value"
- 将状态定义为 "key" & "value"
- 将状态定义为 "key"(嵌套)& "value"
import("@core/hooks/useState"); function createUser($id, $name, $email, $password) { $user = [ "email" => $email, "password" => $password ]; # First Way => Key & Value useState("users", [], $user); # Second Way => Key & Value useState("users", [$name], $user); # Third Way => Nested Keys & Value useState("users", [$id, $name], $user); # Then inspect $GLOBALS['container']['users'] # logic code ... }
UseGlobal
提供从 容器 中获取值作为 $GLOBALS['container'] 超全局变量
import("@core/hooks/useGlobal"); function listComamnds() { $comamnds = useGlobal("commands"); # $GLOBALS['container']['commands'] # logic code ... }
UseHash
提供散列密码
import("@core/hooks/useHash"); function createUser($name, $email, $passowrd) { $hashedPassword = useHash($password); # logic code ... }
UseVerifyPassword
提供验证散列密码
import("@core/hooks/useVerifyPassword"); function checkPassword($password, $hashedPassowrd) { $isValidPassword = useVerifyPassword($password, $hashedPassword); # logic code ... }
UseVerifyPassword
提供验证散列密码
import("@core/hooks/useVerifyPassword"); function checkPassword($password, $hashedPassowrd) { $isValidPassword = useVerifyPassword($password, $hashedPassword); # logic code ... }
UseHTML
提供通过 URL 获取 HTML 内容
import("@core/hooks/useHTML"); function getSiteHtmlContent($url) { $html = useHTML($url); # logic code ... }
UseMode
提供从 ".env" 中获取当前应用程序模式作为 APP_MODE (生产 | 开发)
import("@core/hooks/useMode"); function getApplicationModeStatus() { $mode = useMode(); # Production | Development # logic code ... }
UseEnv
提供通过键从 ".env" 中获取环境变量
import("@core/hooks/useEnv"); function createDatabaseConnection() { $db = useEnv("DATABASE_DB"); $host = useEnv("DATABASE_HOST"); $username = useEnv("DATABASE_USER"); $password = useEnv("DATABASE_PASS"); # logic code ... }
UseLog
提供记录消息
import("@core/hooks/useLog"); function showDashboardPage() { useLog("Admin Logged in!"); # logic code ... }
UsePlugin
提供使用具有使用类型的插件
import("@core/hooks/usePlugin"); function getShortLink($longURL) { [...] = usePlugin("shortLink"); # logic code ... }
UseQuery
提供运行SQL查询
import("@core/hooks/useQuery"); function createUser($name, $email, $passowrd) { useQuery("INSERT INTO `users` (name, email, password) VALUES (?, ?, ?)", [$name, $email, $passowrd]); # logic code ... } function doLogin($email, $passowrd) { $user = useQuery("SELECT * FROM `users` WHERE email = ?", [$email]); dd($user); # logic code ... }
UseResponse
提供将内容输出作为JSON | HTML | TEXT返回到响应
注意:您不需要在头部设置content-type,因为钩子已经完成了这项工作
- @参考:core/hooks/useType
- @参考:core/hooks/useResponse
import("@core/hooks/useResponse"); function showLoginPage() { $form = " <form action='' method='POST'> <input type='email' name='email' /> <input type='password' name='password' /> <button type='submit'>Login</button> </form> "; return useResponse("html", $form); }
UseRequest
提供请求数据
import("@core/hooks/useRequest"); function inspectRequest() { $host = useRequest("host"); # site.com $ip = useRequest("ip"); # 192.168.1.1 $method = useRequest("method"); # GET | POST | PUT | PATCH | DELETE $protocol = useRequest("protocol"); # HTTP | HTTPS $query = useRequest("query"); # LIKE /product/?category='mobile'&limit=10 $route = useRequest("route"); # /products $routeParams = useRequest("params"); # /product/{id} => ["id" => 171] $userAgent = useRequest("userAgent"); # ... # logic code ... }
UseRedirect
提供重定向到路由
import("@core/hooks/useRedirect"); function inspectRequest() { $isValidUser = true; if($isValidUser) { useRedirect("/dashboard"); } # logic code ... }
UseURL
提供解析URL
import("@core/hooks/useURL"); function inspectRequest() { $parsedURL = useURL("https://:5000/api/v1/products/?limit=25"); dd($parsedURL); # logic code ... }
UseBody
提供获取请求体数据
import("@core/hooks/useBody"); function inspectRequest() { $token = useBody("token"); # logic code ... }
UseHeader
提供通过键和值添加和移除头部
import("@core/hooks/useHeader"); function inspectRequest() { $fakeUserAgent = "..."; # add useHeader("HTTP_USER_AGENT", $fakeUserAgent); # remove useHeader("X-Powered-By"); # logic code ... }
UseMatch
提供使用正则表达式
import("@core/hooks/useMatch"); function isValidEmail($email) { $regexPattern = "/^\w+@gmail.com$/"; $result = useMatch($regexPattern, $email); dd($result); # logic code ... }
UseFlash
提供添加和移除flash消息
import("@core/hooks/useFlash"); function doLogin() { useFlash("login", "Invalid Email or Password!"); # logic code ... }