arefshojaei/lite-php

微型PHP框架

安装: 0

依赖关系: 0

建议者: 0

安全: 0

星级: 4

观察者: 1

分支: 0

开放问题: 0

类型:项目

dev-main 2024-07-30 13:33 UTC

This package is auto-updated.

Last update: 2024-09-30 13:58:41 UTC


README

Picture

教程

  1. 介绍
  2. 安装
  3. 文件夹结构
  4. 根文件
  5. 模块
  6. 模板引擎
  7. 助手
  8. 钩子

介绍

什么是 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")

插件

注册新的插件

注意:我们有两种使用插件的方式

  1. 运行类型需要在 "bootstrap/providers.php" 中注册
  1. 使用类型需要在 逻辑代码 中使用

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);

路由

在模块中添加新路由

注意:您可以通过两种方式使用它

  1. 添加单个路由
  1. 分组路由
# 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);

命令

添加新的命令以在控制台中使用

注意:您可以通过两种方式使用它

  1. 添加单个命令
  1. 分组命令
# 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
});

测试

测试模块

注意:您可以通过两种方式测试

  1. 通过名称测试单个模块
  1. 测试所有模块
# 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'] 超全局变量的状态

注意:钩子有更多您可能会喜欢的选项

  1. 将状态定义为 "value"
  1. 将状态定义为 "key" & "value"
  1. 将状态定义为 "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 ...
}