alishahidi / apantos

Apantos is a fast and simple framework based on php with security methods and dedicated orm. Modularly
https://packagist.org/packages/alishahidi/apantos
15 stars 2 forks source link
fast framework lightweight php security

+TITLE: Apantos doc - main

+AUTHOR: Ali Shahidi

+DESCRIPTION: Apantos document main page

+OPTIONS: num:nil ^:{}

Apantos is a fast and simple framework based on php with security methods and dedicated orm. Modularly

This project available on composer packagist you can easily install by =composer create-project=

+begin_src sh

composer create-project alishahidi/apantos

+end_src

for serve project on port 8000

+begin_src sh

php -S 127.0.0.1:8000 -t public

+end_src

** 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=

this framework use mvc architecture

models in app/Models views in resources/view controllers in app/Controllers

+begin_example

+end_example

** 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

all routes available in routes/{web, api}.php file

** How create route

*** Note

web route start from / api routes start from /api

*** Argvs

  1. url
  2. Controller with namespace & class function name after @
  3. route name

*** Get

+begin_src php

Route::get('/', "Home\HomeController@index", 'home.index');

+end_src

*** Post

+begin_src php

Route::post('/login', "Auth\LoginController@login", 'auth.login');

+end_src

*** Put

+begin_src php

Route::put('/admin/article/update/{id}', "Admin\ArticleController@update", 'admin.article.update');

+end_src

*** Delete

+begin_src php

Route::delete('/admin/article/delete/{id}', "Admin\ArticleController@destroy",'admin.article.delete');

+end_src

controllers called by routing system

controllers must be set in =Route= method

create your Controllers in app/Http/Controller like this

+begin_src php

namespace App\Http\Controllers\Home;

use App\Http\Controllers\Controller;

class HomeController extends Controller { public function index() { return "Hi"; } }

+end_src

for use this example you must set Route for called index method in HomeController

+begin_src php

Route::get('/', "Home\HomeController@index", 'home.index');

+end_src

now if open / url in your browser you can see "Hi" message;

create your models in app/Models like this

+begin_src php

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']

}

+end_src

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

** Example tables

*** users

| id | username | password | phone_number | |----+----------+----------+--------------| | 1 | ali | test | +11843019 | | 2 | alex | test | +32095u023 | | 3 | pop | test | +3925253 |

*** categories

| id | name | |----+-------| | 1 | linux | | 2 | emacs | | 3 | php |

*** tags

| id | name | |----+-------| | 1 | linux | | 2 | emacs | | 3 | php | | 4 | json |

*** posts

| id | title | cat_id | description | |----+---------------+--------+------------------------------| | 1 | post number 1 | 1 | description of post number 1 | | 2 | post 2 | 1 | description of post number 2 | | 3 | post number 3 | 2 | description of post number 3 | | 4 | post 4 | 3 | description of post number 4 |

*** post_tag

| id | post_id | tag_1 | |----+---------+-------| | 1 | 1 | 1 | | 2 | 1 | 2 | | 3 | 2 | 1 | | 4 | 2 | 3 |

*** comments

| id | user_id | post_id | comment | |----+---------+---------+-----------| | 1 | 1 | 2 | comment 1 | | 2 | 2 | 2 | comment 2 | | 3 | 1 | 1 | comment 3 |

** create

add record

*** argvs

  1. values:array

*** use

+begin_src php

$user = User::create([ 'username' => 'ali', 'password' => 'test', 'phone_number' => '+319021243' ]);

$insertId = $user->insertId;

+end_src

or

+begin_src php

$user = new User(); $user->username = 'ali'; $user->password = 'test'; $user->phone_number = '+30231234401'; $user->save();

+end_src

** update

update record

*** argvs

  1. values:array => with primary id

*** use

+begin_src php

$user = User::update([ 'id' => 1, 'username' => 'alishahidi' ]);

// change ali username to alishahidi

+end_src

or

+begin_src php

$user = User::find(1); $user->username = 'alishahidi'; $user->save();

+end_src

** delete

delete record

*** argvs

  1. primary id

*** use

+begin_src php

User::delete(1);

+end_src

** all

give all records

*** use

+begin_src php

$users = User::all(); foreach($users as $user) echo $user->useranem;

// output

// ali
// alex
// pop

+end_src

** find

give user where id = $id

*** argvs

  1. primary id

*** use

+begin_src php

$user = User::find(1); $username = $user->username; // return ali

+end_src

** where

add where condition in query

*** argvs

if pass 2 argument it set operatino to =

  1. attribute
  2. value

if pass 3 argument it get operation from argument 2 and get value from argument 3

  1. attribute
  2. operatino
  3. value

*** use

+begin_src php

// get first record $post = Post::where('title', 'post number 1')->get()[0]; $title = $post->title; // return "post number 1"

+end_src

or

+begin_src php

// 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

+end_src

** whereOr

like =where= but with OR operation

** whereNull

*** argvs

  1. attribute

*** use

+begin_src php

// get records if cat_id is null $posts = Post::whereNull('cat_id')->get();

+end_src

** whereNotNull

*** argvs

  1. attribute

*** use

+begin_src php

// get records if cat_id is not null | is set $posts = Post::whereNotNull('cat_id')->get();

+end_src

** whereIn

*** argvs

  1. attribute
  2. values:array

*** use

+begin_src php

// get posts recotds if cat_id in 1, 2, 3 $posts = Post::whereIn('cat_id', [1, 2, 3])->get();

+end_src

** whereBetween

*** argvs

  1. attribute
  2. from
  3. to

*** use

+begin_src php

// get records if id between 1..3 $posts = Post::whereBetween('id', 1, 3)->get();

+end_src

** randomOrder

randomize records order

*** argvs

  1. expression

*** use

+begin_src php

$posts = Post::randomOrder('DESC')->get();

+end_src

** orderBy

*** argvs

  1. attribute
  2. expression

*** use

+begin_src php

$posts = Post:orderBy('created_at', 'DESC')->get();

+end_src

** limit

*** argvs

  1. from
  2. number

*** use

+begin_src php

// get first 3 records $posts = Post::limit(0, 3)->get();

+end_src

** count

*** use

+begin_src php

// get cound of records $postsCount = Post::count(); // return 4

+end_src

** pagination

*** argvs

  1. perpage

*** use

+begin_src php

// auto convert page_id with $_GET['_pageid'] $posts = Post::pagination(3);

+end_src

** Relationships

*** hasOne

**** argvs

  1. model class name
  2. foreign key
  3. local key

**** use

+begin_src php

$user = Post::hasOne(User::class, 'user_id', 'id');

+end_src

*** hasMany

**** argvs

  1. model class name
  2. foreign key
  3. local key

**** use

+begin_src php

$comments = Post::hasMany(Comment::class, 'post_id', 'id')->get();

+end_src

*** belongsTo

**** argvs

  1. model class name
  2. foreign key
  3. local key

**** use

+begin_src php

$user = Post::belongTo(User::class, 'user_id', 'id')->get();

+end_src

*** belongsToMany

**** argvs

  1. model class name
  2. pivot table
  3. local key
  4. pivot foreign key
  5. pivot other foreign key
  6. foreign key

**** use

+begin_src php

$tags = Post::belongsToMany(Tag::class, 'article_tag', 'id', 'post_id', 'tag_id', 'id')->get(); // | ---------------------------------------------- | | | // | ------------------------------------------------------- | | // ------------------------------------------------------------------------ | // --------------------------------------------------------------------------------

+end_src

all views create in resources/view

** apts template engine

maby replace twig template engine in next versions

+begin_example

+end_example

*** home > layouts > master.apts.php

+begin_src html

<!DOCTYPE html>

@include('home.layouts.head-tag') @yield('title') @yield('head-tag') @yield('content')

+end_src

*** home > layouts > head-tag.apts.php

+begin_src html

+end_src

*** home > index.apts.php

+begin_src html

@extends('app.layouts.app')

@section('head-tag')

Apantos project

@endsection

@section('content')

Welcome to apantos project

@endsection

+end_src

** render

replace / with . in your path path start in resources/view

+begin_src php

view('home.index');

+end_src

or

+begin_src php

$message = 'Send message to view'; view('home.index', compact('message'));

+end_src

*** example using in controller

+begin_src php

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

+end_src

auth using User mdoel by default

** registerUser

*** argvs

  1. values:array
  2. password input name
  3. encrypt input name:array

*** use

+begin_src php

$inputs = [ 'username' => 'alishahidi', 'password' => 'decoded-secret-from-form', 'phone_number' => '+13924324' 'secret' => 'top secret' ];

Auth::storeUser($inputs, 'password', ['secret']);

+end_src

** updateUser

*** argvs

  1. values:array
  2. allowed inputs:key=>value array
  3. password input name
  4. encrypt input name:array

*** use

+begin_src php

$inputs = [ 'id' => 1, 'username' => 'ali', 'password' => 'decoded-secret-from-form', ];

Auth::updateUser($inputs, ['id', 'username', 'password'], 'password');

+end_src

** loginUsingEmail

*** argvs

  1. email
  2. decoded password
  3. no user exist error message (opt)
  4. password wrong error message (opt)
  5. remember user (opt)
  6. user cookie validate time (opt)

*** use

+begin_src php

Auth::loginEmailUsername('test@test.org', 'secret', "Username wrong.", "Password wrong", true, 4 24 60 * 60);

+end_src

** loginUsingUsername

like =loginUsingEmail= but send username between email in first argument

** loginUsingId

*** argvs

  1. id

*** use

+begin_src php

Auth::loginUsingId(1);

+end_src

** logout

*** use

+begin_src php

Auth::logout();

+end_src

** check

check user login => redirect to auth.login route name if not login

*** use

+begin_src php

Auth::check();

+end_src

** checkLogin

check user login => return true/false

*** use

+begin_src php

$isLogin = Auth::checkLogin();

+end_src

** user

return user if login

*** use

+begin_src php

$user = Auth::user();

+end_src

** userUsingEmail

*** use

+begin_src php

$user = Auth::userUsingEmail('test@test.org');

+end_src

** userUsingUsername

*** use

+begin_src php

$user = Auth::userUsingUsername('ali');

+end_src