baka/http

Baka Http 组件

v0.5.7 2021-06-15 00:45 UTC

README

PhalconPHP 包,用于创建快速 RESTful API,提供简单的方法来创建快速的 CRUD

目录

  1. 测试
  2. REST CRUD
    1. 控制器配置
  3. 查询解析器
  4. 查询解析器扩展

测试

codecept run

路由配置

为了避免为 CRUD API 创建控制器,我们提供了 \Baka\Http\Rest\CrudController

添加到 routes.php 中

<?php
/**
 * Need to understand if using this can be a performance disadvantage in the future
 */
$defaultCrudRoutes = [
    'business',
    'clients',
    'contacts',
    'modules',
    'customFields' => 'custom-fields',
    'leads',
    'products',
    'productType' => 'product-type',
    'users',
    'sellers',
];

$router = new RouterCollection($application);

foreach ($defaultCrudRoutes as $key => $route) {

    //set the controller name
    $name = is_int($key) ? $route : $key;
    $controllerName = ucfirst($name) . 'Controller';

    $router->get('/v1/' . $route, [
      'Gewaer\Controllers\\' . $controllerName,
      'index',
    ]);

    $router->post('/v1/' . $route, [
      'Gewaer\Controllers\\' . $controllerName,
      'create',
    ]);

    $router->get('/v1/' . $route . '/{id}', [
      'Gewaer\Controllers\\' . $controllerName,
      'getById',
    ]);

    $router->put('/v1/' . $route . '/{id}', [
      'Gewaer\Controllers\\' . $controllerName,
      'edit',
    ]);

    $router->delete('/v1/' . $route . '/{id}', [
      'Gewaer\Controllers\\' . $controllerName,
      'delete',
    ]);

    /**
    * Mounting routes
    */
    $router->mount();
}

您还可以将参数传递给路由以禁用 JWT 并在将来分配中间件

<?php

$router->setPrefix('/v1');
$router->get('/', [
    'Gewaer\Api\Controllers\IndexController',
    'index',
    'options' => [
        'jwt' => false,
    ]
]);

控制器配置

添加

<?php

class AnyController extends Baka\Http\Rest\CrudController

/**
 * set objects
 *
 * @return void
 */
public function onConstruct()
{
    $this->model = new Clients();
    $this->customModel = new ClientsCustomFields();
}

查询解析器

解析 GET 请求的 API,为用户提供正确的 Phalcon 模型参数以执行搜索

//search by fieds and specify the list of fields
GET - /v1/?q=(searchField1:value1,searchField2:value2)&fields=id_pct,alias,latitude,longitude,category,chofer,phone,coords,last_report&limit=1&page=2&sort=id_pct|desc

//filter by relationships
GET - /v1/?q=(searchField1:value1,searchField2:value2)&with=vehicles_media[seriesField:value] 

//add to the array a relationship of this model
GET - /v1/?q=(searchField1:value1,searchField2:value2)&with=vehicles_media[seriesField:value]&relationships=direccione
<?php

$parse = new QueryParser($this->request->getQuery());
$parse->request();

[conditions] => 1 = 1 AND searchField1 = ?1 AND searchField2 = ?2
[bind] => Array
    (
        [1] => value1
        [2] => value2
    )

[columns] => Array
    (
        [0] => id_pct
        [1] => alias
        [2] => latitude
        [3] => longitude
        [4] => category
        [5] => chofer
        [6] => phone
        [7] => coords
        [8] => last_report
    )

[order] => id_pct desc
[limit] => 10
[offset] => 10

查询解析器自定义字段(已弃用)

解析 GET 请求的 API,提供与之前相同的参数,但带有 cq(用于自定义域),这将提供一个用于原始查询的正常 SQL 语句

GET - /v1/?q=(searchField1:value1,searchField2:value2)&cq=(member_id:1)&q=(leads_status_id:1) 该模型的关联关系

<?php

$request = $this->request->getQuery();
$parse = new QueryParserCustomFields($request, $this->model);
$params = $parse->request();
$newRecordList = [];

$recordList = (new SimpleRecords(null, $this->model, $this->model->getReadConnection()->query($params['sql'], $params['bind'])));

//navigate los records
$newResult = [];
foreach ($recordList as $key => $record) {

    //field the object
    foreach ($record->getAllCustomFields() as $key => $value) {
        $record->{$key} = $value;
    }

    $newResult[] = $record->toFullArray();
}

unset($recordList);

查询解析器扩展

扩展查询解析器允许您通过控制器直接附加搜索参数,而无需重写函数代码。

功能包括在模型中、在模型的自定义字段中以及在模型的子关系中进行搜索的能力。

参数以 field operator value 的格式传递。有效的运算符是 :><

可以通过逗号分隔多个字段进行搜索。您可以通过逗号分隔多个值来搜索字段(相当于 SQL 的 OR)。

查询模型

GET - /v1/model?q=(field1:value1,field2:value2|value3)

查询自定义字段

GET - /v1/model?cq=(field1>value1)

查询相关模型

查询相关模型需要稍微不同的结构。我们想要查询的每个相关模型都必须按照系统中的名称传递,使用 _ 来分隔驼峰命名法。

GET - /v1/model?rq[model_name]=(field1<value1|value2)

在...之间

虽然目前不支持在...之间,但您可以按照以下步骤产生相同的结果

GET - /v1/model?q=(field1>value1,field1<value2)

类似、空或非空

您可以使用此功能查询模型。

类似

  • GET - /v1/model?q=(field1:%value)
  • GET - /v1/model?q=(field1:value%)
  • GET - /v1/model?q=(field1:%value%)

您可以让查询解析器确保字段为空。在整数属性的情况下,查询解析器将询问模型属性默认值是否为 0。如果是,它将包括 0 作为空值。

GET - /v1/model?q=(field1:%%)

非空

这是上述空的相反。

GET - /v1/model?q=(field1:$$)

一个适用于所有人,所有人都适用于一个

您可以将上述所有描述的功能结合在一个查询中。

GET - /v1/model?q=(field1:value1|value2,field2>value3,field2<value4,field3:$$)&cq=(field4:value5)&rq[model_name]=(field5>value6)

只需记住,将任何特殊字符通过查询字符串发送时都要进行转义,以避免得到不期望的结果。

用法

为了访问扩展查询解析器的功能,您的控制器必须扩展 CrudExtendedController

<?php

class ExampleController extends \Baka\Http\Rest\CrudExtendedController

要追加额外的搜索参数,您只需这样做

<?php

public function index($id = null): Response
{
    $this->additionalSearchFields = [
        ['field', ':', 'value'],
    ];

    return parent::index();
}

此方法使用通过URL查询传递给查询解析器的运算符。有效的运算符包括(及其SQL等效项)

<?php

$operators = [
    ':' => '=',
    '>' => '>=',
    '<' => '<=',
];

API自定义字段CRUD

CRUD处理默认行为

  • GET /v1/leads -> 获取所有
  • GET /v1/leads/1 -> 获取一个
  • POST /v1/leads -> 创建
  • PUT /v1/leads/1 -> 更新
  • DELETE /v1/leads/1 -> 删除

为了使用自定义字段,您需要从CrudCustomFieldsController扩展您的控制器,并在该控制器中定义onConstruct()方法。在此方法中,您定义自定义字段的模型和该自定义字段值的模型

<?php
public function onConstruct()
{
    $this->model = new Leads();
    $this->customModel = new LeadsCustomFields();
}

就是这样,您的控制器现在可以像管理主类的属性一样管理自定义字段

常规API CRUD

只需从CrudController扩展您的API控制器,您将拥有以下功能

CRUD处理默认行为

  • GET /v1/leads -> 获取所有
  • GET /v1/leads/1 -> 获取一个
  • POST /v1/leads -> 创建
  • PUT /v1/leads/1 -> 更新
  • DELETE /v1/leads/1 -> 删除

需要定义createFields和updateFields以创建字段