TABLE OF CONTENTS :toc:
[[#what-is-apantos][What is apantos]]
[[#how-create-first-apantos-project][How create first Apantos project]]
[[#what-is-framework-architecture-][What is framework architecture ?]]
[[#directory-structure][Directory Structure]]
[[#directory-explanation][Directory explanation]]
[[#routing-system][Routing system]]
[[#controllers][Controllers]]
[[#model][Model]]
[[#orm][Orm]]
[[#view][View]]
[[#auth-system][Auth system]]
What is apantos
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=
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=
this framework use mvc architecture
models in app/Models views in resources/view controllers in app/Controllers
** 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
*** 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 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;
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
** 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
*** 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
*** 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
*** 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
*** 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 =
if pass 3 argument it get operation from argument 2 and get value from argument 3
*** 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
*** use
// get records if cat_id is null $posts = Post::whereNull('cat_id')->get();
** whereNotNull
*** argvs
*** use
// get records if cat_id is not null | is set $posts = Post::whereNotNull('cat_id')->get();
** whereIn
*** argvs
*** use
// get posts recotds if cat_id in 1, 2, 3 $posts = Post::whereIn('cat_id', [1, 2, 3])->get();
** whereBetween
*** argvs
*** use
// get records if id between 1..3 $posts = Post::whereBetween('id', 1, 3)->get();
** randomOrder
randomize records order
*** argvs
*** use
$posts = Post::randomOrder('DESC')->get();
** orderBy
*** argvs
*** use
$posts = Post:orderBy('created_at', 'DESC')->get();
** limit
*** argvs
*** use
// get first 3 records $posts = Post::limit(0, 3)->get();
** count
*** use
// get cound of records $postsCount = Post::count(); // return 4
** pagination
*** argvs
*** use
// auto convert page_id with $_GET['_pageid'] $posts = Post::pagination(3);
** Relationships
*** hasOne
**** argvs
**** use
$user = Post::hasOne(User::class, 'user_id', 'id');
*** hasMany
**** argvs
**** use
$comments = Post::hasMany(Comment::class, 'post_id', 'id')->get();
*** belongsTo
**** argvs
**** use
$user = Post::belongTo(User::class, 'user_id', 'id')->get();
*** belongsToMany
**** argvs
**** use
$tags = Post::belongsToMany(Tag::class, 'article_tag', 'id', 'post_id', 'tag_id', 'id')->get(); // | ---------------------------------------------- | | | // | ------------------------------------------------------- | | // ------------------------------------------------------------------------ | // --------------------------------------------------------------------------------
all views create in resources/view
** apts template engine
*** home > layouts > master.apts.php
<!DOCTYPE html>
@include('home.layouts.head-tag') @yield('title') @yield('head-tag') @yield('content')*** home > layouts > head-tag.apts.php
*** home > index.apts.php
@extends('app.layouts.app')
@section('head-tag')
@endsection
@section('content')
@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 using User mdoel by default
** registerUser
*** argvs
*** use
$inputs = [ 'username' => 'alishahidi', 'password' => 'decoded-secret-from-form', 'phone_number' => '+13924324' 'secret' => 'top secret' ];
Auth::storeUser($inputs, 'password', ['secret']);
** updateUser
*** argvs
*** use
$inputs = [ 'id' => 1, 'username' => 'ali', 'password' => 'decoded-secret-from-form', ];
Auth::updateUser($inputs, ['id', 'username', 'password'], 'password');
** loginUsingEmail
*** argvs
*** 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
*** 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');