- Introduction
- Installation
- Flow chart of process
- Folder Structure
- Root Files
- Modules
- Template Engine
- Cli ( console )
- Helpers
- Hooks
- useHTTP
- useGET
- usePOST
- useFetch
- useID
- useConfig
- useEnum
- useState
- useGlobal
- useHash
- usePasswordVerfiy
- useHTML
- useMode
- useEnv
- useLog
- useError
- usePlugin
- useQuery
- useResponse
- useRequest
- useRedirect
- useURL
- useBody
- useHeader
- useMatch
- useFlash
- useFile
- useUpload
- useCache
- useCookie
- useSession
- useToken
- useVerifyToken
- useValidator
- useAction
- useTable
- useRecord
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
composer create-project arefshojaei/lite-php
git clone https://github.com/ArefShojaei/Lite-PHP
Here is default folder structure for starting new project !
|- 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
Main files or Lite-PHP core files that can be provided base files for every projects!
Base files to boot the app
Modules that the app needs to run as main file
Lets you to development custom hooks
Lets you to development custom plugin
Static files in production with entry point file ( index.php )
Asset and View files
Local folder & files like Log, Cache & Upload ...
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
Apache web server config
Console configuration to use commands
Passport of package info
Task-runner configuration for assets
Basic setup configuration to development app
List of pacakge dependencies that the Task-runner needs to run
Lite-PHP Package info
This is configuration for crawlers of Google
Main file for launching the app
Registers custom Alias
# 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")
Move to "bootstrap/alias.php" Then, register an Alias by this way :
createAlias([
# Guide
"@<alias>" => dirname(__DIR__) . "path",
# Example
"@core" => dirname(__DIR__) . "/core",
"@modules" => dirname(__DIR__) . "/modules",
...
]);
Registers new configuration for a module
import("@core/modules/config/createConfig");
createConfig("name", [
"key" => "value"
]);
import("@core/hooks/useConfig");
# Usage
useConfig("name.key");
Registers an Enum as constant
import("@core/modules/enum/createEnum");
createEnum("name", [
"KEY" => "value"
]);
import("@core/hooks/useEnum");
# Usage
useEnum("name::KEY");
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 function or logic code
import("@core/modules/plugin/createPlugin");
# Usage
createPlugin("name", function ($params) {}, false);
Move to "bootstrap/providers.php" , then use this way to register the Runner Plugin
"plugins" => [
# Usage
registerPlugin("name"),
# Examples
registerPlugin("logger", ["level" => "short"]),
registerPlugin("security"),
registerPlugin("cors"),
],
import("@core/modules/plugin/createPlugin");
# Usage
createPlugin("name", function () {});
Note: for using the plugin, you should use this way
import("@core/hooks/usePlugin");
# Usage
list(...) = usePlugin("name");
Defines Schema for input data
import("@core/modules/validator/createValidator");
createValidator("post", [
"id" => [
"type" => "int",
"required" => true,
],
"title" => [
"type" => "string",
"min" => 20,
]
]);
import("@core/hooks/useValidator");
# Usage
$schema = "post",
$post = [
"id" => 1,
"title" => "Thanks for using the Micro Framework.",
];
$isValid = useValidator($schema, $post);
These are list of commands that can be done works to develop your application!
> php cli
░░ ░░ ░░░░░░░░ ░░░░░░░ ░░░░░░ ░░ ░░ ░░░░░░
▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒
▒▒ ▒▒ ▒▒ ▒▒▒▒▒ ▒▒▒▒▒▒ ▒▒▒▒▒▒▒ ▒▒▒▒▒▒
▓▓ ▓▓ ▓▓ ▓▓ ▓▓ ▓▓ ▓▓ ▓▓
███████ ██ ██ ███████ ██ ██ ██ ██
Micro PHP Framework
Welcome 🎉
Provides to work as professional with templates instead of using usual php template engine !
Before - 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; ?>
After - views/user.hbs
NOTE: We want to work it as professional with customized .hbs template engine and we don't have this like JS lib ( handlebars ) template engine and you should know about it that we have a customized template engine !
{{ $variable }} # to Protect XSS attack
{{{ $variable }}} # Not to Protect XSS attack
{{!-- comment message --}} # Writing Comment
Condition
# Directives
@if(expression)
@elseif
@else
@endif
Loop
# Directives
@foreach(expression)
@endforeach
@while(expression)
@endwhile
@break(expression)
@continue(expression)
Partial
# Directives
@include(partialPath)
Script
# Directives
@style
@endstyle
@linkStyle
@script
@endScript
@linkScript
@php
@endphp
@dump
@dd
Validation
# Directives
@isset(expression)
@endisset
@empty(expression)
@endempty
Auth
# Directives
@auth
@endauth
@authRole
@endauthRole
@guest
@endguest
Loads file by Alias
import("@modules/user/_controller")
$user = getUser();
print_r($user);
Adds 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
});
Dumps and dies an Array in browser
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 process
Gets file content
import("@core/helpers/parse");
$file = "links.txt";
# Usage
$links = prase($file);
$links = @prase($file); # use the @ to get boolean or content if you don't want to get error
forach ($links as $link) {
echo "[Link] {$link}" . PHP_EOL;
}
Renders view template
import("@core/helpers/view");
# Example 1
view("welcome");
# Example 2
$user = [
"id" => 267
"title" => "User Page",
"name" => "Robert",
]
view("user", $user);
Adds 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
});
Tests 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]
Throw HTTP error as Rendered page to show Error message
import("@core/helpers/abort");
# Usage
function bootstrap() {
abort(500, "Internal Server Error", ["package" => "LITE PHP"]);
}
Builds 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
Translates content
import("@core/helpers/translate");
# Text: Welcome message
"Translated: " . __("welcome"); # پیام خوش آمد گویی
# Text: Thanks :name for using :product
"Translated: " . __("introduce", [
"name" => "رابرت",
"product" => "This package"
]); # ممنون رابرت برای استفاده کردن از این پکیج
Provides to use helper functions for URL, Route and ...
import("@core/helpers/url");
# Get base URL
baseURL(); # Http://localhost:5000
# Get current route
url(); # /product/257
# Get current url
origin(); # Http://localhost:5000/product/257
# Build pointer Route to redirect to another route
toRoute("/users"); # Http://localhost:5000/users
Provides to use helper functions for Asset files
import("@core/helpers/assets");
# Get asset path
asset("/css/grid.css"); # resources/assets/css/grid.css
# CSS asset path
asset("/css/grid.css"); # resources/assets/css/grid.css
css("grid"); # resources/assets/css/grid.css
# JS asset path
asset("/js/state.js"); # resources/assets/js/state.js
js("state"); # resources/assets/js/state.js
# Image asset path
img("user.jpeg"); # resources/assets/img/user.jpeg
# Icon asset path
icon("logo.svg"); # resources/assets/img/logo.svg
Provides to validate data
import("@core/helpers/validator");
# Email validation
$email_1 = "[email protected]";
$email_2 = "[email protected]";
isEmail($email_1); # true
isEmail($email_2); # false
# URL validation
$url_1 = "http://localhost:5000";
$url_2 = "/categories/mobile/54673124";
isURL($url_1); # true
isURL($url_2); # false
Provides to assert data in unit test
-
Note: You must use it when you are writing tests that exists in every modules of app with _test.php file!
-
If you like to use more asserts, you should move to "core/helpers/assert.php" file
import("@core/helpers/asserts");
assertTrue(""); # false
assertTrue("This is a message"); # true
assertTrue(0); # false
assertTrue(1); # true
assertEmpty([]) # true
assertEmpty([1,2,3]) # false
# and more assert functions....
Note: You should use hooks in logic code and don't use that outer of logic code!
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
}
Provides to use $_GET super global
import("@core/hooks/useGET");
function inspectRequest() {
$username = useGET("username");
$password = useGET("password");
dd([
"username" => $username,
"password" => $password
]);
}
Provides to use $_POST super global
import("@core/hooks/usePOST");
function inspectRequest() {
$token = usePOST("token");
echo $token;
}
Provides to send http request
# Send GET Request
import("@core/hooks/useFetch");
$response = useFetch("http://domain.com/end-point");
dd($response);
# Send POST Request
import("@core/hooks/useFetch");
$params = [
"method" => "POST",
"body" => [],
"headers" => [],
];
$response = useFetch("http://domain.com/end-point", $params);
dd($response);
# Send PUT Request
import("@core/hooks/useFetch");
$params = [
"method" => "PUT",
"body" => [],
"headers" => [],
];
$response = useFetch("http://domain.com/end-point", $params);
dd($response);
# Send PATCH Request
import("@core/hooks/useFetch");
$params = [
"method" => "PATCH",
"body" => [],
"headers" => [],
];
$response = useFetch("http://domain.com/end-point", $params);
dd($response);
# Send DELETE Request
import("@core/hooks/useFetch");
$params = [
"method" => "DELETE",
"body" => [],
"headers" => [],
];
$response = useFetch("http://domain.com/end-point", $params);
dd($response);
Provides to get random number ID
import("@core/hooks/useID");
function createUser($name, $email, $passowrd) {
$id = useID();
# logic code ...
}
Provides to get Config by key
Note: Sometimes you don't 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 ...
}
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 ...
}
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 => nested keys & value
useState("users.{$name}", $user);
# Third way => nested keys & value
useState("users.{$id}.{$name}", $user);
# logic code ...
}
Provides to get value from container as $GLOBALS['container'] super global
import("@core/hooks/useGlobal");
function getPlugins() {
# First way => without nested key
$plugins = useGlobal("plugins"); # $GLOBALS['container']['plugins']
# Second way => with nested keys
$runnerPlugins = useGlobal("plugins.runner"); # $GLOBALS['container']['plugins']['runner']
$usagePlugins = useGlobal("plugins.usage"); # $GLOBALS['container']['plugins']['usage']
# logic code ...
}
Provides to hash password
import("@core/hooks/useHash");
function createUser($name, $email, $passowrd) {
$hashedPassword = useHash($password);
# logic code ...
}
Provides to verify hashed password
import("@core/hooks/useVerifyPassword");
function checkPassword($password, $hashedPassowrd) {
$isValidPassword = useVerifyPassword($password, $hashedPassword);
# logic code ...
}
Provides to get html content by url
import("@core/hooks/useHTML");
function getSiteHtmlContent($url) {
$html = useHTML($url);
# logic code ...
}
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 ...
}
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 ...
}
Provides to put log message
import("@core/hooks/useLog");
function showDashboardPage() {
useLog("Admin Logged in!");
# logic code ...
}
Provides to use plugins that has usage type
import("@core/hooks/usePlugin");
function getShortLink($longURL) {
[...] = usePlugin("shortLink");
# logic code ...
}
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 ...
}
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);
}
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 ...
}
Provides to redirect to a route
import("@core/hooks/useRedirect");
function inspectRequest() {
$isValidUser = true;
if($isValidUser) {
useRedirect("/dashboard");
}
# logic code ...
}
Provides to parse URL
import("@core/hooks/useURL");
function inspectRequest() {
$parsedURL = useURL("http://localhost:5000/api/v1/products/?limit=25");
dd($parsedURL);
# logic code ...
}
Provides to get the request body data
import("@core/hooks/useBody");
function inspectRequest() {
$token = useBody("token");
# logic code ...
}
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 ...
}
Provides to use regex
import("@core/hooks/useMatch");
function isValidEmail($email) {
$regexPattern = "/^\[email protected]$/";
$result = useMatch($regexPattern, $email);
dd($result);
# logic code ...
}
Provides to add & remove falsh message
import("@core/hooks/useFlash");
function doLogin() {
useFlash("login", "Invalid Email or Password!");
# logic code ...
}
Provides to get file from $_FILES
import("@core/hooks/useFile");
function addProfile() {
$profile = useFile("profile");
# logic code ...
}
Provides to upload file in local stroage
import("@core/hooks/useFile");
import("@core/hooks/useUpload");
function uploadProfile() {
$profile = useFile("profile");
$result = useUpload($profile);
# logic code ...
}
Provides to cache data
import("@core/hooks/useCache");
# Cache Data
function cachePostsData() {
$posts = [...];
useCache("posts", $posts);
# logic code ...
}
# Get cached data
function getCachedPostsData() {
$posts = useCache("posts");
# logic code ...
}
Provides to use cookie in process of app
import("@core/hooks/useCookie");
# Set cookie
useCookie("darkMode", true);
# Get the cookie
$darkModeState = useCookie("darkMode"); # true
# Set cookie params
useCookie("darkMode", rand(), [
"expireTime" => "",
"path" => "",
"domain" => "",
"secure" => "",
"httpOnly" => ""
]);
Provides to use session in process of app
import("@core/hooks/useSession");
# Set session
useSession("isLoggedIn", true);
# Get the session
$loginState = useSession("isLoggedIn"); # true
# Get list of all sessions
$sessions = useSession();
Provides to generate new token
import("@core/hooks/useToken");
function doLogin() {
$user = [
"username" => "Robert",
"password" => 12345
];
$token = useToken($user, "secretKey");
# logic code ...
}
Provides to verify token
import("@core/hooks/useVerifyToken");
function exportLogs() {
$token = "...";
$isValidUser = useVerifyToken($token,"secretKey");
# logic code ...
}
Provides to validate input data
import("@core/hooks/useValidator");
function validatePost() {
$schema = "post";
$post = [
"id" => 1,
"title" => "What is LITE PHP?",
"body" => "Micro PHP Freamework!"
];
$isValid = useValidator($schema, $post);
# logic code ...
}
Provides to save action in local database
import("@core/hooks/useAction");
function addTodo() {
useAction("ADD_TODO");
$todo = [
"id" => rand(),
"title" => "Done login page",
"timestamp" => time()
];
# logic code ...
}
Provides to save data in local database
import("@core/hooks/useRecord");
function addTodo() {
$todo = [
"id" => rand(),
"timestamp" => time()
];
useRecord("todos", $todo["title"], $todo["timestamp"]);
# logic code ...
}
Provides to get & delete data in local database
import("@core/hooks/useTable");
function getTimestamp() {
$result = useTable('actions', 'NEW_TASK');
# Logic code ...
}
import("@core/hooks/useTable");
function deleteAction() {
$result = useTable('actions', 'NEW_TASK', $action = TABLE_DELETE_ACTION);
# Logic code ...
}