alishahidi / apantos
Apantos 框架。
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
目录
什么是 apantos
Apantos 是一个基于 PHP 的快速简单框架,具有安全方法和专门的 ORM。模块化
如何创建第一个 Apantos 项目
此项目可在 composer packagist 上找到,您可以通过 composer create-project
容易地安装
composer create-project alishahidi/apantos
在端口 8000 上提供服务
php -S 127.0.0.1:8000 -t public
设置令牌
创建项目后,您必须通过默认的 CRYPT_TOKEN
& TOKEN
变量设置 .env,并通过此 URL /api/token
获取有效令牌,使用此 URL 两次并保存提供的令牌到环境变量中
建议在保存令牌后从 /routes/api
中删除令牌 API 路由
框架架构是什么?
此框架使用 MVC 架构
模型在 app/Models,视图在 resources/view,控制器在 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
目录说明
app
重要的目录包含控制器、请求和...,用于管理路由处理程序和检查表单输入等
Http
包含网络请求处理程序和服务
控制器
路由管理类
标准名称:NameController.php
Request
用户输入检查器
标准名称:NameRequest.php
Services
重构的类
标准名称:Name.php
Models
数据库模型
标准名称 Name.php
使用单数名词
Providers
如果存储在配置文件中,则 Providers 在每个请求中运行
标准名称:NameProvider.php
bootstrap
包含 bootstrap.php
文件
此文件的任务是加载框架
public
此目录作为根目录
每个请求都必须重定向到 index.php
文件
resources
包含视图目录
view
包含视图目录和 PHP 文件
使用 apts 模板引擎的标准名称:view.apts.php
,不使用模板引擎的标准名称:view.php
routes
web.php
用于网络请求路由
api.php
用于 API 请求路由
storage
用于项目文件,例如用于包的文件
system
框架的核心
路由系统
所有路由都在 routes/{web, api}.php 文件中可用
如何创建路由
注意
Web 路由从 / 开始,API 路由从 /api 开始
Argvs
- URL
- 具有命名空间和类函数名称的控制器,名称后跟 @
- 路由名称
获取
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');
控制器
由路由系统调用的控制器
必须在 Route
方法中设置控制器
在app/Http/Controller中创建您的控制器,如下所示
namespace App\Http\Controllers\Home; use App\Http\Controllers\Controller; class HomeController extends Controller { public function index() { return "Hi"; } }
要使用此示例,您必须在HomeController中设置Route以调用index方法
Route::get('/', "Home\HomeController@index", 'home.index');
现在,如果打开浏览器中的/ URL,您可以看到“Hi”消息
模型
在app/Models中创建您的模型,如下所示
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'] }
使用单数名词作为模型名称,并在protected $table
中设置表的完整名称
您必须在protected $fillable
中设置可填充的表列,id、create_at、updated_at、deleted_at默认存在于填充中
casts可以将数组转换为安全的字符串以存储在数据库中,并在从数据库获取记录时将字符串转换为数组
ORM
示例表
用户
分类
标签
帖子
帖子_标签
评论
创建
添加记录
argvs
- 值:数组
使用
$user = User::create([ 'username' => 'ali', 'password' => 'test', 'phone_number' => '+319021243' ]); $insertId = $user->insertId;
或
$user = new User(); $user->username = 'ali'; $user->password = 'test'; $user->phone_number = '+30231234401'; $user->save();
更新
更新记录
argvs
- 值:数组 => 使用主键
使用
$user = User::update([ 'id' => 1, 'username' => 'alishahidi' ]); // change ali username to alishahidi
或
$user = User::find(1); $user->username = 'alishahidi'; $user->save();
删除
删除记录
argvs
- 主键
使用
User::delete(1);
所有
提供所有记录
使用
$users = User::all(); foreach($users as $user) echo $user->useranem; // output // ali // alex // pop
查找
提供id为$id的用户
argvs
- 主键
使用
$user = User::find(1); $username = $user->username; // return ali
where
在查询中添加where条件
argvs
如果传递两个参数,则设置操作为=
- 属性
- 值
如果传递三个参数,则从参数2获取操作,从参数3获取值
- 属性
- 操作
- 值
使用
// get first record $post = Post::where('title', 'post number 1')->get()[0]; $title = $post->title; // return "post number 1"
或
// 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
类似于where
,但具有OR操作
whereNull
argvs
- 属性
使用
// get records if cat_id is null $posts = Post::whereNull('cat_id')->get();
whereNotNull
argvs
- 属性
使用
// get records if cat_id is not null | is set $posts = Post::whereNotNull('cat_id')->get();
whereIn
argvs
- 属性
- 值:数组
使用
// get posts recotds if cat_id in 1, 2, 3 $posts = Post::whereIn('cat_id', [1, 2, 3])->get();
whereBetween
argvs
- 属性
- 从
- 到
使用
// get records if id between 1..3 $posts = Post::whereBetween('id', 1, 3)->get();
randomOrder
随机记录顺序
argvs
- 表达式
使用
$posts = Post::randomOrder('DESC')->get();
orderBy
argvs
- 属性
- 表达式
使用
$posts = Post:orderBy('created_at', 'DESC')->get();
limit
argvs
- 从
- 数字
使用
// get first 3 records $posts = Post::limit(0, 3)->get();
count
使用
// get cound of records $postsCount = Post::count(); // return 4
分页
argvs
- 每页
使用
// auto convert page_id with $_GET['_pageid'] $posts = Post::pagination(3);
关系
hasOne
argvs
- 模型类名
- 外键
- 本地键
使用
$user = Post::hasOne(User::class, 'user_id', 'id');
hasMany
argvs
- 模型类名
- 外键
- 本地键
使用
$comments = Post::hasMany(Comment::class, 'post_id', 'id')->get();
belongsTo
argvs
- 模型类名
- 外键
- 本地键
使用
$user = Post::belongTo(User::class, 'user_id', 'id')->get();
belongsToMany
argvs
- 模型类名
- 枢纽表
- 本地键
- 枢纽外键
- 枢纽其他外键
- 外键
使用
$tags = Post::belongsToMany(Tag::class, 'article_tag', 'id', 'post_id', 'tag_id', 'id')->get(); // | *----------------------------------------------* | | | // | *-------------------------------------------------------* | | // *------------------------------------------------------------------------* | // *--------------------------------------------------------------------------------*
视图
所有视图都创建在resources/view中
apts 模板引擎
- 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
渲染
在路径中用.替换/,路径从resources/view开始
view('home.index');
或
$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')); } }
认证系统
默认使用User模型进行身份验证
注册用户
argvs
- 值:数组
- 密码输入名称
- 加密输入名称:数组
使用
$inputs = [ 'username' => 'alishahidi', 'password' => 'decoded-secret-from-form', 'phone_number' => '+13924324' 'secret' => 'top secret' ]; Auth::storeUser($inputs, 'password', ['secret']);
更新用户
argvs
- 值:数组
- 允许的输入:key=>value数组
- 密码输入名称
- 加密输入名称:数组
使用
$inputs = [ 'id' => 1, 'username' => 'ali', 'password' => 'decoded-secret-from-form', ]; Auth::updateUser($inputs, ['id', 'username', 'password'], 'password');
使用电子邮件登录
argvs
- 电子邮件
- 解码密码
- 用户不存在错误消息(可选)
- 密码错误错误消息(可选)
- 记住用户(可选)
- 用户cookie验证时间(可选)
使用
Auth::loginEmailUsername('test@test.org', 'secret', "Username wrong.", "Password wrong", true, 4 * 24 * 60 * 60);
使用用户名登录
类似于loginUsingEmail
,但将用户名放在第一个参数中的电子邮件之间
使用 ID 登录
argvs
- id
使用
Auth::loginUsingId(1);
注销
使用
Auth::logout();
检查
检查用户登录 => 如果未登录,则重定向到auth.login路由名称
使用
Auth::check();
检查登录
检查用户登录 => 返回true/false
使用
$isLogin = Auth::checkLogin();
用户
如果登录,则返回用户
使用
$user = Auth::user();
使用电子邮件的用户
使用
$user = Auth::userUsingEmail('test@test.org');
使用用户名的用户
使用
$user = Auth::userUsingUsername('ali');