ashish336b / carpo-php
这是一个基于API开发的PHP框架。
README
这是一个简单的基于PHP闭包的API开发框架。
安装
composer create-project ashish336b/carpo-php-framework blog
使用此命令完成安装。运行命令以在端口1212上打开Web服务器。
php -S localhost:1212 -t public/
项目文件夹结构。
├───app
│ ├───controller
│ ├───middleware
│ ├───model
│ └───views
├───public
└───vendor
- app/controller包含项目中所有的控制器类。
- app/middleware包含项目中所有的中间件类。
- app/views包含项目中所有的视图文件。
使用此方法完成完整安装。
路由
您可以通过调用静态类Application
来创建路由。
use ashish336b\PhpCBF\Application as App; App::get("/", function (Request $request, Response $response) { echo "My First Route."; });
方法
App::get("/urlPattern" , function(){}); App::post("/urlPattern" , function(){}); App::put("/urlPattern" , function(){}); App::delete("/urlPattern",function(){});
您还可以从\ashish\PhpCBF\Application
类中访问另一种方法。
App::on("EVENT_TYPE" , function(){});
EVENTTYPE可以是BEFORE或AFTER
- BEFORE:此事件在所有应用程序中间件和路由之前运行。最佳用例是设置CORS头。
- AFTER:如果您需要在运行中间件和路由功能之后运行一段代码,请使用此功能。例如,全局响应头在此处设置。
URL模式
可选模式。
App::get("/user/{id?}" , closure);
bothbaseurl/user/1
andbaseurl/user
都在此处分发,id参数是可选的。
- 您不应在可选占位符/参数之后定义任何必需的占位符/参数。
/user/{id?}/{userId}
这是完全错误的。
/user/{userId}/{id?}
这是正确的方式。 - 最好只在一个模式中有一个可选参数,并且它必须是最后一个占位符。
- 然而,如果有多个可选参数,则支持这种情况,前提是在任何可选参数之前只有一个必需参数。使用多个可选参数可能会导致混淆且难以调试,因此不建议这样做。
- 您不能在注册任何与静态路由模式匹配的变量路由之后注册静态路由。例如
假设首先定义了这个变量模式user/{id}
,然后您定义了另一个模式user/home
,它匹配user/{id}
。这将给您错误。 - 然而,您可以首先定义
user/home
,然后是user/{id}
。这是完全可以的。
路由分组
- 您可以在其他著名框架(如Laravel、slim)中定义路由分组。
- 第一个参数是数组,可以有两个键:params和middleware。
- Params:用于定义在所有路由组中出现的公共URL模式。
- Middleware:在
/App/middleware/
命名空间中的中间件类名。
App::group(["prefix"=>"/admin"],function(){ // every GET POST PUT DELETE methods routes can be define. App::get("/login",Closure); //dispatch /admin/login App::get("/login/{id}", Closure); //dispatch /admin/login/1 , /admin/login/anything etc. });
get
、post
、put
和delete
方法有两个参数:URL模式和闭包。- 闭包可以有两个参数:$request和$response,它们分别是类型为
Request
和Response
的。
App::get("/user/{id}/{anotherParams}", function (Request $request, Response $response) { // Access params value with $request->params. $request->params->id; $request->params->anotherParams; });
控制器
您可以在app/controller中创建控制器类,使用命名空间namespace App\controller;
。
<?php namespace App\controller; use ashish336b\PhpCBF\Request; use ashish336b\PhpCBF\Response; class AdminController { public function index(Request $request, Response $response) { $request->url = $request->getUrl(); return $response->toJSON($request); } public function user(Request $request, Response $response) { echo $response->render("/admin", ['fullUrl' => $request->fullURL]); } }
您可以使用类和方法来定义在路由中执行的类名@方法名。
App::get("/admin/user", "AdminController@user");
-
在路由 "AdminController@user" 中,表示 AdminController 直接位于控制器文件夹中,该文件夹有一个要执行的 user 方法以响应。
-
如果您的控制器位于 /app/controller/user/UserController.php,并且要执行的方法是 index,那么
App::get("/user", "user\UserController@index")
模型
这包含与数据相关逻辑的数据,例如从数据库检索数据并将其传递到控制器。
您必须在模型文件夹内创建模型类。此文件夹可以包含子文件夹以对模型进行分组。
<?php namespace App\model; use ashish336b\PhpCBF\DB; use ashish336b\PhpCBF\Model; class Auth extends Model { protected $table = "user"; public function fetchUser() { //directly run query from model return $this->query("select * from user")->results(); // fetch all row of table specified in $table return $this->fetch(); // get columns of table return $this->getColumns(); } }
要从控制器访问模型功能。
$user = $this->model("Auth")->fetchUser();
在这里,Auth
是模型文件夹内文件的名称,而 fetchUser()
是 Auth 文件/类内的方法。
$this->model("Admin\Auth")->fetchUser();
在上面的示例中,Auth 类位于模型文件夹内的 Admin 文件夹中。
数据库
此框架主要支持 mysql 数据库。然而,您可以使用其他开源项目集成任何数据库。
- 要从表中获取所有数据(例如 user)
DB::table("user")->get();
- 运行任何查询
$result = DB::raw()->query("select * from user where id = ?",[1])->result();
- 计算结果
$noOfRow = DB::raw()->query("select * from user")->count();
迁移
您可以使用迁移来运行创建表、警报等。每个迁移都应在 app/migration 目录内。
<?php namespace App\migrations; use ashish336b\PhpCBF\Application; class create_user_table { public function up() { $SQL = "CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, firstname VARCHAR(255) NOT NULL, lastname VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP )"; Application::$pdo->exec($SQL); } public function down() { $SQL = "DROP TABLE users;"; Application::$pdo->exec($SQL); } }
每个迁移都应该以这种方式创建。到目前为止,不允许在子目录中存储迁移。每个迁移都应在 app/migrations 目录内。
中间件
中间件提供了一种方便的机制来过滤进入您应用程序的 HTTP 请求。例如,如果您想检查用户是否已认证,您可以在中间件中检查它。如果用户未认证,您可以抛出 403 响应,该响应不允许路由关闭执行。
您可以在路由组以及单个路由中定义中间件。
App::group(["prefix"=>"/admin","middleware"=>["Auth"]],function(){ App::get("/",function(){ echo "/admin"; }) });
Auth 类应位于 app/middleware/Auth.php,并使用命名空间 namespace app\\middleware\\
;
- 如果没有任何条件满足,中间件应始终返回 true。
<?php namespace App\middleware; use ashish336b\PhpCBF\Request; use ashish336b\PhpCBF\Response; class Auth { public function run(Request $request, Response $response) { $auth = false; if(!$auth){ return $response->toJSON(["message" => "not authenticated"]); } return true; } }
- 您可以在单个中间件中定义中间件,用于 get、post、put 和 delete 方法。
App::get("/user","UserController@index",["Guest"]);
请求
请求和响应都可以从控制器方法和闭包中通过参数访问。
返回不带 get 参数的 URL。例如,/admin/index
$request->getUrl();
- 返回 post 请求的所有正文作为对象。
$request->body
- 通过名称访问正文。如果 BODY_NAME 在
$request->body
对象中,则返回值,否则返回null
。
$request->body("BODY_NAME");
- 从 URL 获取所有 get 参数作为对象。
$request->query
- 返回 get 查询参数值。如果
QUERY_NAME
未设置,则返回null
。
$request->query("QUERY_NAME");
- 返回所有请求头作为对象。
$request->allHeaders();
- 返回头值。如果未设置,则返回 false。
$request->header("Header_NAME");
响应
Response 类目前有两个方法。
- 将对象返回为 json。
$response->toJSON($obj);
- render 方法返回包含 HTML 文件的视图。接受两个参数,第一个是从视图文件夹的文件夹路径,另一个是关联数组。
$response->render("/admin",array);
/admin
是从/app/view/admin.php
的文件。/admin/login
是从/app/view/admin/login.php
的文件。
视图
- 视图有三个方法:render()、include() 和 extend()。
- render() 已在 Response 文档中解释。
- include() 方法是在视图文件中调用来包含文件的。通常用于包含页眉和页脚。
views/admin.php
<body> <?php $this->include("/partials/header") ?> <h1>MVC Framework <?php echo $ok ?></h1> <?php $this->include("/partials/footer") ?> </body>
- 示例:在 views/partials/header.php 中包含 header.php。
- extend 方法用于扩展布局。这用 extend() 方法之后和 views 文件中的 end() 方法之前的内容替换 {{any_string}}。示例。layout.php
<?php $this->include('partials/header'); ?> {{any_string}} <?php $this->include("partials/footer") ?>
- 扩展上述 layout.php 视图文件。
<?php $this->extend("any_string", "partials/layout"); ?> <h1>Body <?php echo $ok ?></h1> <?php $this->end() ?>
- 用
<h1>Body <?php echo $ok ?></h1>
替换{{any_string}}
。
许可协议 & 版权
版权所有 (c) Ashish Bhandari
许可协议:MID License。