{"id":36992812,"url":"https://github.com/alishahidi/apantos","last_synced_at":"2026-01-13T23:44:58.852Z","repository":{"id":48011439,"uuid":"487125936","full_name":"alishahidi/apantos","owner":"alishahidi","description":"Apantos is a fast and simple framework based on php with security methods and dedicated orm. Modularly","archived":false,"fork":false,"pushed_at":"2023-05-31T20:36:05.000Z","size":5186,"stargazers_count":15,"open_issues_count":2,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-12-05T07:15:53.125Z","etag":null,"topics":["fast","framework","lightweight","php","security"],"latest_commit_sha":null,"homepage":"https://packagist.org/packages/alishahidi/apantos","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/alishahidi.png","metadata":{"files":{"readme":"README.org","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-04-29T22:30:39.000Z","updated_at":"2024-10-08T10:48:20.000Z","dependencies_parsed_at":"2023-02-18T11:08:20.401Z","dependency_job_id":null,"html_url":"https://github.com/alishahidi/apantos","commit_stats":null,"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/alishahidi/apantos","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alishahidi%2Fapantos","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alishahidi%2Fapantos/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alishahidi%2Fapantos/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alishahidi%2Fapantos/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/alishahidi","download_url":"https://codeload.github.com/alishahidi/apantos/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alishahidi%2Fapantos/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28405246,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-13T21:51:37.118Z","status":"ssl_error","status_checked_at":"2026-01-13T21:45:14.585Z","response_time":56,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["fast","framework","lightweight","php","security"],"created_at":"2026-01-13T23:44:58.783Z","updated_at":"2026-01-13T23:44:58.845Z","avatar_url":"https://github.com/alishahidi.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"#+TITLE: Apantos doc - main\n#+AUTHOR: Ali Shahidi\n#+DESCRIPTION: Apantos document main page\n#+OPTIONS: num:nil ^:{}\n\n\n* TABLE OF CONTENTS :toc:\n- [[#what-is-apantos][What is apantos]]\n- [[#how-create-first-apantos-project][How create first Apantos project]]\n  - [[#set-tokens][Set tokens]]\n- [[#what-is-framework-architecture-][What is framework architecture ?]]\n- [[#directory-structure][Directory Structure]]\n- [[#directory-explanation][Directory explanation]]\n  - [[#app][app]]\n  - [[#bootstrap][bootstrap]]\n  - [[#public][public]]\n  - [[#resources][resources]]\n  - [[#routes][routes]]\n  - [[#storage][storage]]\n  - [[#system][system]]\n- [[#routing-system][Routing system]]\n  - [[#how-create-route][How create route]]\n- [[#controllers][Controllers]]\n- [[#model][Model]]\n- [[#orm][Orm]]\n  - [[#example-tables][Example tables]]\n  - [[#create][create]]\n  - [[#update][update]]\n  - [[#delete][delete]]\n  - [[#all][all]]\n  - [[#find][find]]\n  - [[#where][where]]\n  - [[#whereor][whereOr]]\n  - [[#wherenull][whereNull]]\n  - [[#wherenotnull][whereNotNull]]\n  - [[#wherein][whereIn]]\n  - [[#wherebetween][whereBetween]]\n  - [[#randomorder][randomOrder]]\n  - [[#orderby][orderBy]]\n  - [[#limit][limit]]\n  - [[#count][count]]\n  - [[#pagination][pagination]]\n  - [[#relationships][Relationships]]\n- [[#view][View]]\n  - [[#apts-template-engine][apts template engine]]\n  - [[#render][render]]\n- [[#auth-system][Auth system]]\n  - [[#registeruser][registerUser]]\n  - [[#updateuser][updateUser]]\n  - [[#loginusingemail][loginUsingEmail]]\n  - [[#loginusingusername][loginUsingUsername]]\n  - [[#loginusingid][loginUsingId]]\n  - [[#logout][logout]]\n  - [[#check][check]]\n  - [[#checklogin][checkLogin]]\n  - [[#user][user]]\n  - [[#userusingemail][userUsingEmail]]\n  - [[#userusingusername][userUsingUsername]]\n\n* What is apantos\n\nApantos is a fast and simple framework based on php with security methods and dedicated orm. Modularly\n\n* How create first Apantos project\n\nThis project available on composer packagist\nyou can easily install by =composer create-project=\n\n#+begin_src sh\n\ncomposer create-project alishahidi/apantos\n\n#+end_src\n\nfor serve project on port *8000*\n\n#+begin_src sh\n\nphp -S 127.0.0.1:8000 -t public\n\n#+end_src\n\n** Set tokens\n\nafter create project you must set .env =CRYPT_TOKEN= \u0026 =TOKEN= variable\nby default =/api/token= url set for get valid token\nusing this url 2 time and save gived token into env variables\n\n*recommended remove token api route after saving token from* =/routes/api=\n\n\n* What is framework architecture ?\n\nthis framework use mvc architecture\n\nmodels in *app/Models*\nviews in *resources/view*\ncontrollers in *app/Controllers*\n\n* Directory Structure\n\n#+begin_example\n\n- app\n  - Http\n    - Controllers\n    - Request\n    - Services\n  - Models\n  - Providers\n- bootstrap\n  - /bootstrap.php/\n- config\n  - /app.php/\n  - /database.php/\n  - /image.php/\n  - /mail.php/\n- database\n  - migrations\n- public\n  - /index.php/\n- resources\n  - view\n- routes\n  - /api.php/\n  - /web.php/\n- storage\n  - fonts\n  - images\n- system\n\n#+end_example\n\n* Directory explanation\n\n** app\n\nImportant directory contain controllers and request and .... for manage routes handlers and check form input and more\n\n*** Http\n\nContain web request handlers and services\n\n**** Controllers\n\nManagement classes for routes\n\nstandard name: =NameController.php=\n\n**** Request\n\nUser input checkers\n\nstandard name: =NameRequest.php=\n\n**** Services\n\nRefactored classes\n\nstandard name: =Name.php=\n\n*** Models\n\nDatabase Models\n\nstandard name =Name.php= *Use singular nouns*\n\n*** Providers\n\nProviders run each request if stored in config file\n\nstandard name: =NameProvider.php=\n\n** bootstrap\n\ncontain =bootstrap.php= file\n\nThe job of this file is to load the framework\n\n** public\n\nthis direcotry serve as root directory\n\nevery request must be redirect to =index.php= file\n\n** resources\n\ncontain view direcotry\n\n*** view\n\ncontain views direcotry \u0026 php file\n\nstandard name for use apts template engine: =view.apts.php=\nstandard name for normal use without template engine: =view.php=\n\n** routes\n\n*** web.php\n\nfor web request routes\n\n*** api.php\n\nfor api request routes\n\n** storage\n\nfor in project files\nex: files used for packages\n\n** system\n\nkernel of framework\n\n* Routing system\n\nall routes available in *routes/{web, api}.php* file\n\n** How create route\n\n*** Note\n\nweb route start from */*\napi routes start from */api*\n\n*** Argvs\n\n1. url\n2. Controller with namespace \u0026 class function name after @\n3. route name\n\n*** Get\n\n#+begin_src php\n\nRoute::get('/', \"Home\\HomeController@index\", 'home.index');\n\n#+end_src\n\n*** Post\n\n#+begin_src php\n\nRoute::post('/login', \"Auth\\LoginController@login\", 'auth.login');\n\n#+end_src\n\n*** Put\n\n#+begin_src php\n\nRoute::put('/admin/article/update/{id}', \"Admin\\ArticleController@update\", 'admin.article.update');\n\n#+end_src\n\n*** Delete\n\n#+begin_src php\n\nRoute::delete('/admin/article/delete/{id}', \"Admin\\ArticleController@destroy\",'admin.article.delete');\n\n#+end_src\n\n\n* Controllers\n\ncontrollers called by routing system\n\ncontrollers must be set in =Route= method\n\ncreate your Controllers in *app/Http/Controller* like this\n\n#+begin_src php\n\nnamespace App\\Http\\Controllers\\Home;\n\nuse App\\Http\\Controllers\\Controller;\n\nclass HomeController extends Controller\n{\n    public function index()\n    {\n        return \"Hi\";\n    }\n}\n\n#+end_src\n\nfor use this example you must set Route for called index method in HomeController\n\n#+begin_src php\n\nRoute::get('/', \"Home\\HomeController@index\", 'home.index');\n\n#+end_src\n\nnow if open */* url in your browser you can see \"Hi\" message;\n\n* Model\n\ncreate your models in *app/Models* like this\n\n#+begin_src php\n\nnamespace App\\Models;\n\nuse System\\Database\\ORM\\Model;\nuse System\\Database\\Traits\\HasSoftDelete;\n\nclass User extends Model\n{\n    use HasSoftDelete;\n\n    protected $table = 'users';\n\n    protected $fillable = ['name', 'email', 'password', 'avatar', 'permissions', 'bio'];\n\n    protected $casts = ['permission' =\u003e 'arrray']\n}\n\n#+end_src\n\nuse *Use singular nouns* for Model name and set full name of table in =protected $table=\n\nyou must set fillable table column in =protected $fillable=\nid, create_at, updated_at, deleted_at exist by default in fillables\n\n*casts* can convert arrays to safe string for stored in database and can convert string to array when you get record from database\n\n* Orm\n\n** Example tables\n\n*** users\n\n| id | username | password | phone_number |\n|----+----------+----------+--------------|\n|  1 | ali      | test     |    +11843019 |\n|  2 | alex     | test     |   +32095u023 |\n|  3 | pop      | test     |     +3925253 |\n\n*** categories\n\n| id | name  |\n|----+-------|\n|  1 | linux |\n|  2 | emacs |\n|  3 | php   |\n\n*** tags\n\n| id | name  |\n|----+-------|\n|  1 | linux |\n|  2 | emacs |\n|  3 | php   |\n|  4 | json  |\n\n*** posts\n\n| id | title         | cat_id | description                  |\n|----+---------------+--------+------------------------------|\n|  1 | post number 1 |      1 | description of post number 1 |\n|  2 | post 2        |      1 | description of post number 2 |\n|  3 | post number 3 |      2 | description of post number 3 |\n|  4 | post 4        |      3 | description of post number 4 |\n\n*** post_tag\n\n| id | post_id | tag_1 |\n|----+---------+-------|\n|  1 |       1 |     1 |\n|  2 |       1 |     2 |\n|  3 |       2 |     1 |\n|  4 |       2 |     3 |\n\n*** comments\n\n| id | user_id | post_id | comment   |\n|----+---------+---------+-----------|\n|  1 |       1 |       2 | comment 1 |\n|  2 |       2 |       2 | comment 2 |\n|  3 |       1 |       1 | comment 3 |\n\n** create\n\nadd record\n\n*** argvs\n1. values:array\n\n*** use\n\n#+begin_src php\n\n$user = User::create([\n    'username' =\u003e 'ali',\n    'password' =\u003e 'test',\n    'phone_number' =\u003e '+319021243'\n]);\n\n$insertId = $user-\u003einsertId;\n\n#+end_src\n\nor\n\n#+begin_src php\n\n$user = new User();\n$user-\u003eusername = 'ali';\n$user-\u003epassword = 'test';\n$user-\u003ephone_number = '+30231234401';\n$user-\u003esave();\n\n#+end_src\n\n** update\n\nupdate record\n\n*** argvs\n\n1. values:array =\u003e with primary id\n\n*** use\n\n#+begin_src php\n\n$user = User::update([\n    'id' =\u003e 1,\n    'username' =\u003e 'alishahidi'\n]);\n\n// change ali username to alishahidi\n\n#+end_src\n\nor\n\n#+begin_src php\n\n$user = User::find(1);\n$user-\u003eusername = 'alishahidi';\n$user-\u003esave();\n\n#+end_src\n\n** delete\n\ndelete record\n\n*** argvs\n1. primary id\n\n*** use\n\n#+begin_src php\n\nUser::delete(1);\n\n#+end_src\n\n** all\n\ngive all records\n\n*** use\n\n#+begin_src php\n\n$users = User::all();\nforeach($users as $user)\n    echo $user-\u003euseranem;\n\n// output\n\n    // ali\n    // alex\n    // pop\n\n#+end_src\n\n** find\n\ngive user where id = $id\n\n*** argvs\n\n1. primary id\n\n*** use\n\n#+begin_src php\n\n$user = User::find(1);\n$username = $user-\u003eusername; // return ali\n\n#+end_src\n\n** where\n\nadd where condition in query\n\n*** argvs\n\nif pass 2 argument it set operatino to =\n1. attribute\n2. value\n\nif pass 3 argument it get operation from argument 2 and get value from argument 3\n1. attribute\n2. operatino\n3. value\n\n*** use\n\n#+begin_src php\n\n// get first record\n$post = Post::where('title', 'post number 1')-\u003eget()[0];\n$title = $post-\u003etitle; // return \"post number 1\"\n\n#+end_src\n\nor\n\n#+begin_src php\n\n// return all record contain \"number\" in title\n$posts = Post::where('title', 'LIKE', \"%number%\")-\u003eget();\nforeach($posts as $post)\n    echo $post-\u003etitle\n\n// output\n\n    // post number 1\n    // post number 3\n\n#+end_src\n\n** whereOr\n\nlike =where= but with *OR* operation\n\n** whereNull\n\n*** argvs\n\n1. attribute\n\n*** use\n\n#+begin_src php\n\n// get records if cat_id is null\n$posts = Post::whereNull('cat_id')-\u003eget();\n\n#+end_src\n\n** whereNotNull\n\n*** argvs\n\n1. attribute\n\n*** use\n\n#+begin_src php\n\n// get records if cat_id is not null | is set\n$posts = Post::whereNotNull('cat_id')-\u003eget();\n\n#+end_src\n\n** whereIn\n\n*** argvs\n\n1. attribute\n2. values:array\n\n*** use\n\n#+begin_src php\n\n// get posts recotds if cat_id in 1, 2, 3\n$posts = Post::whereIn('cat_id', [1, 2, 3])-\u003eget();\n\n#+end_src\n\n** whereBetween\n\n*** argvs\n\n1. attribute\n2. from\n3. to\n\n*** use\n\n#+begin_src php\n\n// get records if id between 1..3\n$posts = Post::whereBetween('id', 1, 3)-\u003eget();\n\n#+end_src\n\n** randomOrder\n\n  randomize records order\n\n*** argvs\n\n1. expression\n\n*** use\n\n#+begin_src php\n\n$posts = Post::randomOrder('DESC')-\u003eget();\n\n#+end_src\n\n** orderBy\n\n*** argvs\n\n1. attribute\n2. expression\n\n*** use\n\n#+begin_src php\n\n$posts = Post:orderBy('created_at', 'DESC')-\u003eget();\n\n#+end_src\n\n** limit\n\n*** argvs\n\n1. from\n2. number\n\n*** use\n\n#+begin_src php\n\n// get first 3 records\n$posts = Post::limit(0, 3)-\u003eget();\n\n#+end_src\n\n** count\n\n*** use\n\n#+begin_src php\n\n// get cound of records\n$postsCount = Post::count(); // return 4\n\n#+end_src\n\n** pagination\n\n*** argvs\n\n1. perpage\n\n*** use\n\n#+begin_src php\n\n// auto convert page_id with $_GET['_pageid']\n$posts = Post::pagination(3);\n\n#+end_src\n\n** Relationships\n\n*** hasOne\n\n**** argvs\n\n1. model class name\n2. foreign key\n3. local key\n\n**** use\n\n#+begin_src php\n\n$user = Post::hasOne(User::class, 'user_id', 'id');\n\n#+end_src\n\n\n*** hasMany\n\n**** argvs\n\n1. model class name\n2. foreign key\n3. local key\n\n**** use\n\n#+begin_src php\n\n$comments = Post::hasMany(Comment::class, 'post_id', 'id')-\u003eget();\n\n#+end_src\n\n*** belongsTo\n\n**** argvs\n\n1. model class name\n2. foreign key\n3. local key\n\n**** use\n\n#+begin_src php\n\n$user = Post::belongTo(User::class, 'user_id', 'id')-\u003eget();\n\n#+end_src\n\n*** belongsToMany\n\n**** argvs\n\n1. model class name\n2. pivot table\n3. local key\n4. pivot foreign key\n5. pivot other foreign key\n6. foreign key\n\n**** use\n\n#+begin_src php\n\n$tags = Post::belongsToMany(Tag::class, 'article_tag', 'id', 'post_id', 'tag_id', 'id')-\u003eget();\n// |      *----------------------------------------------*        |         |       |\n// |      *-------------------------------------------------------*         |       |\n// *------------------------------------------------------------------------*       |\n// *--------------------------------------------------------------------------------*\n\n#+end_src\n\n* View\n\nall views create in *resources/view*\n\n** apts template engine\n\n# maby replace twig template engine in next versions\n\n#+begin_example\n\n- resources\n  - view\n    - home\n      - layouts\n        - master.apts.php\n        - head-tag.apts.php\n      - index.apts.php\n\n#+end_example\n\n*** home \u003e layouts \u003e master.apts.php\n\n#+begin_src html\n\n\u003c!DOCTYPE html\u003e\n\u003chtml lang=\"en\"\u003e\n\n\u003chead\u003e\n    @include('home.layouts.head-tag')\n    @yield('title')\n    @yield('head-tag')\n\u003c/head\u003e\n\n\u003cbody\u003e\n    @yield('content')\n\u003c/body\u003e\n\n\u003c/html\u003e\n\n#+end_src\n\n*** home \u003e layouts \u003e head-tag.apts.php\n\n#+begin_src html\n\n\u003cmeta charset=\"UTF-8\"\u003e\n\u003cmeta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"\u003e\n\u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"\u003e\n\n#+end_src\n\n*** home \u003e index.apts.php\n\n#+begin_src html\n\n@extends('app.layouts.app')\n\n@section('head-tag')\n\n\u003ctitle\u003eApantos project\u003c/title\u003e\n\n@endsection\n\n@section('content')\n\n\u003ch2\u003eWelcome to apantos project\u003c/h2\u003e\n\n@endsection\n\n#+end_src\n\n** render\n\nreplace */* with *.* in your path\npath start in *resources/view*\n\n#+begin_src php\n\nview('home.index');\n\n#+end_src\n\nor\n\n#+begin_src php\n\n$message = 'Send message to view';\nview('home.index', compact('message'));\n\n#+end_src\n\n*** example using in controller\n\n#+begin_src php\n\nnamespace App\\Http\\Controllers\\Home;\n\nuse App\\Http\\Controllers\\Controller;\n\nclass HomeController extends Controller\n{\n    public function index()\n    {\n        $message = 'Send message to view';\n        return view('home.index', compact('message'));\n    }\n}\n\n#+end_src\n\n* Auth system\n\nauth using *User* mdoel by default\n\n** registerUser\n\n*** argvs\n\n1. values:array\n2. password input name\n3. encrypt input name:array\n\n*** use\n\n#+begin_src php\n\n$inputs = [\n    'username' =\u003e 'alishahidi',\n    'password' =\u003e 'decoded-secret-from-form',\n    'phone_number' =\u003e '+13924324'\n    'secret' =\u003e 'top secret'\n];\n\nAuth::storeUser($inputs, 'password', ['secret']);\n\n#+end_src\n\n** updateUser\n\n*** argvs\n\n1. values:array\n2. allowed inputs:key=\u003evalue array\n3. password input name\n4. encrypt input name:array\n\n*** use\n\n#+begin_src php\n\n$inputs = [\n    'id' =\u003e 1,\n    'username' =\u003e 'ali',\n    'password' =\u003e 'decoded-secret-from-form',\n];\n\nAuth::updateUser($inputs, ['id', 'username', 'password'], 'password');\n\n#+end_src\n\n** loginUsingEmail\n\n*** argvs\n\n1. email\n2. decoded password\n3. no user exist error message (opt)\n4. password wrong error message (opt)\n5. remember user (opt)\n6. user cookie validate time (opt)\n\n*** use\n\n#+begin_src php\n\nAuth::loginEmailUsername('test@test.org', 'secret', \"Username wrong.\", \"Password wrong\", true, 4 * 24 * 60 * 60);\n\n#+end_src\n\n** loginUsingUsername\n\nlike =loginUsingEmail= but send username between email in first argument\n\n** loginUsingId\n\n*** argvs\n\n1. id\n\n*** use\n\n#+begin_src php\n\nAuth::loginUsingId(1);\n\n#+end_src\n\n** logout\n\n*** use\n\n#+begin_src php\n\nAuth::logout();\n\n#+end_src\n\n** check\n\ncheck user login =\u003e redirect to *auth.login* route name if not login\n\n*** use\n\n#+begin_src php\n\nAuth::check();\n\n#+end_src\n\n** checkLogin\n\ncheck user login =\u003e return true/false\n\n*** use\n\n#+begin_src php\n\n$isLogin = Auth::checkLogin();\n\n#+end_src\n\n** user\n\nreturn user if login\n\n*** use\n\n#+begin_src php\n\n$user = Auth::user();\n\n#+end_src\n\n** userUsingEmail\n\n*** use\n\n#+begin_src php\n\n$user = Auth::userUsingEmail('test@test.org');\n\n#+end_src\n\n** userUsingUsername\n\n*** use\n\n#+begin_src php\n\n$user = Auth::userUsingUsername('ali');\n\n#+end_src\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falishahidi%2Fapantos","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falishahidi%2Fapantos","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falishahidi%2Fapantos/lists"}