baka / http
Baka Http 组件
Requires
- php: >=7.2
- ext-phalcon: >=3.0.0
- baka/database: ^0.5
- baka/elasticsearch: ^1.0
- elasticsearch/elasticsearch: ^6.1
- guzzlehttp/guzzle: ^6.3
- phalcon/incubator: >=3.0.0
- vlucas/phpdotenv: ^2.0
Requires (Dev)
- codeception/codeception: ^2.4
- codeception/verify: *
- odan/phinx-migrations-generator: ^4.0
- phalcon/incubator: ~3.3
- vlucas/phpdotenv: ^2.0
- dev-master
- 0.5.x-dev
- v0.5.7
- v0.5.6
- v0.5.5
- v0.5.4
- v0.5.3
- v0.5.2
- v0.5.1
- v0.5
- v0.5-beta
- 0.1.x-dev
- v0.1.10
- v0.1.9
- v0.1.8
- v0.1.7
- v0.1.6
- v0.1.5.3
- 0.1.5.2
- v0.1.5.1
- v0.1.5
- v0.1.4
- v0.1.3
- v0.1.2
- v0.1.1
- v0.1
- dev-feature-elasticsearch-nestedqueries
- dev-add-scrutinizer-0.5
- dev-feature-use-functions-for-relationships
- dev-feature-v5-elasticsearch
This package is auto-updated.
Last update: 2024-09-15 07:58:02 UTC
README
PhalconPHP 包,用于创建快速 RESTful API,提供简单的方法来创建快速的 CRUD
目录
测试
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以创建字段