- What is apantos
- How create first Apantos project
- What is framework architecture ?
- Directory Structure
- Directory explanation
- Routing system
- Controllers
- Model
- Orm
- View
- Auth system
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
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 - 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
Important directory contain controllers and request and .... for manage routes handlers and check form input and more
Contain web request handlers and services
Management classes for routes
standard name: NameController.php
User input checkers
standard name: NameRequest.php
Refactored classes
standard name: Name.php
Database Models
standard name Name.php
Use singular nouns
Providers run each request if stored in config file
standard name: NameProvider.php
contain bootstrap.php
file
The job of this file is to load the framework
this direcotry serve as root directory
every request must be redirect to index.php
file
contain view direcotry
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
for web request routes
for api request routes
for in project files ex: files used for packages
kernel of framework
all routes available in routes/{web, api}.php file
web route start from / api routes start from /api
- url
- Controller with namespace & class function name after @
- route name
Route::get('/', "Home\HomeController@index", 'home.index');
Route::post('/login', "Auth\LoginController@login", 'auth.login');
Route::put('/admin/article/update/{id}', "Admin\ArticleController@update", 'admin.article.update');
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
id | username | password | phone_number |
---|---|---|---|
1 | ali | test | +11843019 |
2 | alex | test | +32095u023 |
3 | pop | test | +3925253 |
id | name |
---|---|
1 | linux |
2 | emacs |
3 | php |
id | name |
---|---|
1 | linux |
2 | emacs |
3 | php |
4 | json |
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 |
id | post_id | tag_1 |
---|---|---|
1 | 1 | 1 |
2 | 1 | 2 |
3 | 2 | 1 |
4 | 2 | 3 |
id | user_id | post_id | comment |
---|---|---|---|
1 | 1 | 2 | comment 1 |
2 | 2 | 2 | comment 2 |
3 | 1 | 1 | comment 3 |
add record
- values:array
$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 record
- values:array => with primary id
$user = User::update([
'id' => 1,
'username' => 'alishahidi'
]);
// change ali username to alishahidi
or
$user = User::find(1);
$user->username = 'alishahidi';
$user->save();
delete record
- primary id
User::delete(1);
give all records
$users = User::all();
foreach($users as $user)
echo $user->useranem;
// output
// ali
// alex
// pop
give user where id = $id
- primary id
$user = User::find(1);
$username = $user->username; // return ali
add where condition in query
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
// 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
like where
but with OR operation
- attribute
// get records if cat_id is null
$posts = Post::whereNull('cat_id')->get();
- attribute
// get records if cat_id is not null | is set
$posts = Post::whereNotNull('cat_id')->get();
- attribute
- values:array
// get posts recotds if cat_id in 1, 2, 3
$posts = Post::whereIn('cat_id', [1, 2, 3])->get();
- attribute
- from
- to
// get records if id between 1..3
$posts = Post::whereBetween('id', 1, 3)->get();
randomize records order
- expression
$posts = Post::randomOrder('DESC')->get();
- attribute
- expression
$posts = Post:orderBy('created_at', 'DESC')->get();
- from
- number
// get first 3 records
$posts = Post::limit(0, 3)->get();
// get cound of records
$postsCount = Post::count(); // return 4
- perpage
// auto convert page_id with $_GET['_pageid']
$posts = Post::pagination(3);
- model class name
- foreign key
- local key
$user = Post::hasOne(User::class, 'user_id', 'id');
- model class name
- foreign key
- local key
$comments = Post::hasMany(Comment::class, 'post_id', 'id')->get();
- model class name
- foreign key
- local key
$user = Post::belongTo(User::class, 'user_id', 'id')->get();
- model class name
- pivot table
- local key
- pivot foreign key
- pivot other foreign key
- foreign key
$tags = Post::belongsToMany(Tag::class, 'article_tag', 'id', 'post_id', 'tag_id', 'id')->get();
// | *----------------------------------------------* | | |
// | *-------------------------------------------------------* | |
// *------------------------------------------------------------------------* |
// *--------------------------------------------------------------------------------*
all views create in resources/view
- resources - view - home - layouts - master.apts.php - head-tag.apts.php - index.apts.php
<!DOCTYPE html>
<html lang="en">
<head>
@include('home.layouts.head-tag')
@yield('title')
@yield('head-tag')
</head>
<body>
@yield('content')
</body>
</html>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
@extends('app.layouts.app')
@section('head-tag')
<title>Apantos project</title>
@endsection
@section('content')
<h2>Welcome to apantos project</h2>
@endsection
replace / with . in your path path start in resources/view
view('home.index');
or
$message = 'Send message to view';
view('home.index', compact('message'));
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
- values:array
- password input name
- encrypt input name:array
$inputs = [
'username' => 'alishahidi',
'password' => 'decoded-secret-from-form',
'phone_number' => '+13924324'
'secret' => 'top secret'
];
Auth::storeUser($inputs, 'password', ['secret']);
- values:array
- allowed inputs:key=>value array
- password input name
- encrypt input name:array
$inputs = [
'id' => 1,
'username' => 'ali',
'password' => 'decoded-secret-from-form',
];
Auth::updateUser($inputs, ['id', 'username', 'password'], 'password');
- decoded password
- no user exist error message (opt)
- password wrong error message (opt)
- remember user (opt)
- user cookie validate time (opt)
Auth::loginEmailUsername('[email protected]', 'secret', "Username wrong.", "Password wrong", true, 4 * 24 * 60 * 60);
like loginUsingEmail
but send username between email in first argument
- id
Auth::loginUsingId(1);
Auth::logout();
check user login => redirect to auth.login route name if not login
Auth::check();
check user login => return true/false
$isLogin = Auth::checkLogin();
return user if login
$user = Auth::user();
$user = Auth::userUsingEmail('[email protected]');
$user = Auth::userUsingUsername('ali');