Lite-PHP is a Micro Freamework for developing Back-end Applications
Because Lite-PHP has:
- Simple & Fast Development Env
- Modular Strucutre
- DBMS Like Mysql
- Testing Module
- Custom Plugins & Hooks
- Custom Command-line in console
- REST API Development
- Functional Programming Structure
- Folder Strucutre
- No OOP & No Object & No Class
Note:
-
Your PHP version must be 8.0 >=
-
Clone this framework in a folder then run that by a Web-server + Mysql
git clone https://github.com/ArefShojaei/Lite-PHP
Finally , you will see the welcome page
Here is default folder structure for starting new project !
|- bootstrap/
|
|- console/
|
|- core/
|
|- hooks/
|
|- modules/
|
|- plugins/
|
|- public/
|
|- resources/
|
|- storage/
|
|
|- .env.example
|- .gitignore
|- .htaccess
|- .cli
|- gulpfile.mjs
|- package.json
|- .README.md
|- server.php
This folder is main files or Lite-PHP core files that can be provided base files for every projects!
This folder is base files to init the app
This folder is modules that the app needs to run as main file
This folder lets you to development custom hooks
This folder lets you to development custom plugin
This folder is entry point to run the app
This folder is asset and view files
This folder management the log, cache and upload files
This is a config for env , Then before starting the project you must changed it from .env.example to .env file!
This is a config to hide files to not push on Github
This is a config for Apache web-server
This is console configuration to use commands
This is Task-runner configuration for assets
This is list of pacakge dependencies that the Task-runner needs to run
This is an info about Lite-PHP
This is main file for launching the app
This module provides to register custom Alias
# Before
require_once "../../../modules/user/_controller.php";
require_once "../console/commands/package/_main.php";
# After
import("@modules/user/_controller") # without using '.php' ext
import("@commands/package/_main") # without using '.php' ext
Move to "bootstrap/alias.php" Then, register an Alias by this way :
createAlias([
# Guide
"@<alias-name>" => dirname(__DIR__) . "path",
# Example
"@core" => dirname(__DIR__) . "/core",
"@modules" => dirname(__DIR__) . "/modules",
...
]);
This module registers new configuration for a module
import("@core/modules/config/createConfig");
createConfig("config-name", [
"key" => "value"
])
import("@core/hooks/useConfig");
# Usage
useConfig("config-name.key")
This module registers an Enum as constant
import("@core/modules/enum/createEnum");
createEnum("enum-name", [
"KEY" => "value"
])
import("@core/hooks/useEnum");
# Usage
useEnum("enum-name::KEY")
This module registers new Plugin
Note: We have two types for using plugin :
-
Runner Type needs to register in "bootstrap/providers.php"
-
Usage Type needs to use in logic code
import("@core/modules/plugin/createPlugin");
# Usage
createPlugin("plugin-name", function ($params) {}, false);
Move to "bootstrap/providers.php" , then use this way to register the Runner Plugin
"plugins" => [
# Examples
registerPlugin("logger", ["level" => "short"]),
registerPlugin("security"),
registerPlugin("cors"),
# Usage
registerPlugin("plugin-name"),
],
import("@core/modules/plugin/createPlugin");
# Usage
createPlugin("plugin-name", function () {});
Note: for using the plugin, you should use this way
import("@core/hooks/usePlugin");
# Usage
list(...) = usePlugin("plugin-name");
This helper loads file by Alias
import("@modules/user/_controller")
$user = getUser();
print_r($user);
This helper lets you to add a new Route in a module
Note: You can use it by two ways:
- Add Single Route
- Group Routes
# 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
});
This helper lets you to dump and die an Array in Browser as Client
Note : You don't need to load the helper, Because the helper has loaded !
$user = [
"id" => 1,
"name" => "Robert",
"skills" => ["PHP", ...]
];
# Usage
dd($user); # to dump and die
dd($user, false); # just to dump and no die
This helper lets you to get file content
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;
}
This helper lets you to render view template
import("@core/helpers/view");
# Example 1
view("welcome");
# Example 2
$user = [
"id" => 267
"title" => "User Page",
"name" => "Robert",
]
view("user", $user);
This helper lets you to add a new Command to use in console
Note: You can use it by two ways:
- Add Single Command
- Group Commands
# 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
});
This helper lets you to test module
Note: You can test by two ways:
- Test single module by name
- Test all modules
# 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]
Finally, you will see the result in console.
This helper lets you to build new path & URL
import("@core/helpers/build");
# Guide
buildURL("/products"); # [pre defined => (host:port)] + route
buildPath("/resources", "/lang/en/public"); # base path + path + file ext
This helper lets you to build new path & URL
import("@core/helpers/build");
# Guide
buildURL("/products"); # [pre defined => (host:port)] + route
buildPath("/resources", "/lang/en/public"); # base path + path + file ext
Note: You should use hooks in logic code and don't use that outer of logic code!
This hook provides to use http as $_SERVER super global
import("@core/hooks/useHTTP");
function inspectRequest() {
$method = useHTTP("REQUEST_METHOD");
echo $method; # GET, POST, PUT, PATCH, DELETE
}
This hook provides to use $_GET super global
import("@core/hooks/useGET");
function inspectRequest() {
$username = useGET("username");
$password = useGET("password");
dd([
"username" => $username,
"password" => $password
]);
}
This hook provides to use $_POST super global
import("@core/hooks/usePOST");
function inspectRequest() {
$token = usePOST("token");
echo $token;
}
This hook provides to send http request
import("@core/hooks/useFetch");
# Examples
# Send GET Request
function sendGetRequest() {
$response = useFetch("http://domain.com/end-point");
dd($response);
}
// Send POST Request
function sendPostRequest() {
$params = [
"method" => "POST",
"body" => [],
"headers" => [],
];
$response = useFetch("http://domain.com/end-point", $params);
dd($response);
}
// Send PUT Request
function sendPutRequest() {
$params = [
"method" => "PUT",
"body" => [],
"headers" => [],
];
$response = useFetch("http://domain.com/end-point", $params);
dd($response);
}
// Send PATCH Request
function sendPatchRequest() {
$params = [
"method" => "PATCH",
"body" => [],
"headers" => [],
];
$response = useFetch("http://domain.com/end-point", $params);
dd($response);
}
This hooks provides to get random number ID
import("@core/hooks/useID");
function createUser($name, $email, $passowrd) {
$id = useID();
# logic code ...
}
This hooks provides to get Config by key
Note: sometimes you dont' want to get error for getting value from the hook usage, First you should load target module configuration in current file or script !
import("@core/hooks/useConfig");
function createUser($name, $email, $passowrd) {
$applicationName = useConfig("app.name");
# logic code ...
}
This hooks provides to get Enum by key
Note: sometimes you dont' want to get error for getting value from the hook usage, First you should load target module configuration in current file or script !
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 ...
}
This hooks provides to define state in container as $GLOBALS['container'] super global
Note: The hook has more option that you will like that
- Define state as "value"
- Define state as "key" & "value"
- Define state as "key" (Nested) & "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 ...
}
This hooks provides to get value from container as $GLOBALS['container'] super global
import("@core/hooks/useGlobal");
function listComamnds() {
$comamnds = useGlobal("commands"); # $GLOBALS['container']['commands']
# logic code ...
}
This hooks provides to hash password
import("@core/hooks/useHash");
function createUser($name, $email, $passowrd) {
$hashedPassword = useHash($password);
# logic code ...
}
This hooks provides to verify hashed password
import("@core/hooks/useVerifyPassword");
function checkPassword($password, $hashedPassowrd) {
$isValidPassword = useVerifyPassword($password, $hashedPassword);
# logic code ...
}
This hooks provides to verify hashed password
import("@core/hooks/useVerifyPassword");
function checkPassword($password, $hashedPassowrd) {
$isValidPassword = useVerifyPassword($password, $hashedPassword);
# logic code ...
}
This hooks provides to get html content by url
import("@core/hooks/useHTML");
function getSiteHtmlContent($url) {
$html = useHTML($url);
# logic code ...
}
This hooks provides to get current app mode from ".env" as APP_MODE ( Production | Development )
import("@core/hooks/useMode");
function getApplicationModeStatus() {
$mode = useMode(); # Production | Development
# logic code ...
}
This hooks provides to get env from ".env" by key
import("@core/hooks/useEnv");
function createDatabaseConnection() {
$db = useEnv("DATABASE_DB");
$host = useEnv("DATABASE_HOST");
$username = useEnv("DATABASE_USER");
$password = useEnv("DATABASE_PASS");
# logic code ...
}
This hooks provides to put log message
import("@core/hooks/useLog");
function showDashboardPage() {
useLog("Admin Logged in!");
# logic code ...
}
This hooks provides to use plugins that has usage type
import("@core/hooks/usePlugin");
function getShortLink($longURL) {
[...] = usePlugin("shortLink");
# logic code ...
}
This hooks provides to run SQL query
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 ...
}
This hooks provides to return content output to the response as JSON | HTML | TEXT
Note : You don't need to set content-type in header, Because the hook has done it
@Reference : core/hooks/useType
@Reference : 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);
}
This hooks provides the request data
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 ...
}
This hooks provides to redirect to a route
import("@core/hooks/useRedirect");
function inspectRequest() {
$isValidUser = true;
if($isValidUser) {
useRedirect("/dashboard");
}
# logic code ...
}
This hooks provides to parse URL
import("@core/hooks/useURL");
function inspectRequest() {
$parsedURL = useURL("http://localhost:5000/api/v1/products/?limit=25");
dd($parsedURL);
# logic code ...
}
This hooks provides to get the request body data
import("@core/hooks/useBody");
function inspectRequest() {
$token = useBody("token");
# logic code ...
}
This hooks provides to add & remove header by key and value
import("@core/hooks/useHeader");
function inspectRequest() {
$fakeUserAgent = "...";
# add
useHeader("HTTP_USER_AGENT", $fakeUserAgent);
# remove
useHeader("X-Powered-By");
# logic code ...
}
This hooks provides to use regex
import("@core/hooks/useMatch");
function isValidEmail($email) {
$regexPattern = "/^\[email protected]$/";
$result = useMatch($regexPattern, $email);
dd($result);
# logic code ...
}
This hooks provides to add & remove falsh message
import("@core/hooks/useFlash");
function doLogin() {
useFlash("login", "Invalid Email or Password!");
# logic code ...
}