ashish336b/carpo-php

此包的最新版本(v1.1.8)没有可用的许可信息。

这是一个基于API开发的PHP框架。

v1.1.8 2021-05-12 15:08 UTC

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可以是BEFOREAFTER

  • BEFORE:此事件在所有应用程序中间件和路由之前运行。最佳用例是设置CORS头。
  • AFTER:如果您需要在运行中间件和路由功能之后运行一段代码,请使用此功能。例如,全局响应头在此处设置。

URL模式

  • URL模式用于定义路由。可以定义静态模式和动态模式,通常与Laravel相同。

  • 静态路由:App::get("/users", Closure);

    baseurl/users URL使用此模式分发。

  • 变量路由:APP::get("/home/{id}", closure) baseurl/home/1orbaseurl/home/2` ... 被分发。

  • 您不能注册两个相同的模式。

可选模式。

  • App::get("/user/{id?}" , closure);
    both baseurl/user/1 and baseurl/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.
});
  • getpostputdelete方法有两个参数:URL模式和闭包。
  • 闭包可以有两个参数:$request和$response,它们分别是类型为RequestResponse的。
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