alishahidi / apantos
The Apantos Framework.
Installs: 15
Dependents: 0
Suggesters: 0
Security: 0
Stars: 15
Watchers: 1
Forks: 2
Open Issues: 2
Type:project
Requires
- php: >=8.1.0
- defuse/php-encryption: ^2.3
- ezyang/htmlpurifier: ^4.14
- firebase/php-jwt: ^6.1
- gregwar/captcha: ^1.1
- intervention/image: ^2.7
- league/flysystem-ftp: ^3.1
- morilog/jalali: ^3.3
- phpmailer/phpmailer: ^6.6
- ramsey/uuid: ^4.3
- symfony/filesystem: ^6.0
- symfony/finder: ^6.0
- symfony/polyfill: ^1.25
- symfony/var-dumper: ^6.0
- vlucas/phpdotenv: ^5.4
Requires (Dev)
- laravel/pint: ^1.1
README
TABLE OF CONTENTS
- What is apantos
- How create first Apantos project
- What is framework architecture ?
- Directory Structure
- Directory explanation
- Routing system
- Controllers
- Model
- Orm
- View
- Auth system
What is apantos
Apantos is a fast and simple framework based on php with security methods and dedicated orm. Modularly
How create first Apantos project
This project available on composer packagist
you can easily install by composer create-project
composer create-project alishahidi/apantos
for serve project on port 8000
php -S 127.0.0.1:8000 -t public
Set tokens
after create project you must set .env CRYPT_TOKEN
& TOKEN
variable
by default /api/token
url set for get valid token
using this url 2 time and save gived token into env variables
recommended remove token api route after saving token from /routes/api
What is framework architecture ?
this framework use mvc architecture
models in app/Models views in resources/view controllers in app/Controllers
Directory Structure
- app - Http - Controllers - Request - Services - Models - Providers - bootstrap - /bootstrap.php/ - config - /app.php/ - /database.php/ - /image.php/ - /mail.php/ - database - migrations - public - /index.php/ - resources - view - routes - /api.php/ - /web.php/ - storage - fonts - images - system
Directory explanation
app
Important directory contain controllers and request and .... for manage routes handlers and check form input and more
Http
Contain web request handlers and services
Controllers
Management classes for routes
standard name: NameController.php
Request
User input checkers
standard name: NameRequest.php
Services
Refactored classes
standard name: Name.php
Models
Database Models
standard name Name.php
Use singular nouns
Providers
Providers run each request if stored in config file
standard name: NameProvider.php
bootstrap
contain bootstrap.php
file
The job of this file is to load the framework
public
this direcotry serve as root directory
every request must be redirect to index.php
file
resources
contain view direcotry
view
contain views direcotry & php file
standard name for use apts template engine: view.apts.php
standard name for normal use without template engine: view.php
routes
web.php
for web request routes
api.php
for api request routes
storage
for in project files ex: files used for packages
system
kernel of framework
Routing system
all routes available in routes/{web, api}.php file
How create route
Note
web route start from / api routes start from /api
Argvs
- url
- Controller with namespace & class function name after @
- route name
Get
Route::get('/', "Home\HomeController@index", 'home.index');
Post
Route::post('/login', "Auth\LoginController@login", 'auth.login');
Put
Route::put('/admin/article/update/{id}', "Admin\ArticleController@update", 'admin.article.update');
Delete
Route::delete('/admin/article/delete/{id}', "Admin\ArticleController@destroy",'admin.article.delete');
Controllers
controllers called by routing system
controllers must be set in Route
method
create your Controllers in app/Http/Controller like this
namespace App\Http\Controllers\Home; use App\Http\Controllers\Controller; class HomeController extends Controller { public function index() { return "Hi"; } }
for use this example you must set Route for called index method in HomeController
Route::get('/', "Home\HomeController@index", 'home.index');
now if open / url in your browser you can see “Hi” message;
Model
create your models in app/Models like this
namespace App\Models; use System\Database\ORM\Model; use System\Database\Traits\HasSoftDelete; class User extends Model { use HasSoftDelete; protected $table = 'users'; protected $fillable = ['name', 'email', 'password', 'avatar', 'permissions', 'bio']; protected $casts = ['permission' => 'arrray'] }
use Use singular nouns for Model name and set full name of table in protected $table
you must set fillable table column in protected $fillable
id, create_at, updated_at, deleted_at exist by default in fillables
casts can convert arrays to safe string for stored in database and can convert string to array when you get record from database
Orm
Example tables
users
categories
tags
posts
post_tag
comments
create
add record
argvs
- values:array
use
$user = User::create([ 'username' => 'ali', 'password' => 'test', 'phone_number' => '+319021243' ]); $insertId = $user->insertId;
or
$user = new User(); $user->username = 'ali'; $user->password = 'test'; $user->phone_number = '+30231234401'; $user->save();
update
update record
argvs
- values:array => with primary id
use
$user = User::update([ 'id' => 1, 'username' => 'alishahidi' ]); // change ali username to alishahidi
or
$user = User::find(1); $user->username = 'alishahidi'; $user->save();
delete
delete record
argvs
- primary id
use
User::delete(1);
all
give all records
use
$users = User::all(); foreach($users as $user) echo $user->useranem; // output // ali // alex // pop
find
give user where id = $id
argvs
- primary id
use
$user = User::find(1); $username = $user->username; // return ali
where
add where condition in query
argvs
if pass 2 argument it set operatino to =
- attribute
- value
if pass 3 argument it get operation from argument 2 and get value from argument 3
- attribute
- operatino
- value
use
// get first record $post = Post::where('title', 'post number 1')->get()[0]; $title = $post->title; // return "post number 1"
or
// return all record contain "number" in title $posts = Post::where('title', 'LIKE', "%number%")->get(); foreach($posts as $post) echo $post->title // output // post number 1 // post number 3
whereOr
like where
but with OR operation
whereNull
argvs
- attribute
use
// get records if cat_id is null $posts = Post::whereNull('cat_id')->get();
whereNotNull
argvs
- attribute
use
// get records if cat_id is not null | is set $posts = Post::whereNotNull('cat_id')->get();
whereIn
argvs
- attribute
- values:array
use
// get posts recotds if cat_id in 1, 2, 3 $posts = Post::whereIn('cat_id', [1, 2, 3])->get();
whereBetween
argvs
- attribute
- from
- to
use
// get records if id between 1..3 $posts = Post::whereBetween('id', 1, 3)->get();
randomOrder
randomize records order
argvs
- expression
use
$posts = Post::randomOrder('DESC')->get();
orderBy
argvs
- attribute
- expression
use
$posts = Post:orderBy('created_at', 'DESC')->get();
limit
argvs
- from
- number
use
// get first 3 records $posts = Post::limit(0, 3)->get();
count
use
// get cound of records $postsCount = Post::count(); // return 4
pagination
argvs
- perpage
use
// auto convert page_id with $_GET['_pageid'] $posts = Post::pagination(3);
Relationships
hasOne
argvs
- model class name
- foreign key
- local key
use
$user = Post::hasOne(User::class, 'user_id', 'id');
hasMany
argvs
- model class name
- foreign key
- local key
use
$comments = Post::hasMany(Comment::class, 'post_id', 'id')->get();
belongsTo
argvs
- model class name
- foreign key
- local key
use
$user = Post::belongTo(User::class, 'user_id', 'id')->get();
belongsToMany
argvs
- model class name
- pivot table
- local key
- pivot foreign key
- pivot other foreign key
- foreign key
use
$tags = Post::belongsToMany(Tag::class, 'article_tag', 'id', 'post_id', 'tag_id', 'id')->get(); // | *----------------------------------------------* | | | // | *-------------------------------------------------------* | | // *------------------------------------------------------------------------* | // *--------------------------------------------------------------------------------*
View
all views create in resources/view
apts template engine
- resources - view - home - layouts - master.apts.php - head-tag.apts.php - index.apts.php
home > layouts > master.apts.php
<!DOCTYPE html> <html lang="en"> <head> @include('home.layouts.head-tag') @yield('title') @yield('head-tag') </head> <body> @yield('content') </body> </html>
home > layouts > head-tag.apts.php
<meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
home > index.apts.php
@extends('app.layouts.app') @section('head-tag') <title>Apantos project</title> @endsection @section('content') <h2>Welcome to apantos project</h2> @endsection
render
replace / with . in your path path start in resources/view
view('home.index');
or
$message = 'Send message to view'; view('home.index', compact('message'));
example using in controller
namespace App\Http\Controllers\Home; use App\Http\Controllers\Controller; class HomeController extends Controller { public function index() { $message = 'Send message to view'; return view('home.index', compact('message')); } }
Auth system
auth using User mdoel by default
registerUser
argvs
- values:array
- password input name
- encrypt input name:array
use
$inputs = [ 'username' => 'alishahidi', 'password' => 'decoded-secret-from-form', 'phone_number' => '+13924324' 'secret' => 'top secret' ]; Auth::storeUser($inputs, 'password', ['secret']);
updateUser
argvs
- values:array
- allowed inputs:key=>value array
- password input name
- encrypt input name:array
use
$inputs = [ 'id' => 1, 'username' => 'ali', 'password' => 'decoded-secret-from-form', ]; Auth::updateUser($inputs, ['id', 'username', 'password'], 'password');
loginUsingEmail
argvs
- decoded password
- no user exist error message (opt)
- password wrong error message (opt)
- remember user (opt)
- user cookie validate time (opt)
use
Auth::loginEmailUsername('test@test.org', 'secret', "Username wrong.", "Password wrong", true, 4 * 24 * 60 * 60);
loginUsingUsername
like loginUsingEmail
but send username between email in first argument
loginUsingId
argvs
- id
use
Auth::loginUsingId(1);
logout
use
Auth::logout();
check
check user login => redirect to auth.login route name if not login
use
Auth::check();
checkLogin
check user login => return true/false
use
$isLogin = Auth::checkLogin();
user
return user if login
use
$user = Auth::user();
userUsingEmail
use
$user = Auth::userUsingEmail('test@test.org');
userUsingUsername
use
$user = Auth::userUsingUsername('ali');