此帮助程序包提供解析 REST-API 请求的 URL 的功能。
注意:此版本适用于 Laravel 5。使用 Laravel 4 时,需要使用 0.4.x 版本。
通过运行来安装包
composer require marcelgwerder/laravel-api-handler
一旦composer完成,将服务提供者添加到app/config/app.php
中的providers
数组中:
MarcelgwerderApiHandlerApiHandlerServiceProvider::class,
现在将ApiHandler
外观导入到您的类中:
use Marcelgwerder ApiHandler Facades ApiHandler ;
或者在app.php
中设置别名:
'ApiHandler' => MarcelgwerderApiHandlerFacadesApiHandler::class,
就是这样!
关系方法现在需要@Relation
注释来证明它们是关系方法而不是任何其他方法(请参阅问题 #11)。
/**
* @Relation
*/
public function author () {
return $ this -> belongsTo ( ' Author ' );
}
如果将数组作为第二个参数传递给parseSingle
,则现在必须有列/值对。这允许我们传递多个条件,例如:
ApiHandler :: parseSingle ( $ books , array ( ' id_origin ' => ' Random Bookstore Ltd ' , ' id ' => 1337 ));
要覆盖配置,请在应用程序的 config 文件夹中创建一个名为apihandler.php
的文件。
查看包源中的配置文件以查看可用的选项。
url解析目前支持:
支持两种 api 资源,单个对象和对象集合。
如果您处理代表单个对象的资源(例如/api/books/1
的 GET 请求,请使用parseSingle
方法。
parseSingle($queryBuilder, $identification, [$queryParams]):
id
列或数组列/值对 ( array('isbn' => '1234')
) 中使用的整数,用作对象的唯一标识符。 ApiHandler :: parseSingle ( $ book , 1 );
如果您处理代表多个对象的资源(例如/api/books
的 GET 请求,请使用parseMultiple
方法。
parseMultiple($queryBuilder, $fullTextSearchColumns, [$queryParams]):
ApiHandler :: parseMultiple ( $ book , array ( ' title ' , ' isbn ' , ' description ' ));
parseSingle
和parseMultiple
都返回一个Result
对象,具有以下可用方法:
getBuilder():返回原始$queryBuilder
及其应用的所有函数。
getResult():返回Laravel的get()
或first()
函数返回的结果对象。
getResultOrFail():如果您期望多个对象,则返回 Laravel 的get()
函数返回的结果对象;如果您期望单个对象,则返回firstOrFail()
。
getResponse($resultOrFail = false):返回一个 Laravel Response
对象,包括正文、标头和 HTTP 状态代码。如果$resultOrFail
为 true,则将在内部使用getResultOrFail()
方法而不是getResult()
。
getHeaders():返回准备好的标头数组。
getMetaProviders():返回元提供程序对象的数组。这些对象中的每一个都通过其get()
方法提供特定类型的元数据。
cleanup($cleanup):如果为 true,则生成的数组将从无意添加的关系中清除。如果将此类关系作为模型访问器中的属性进行访问,则可以自动添加此类关系。清理的全局默认值可以使用配置选项cleanup_relations
定义,默认为false
。
ApiHandler :: parseSingle ( $ books , 42 )-> cleanup ( true )-> getResponse ();
除预定义函数_fields
、 _with
、 _sort
、 _limit
、 _offset
、 _config
和_q
之外,每个查询参数都被解释为过滤器。在将不用于过滤的其他参数传递给parseMultiple
之前,请务必删除它们。
/api/books?title=The Lord of the Rings
所有过滤器均使用AND
运算符组合。
/api/books?title-lk=The Lord*&created_at-min=2014-03-14 12:55:02
上面的示例将生成以下 SQL,其中:
WHERE ` title ` LIKE " The Lord% " AND ` created_at ` >= " 2014-03-14 12:55:02 "
也可以对一个过滤器使用多个值。多个值由管道|
分隔。多个值用OR
组合,除非有-not
后缀,然后它们用AND
组合。例如所有 id 为 5 或 6 的书籍:
/api/books?id=5|6
或者除 id 5 或 6 之外的所有书籍:
/api/books?id-not=5|6
使用-in
后缀也可以实现同样的效果:
/api/books?id-in=5,6
分别为not-in
后缀:
/api/books?id-not-in=5,6
后缀 | 操作员 | 意义 |
---|---|---|
-lk | 喜欢 | 与 SQL LIKE 运算符相同 |
-非-lk | 不喜欢 | 与 SQL NOT LIKE 运算符相同 |
-在 | 在 | 与 SQL IN 运算符相同 |
-不在 | 不在 | 与 SQL NOT IN 运算符相同 |
-分钟 | >= | 大于或等于 |
-最大限度 | <= | 小于或等于 |
-英石 | < | 小于 |
-gt | > | 大于 |
-不是 | != | 不等于 |
两种排序方式,升序和降序。应按降序排序的每一列始终以-
开头。
/api/books?_sort=-title,created_at
支持两种全文搜索实现。您可以通过将配置文件中的fulltext
选项更改为default
或native
来选择使用哪一个。
注意:当使用空_q
参数时,搜索将始终返回空结果。
有限的自定义实现(默认)
给定的文本被分割成关键字,然后在数据库中搜索这些关键字。每当其中一个关键字存在时,相应的行就会包含在结果集中。
/api/books?_q=The Lord of the Rings
上面的示例返回其中一列中包含关键字The
、 Lord
、 of
、 the
、 Rings
之一的每一行。全文搜索中要考虑的列被传递给parseMultiple
。
本机 MySQL 实现
如果您的 MySQL 版本支持您使用的引擎的全文搜索,您可以在 api 处理程序中使用此高级搜索。
只需将fulltext
配置选项更改为本native
,并确保传递给parseMultiple
列上有正确的全文索引。
每个结果还将包含一个_score
列,该列允许您根据结果与搜索词的匹配程度对结果进行排序。例如
/api/books?_q=The Lord of the Rings&_sort=-_score
您可以通过修改配置文件中的fulltext_score_column
设置来调整此列的名称。
要定义结果中数据集的最大数量,请使用_limit
。
/api/books?_limit=50
要定义结果中数据集的偏移量,请使用_offset
。
/api/books?_offset=20&_limit=50
请注意,为了使用offset
您始终必须指定一个limit
。对于没有限制的偏移量定义,MySQL 会抛出错误。
API 处理程序还支持 Eloquent 关系。因此,如果您想获取所有书籍及其作者,只需将作者添加到_with
参数即可。
/api/books?_with=author
关系,也可以嵌套:
/api/books?_with=author.awards
要使其正常工作,您必须将@Relation
注释添加到每个关系方法中,例如:
/**
* @Relation
*/
public function author () {
return $ this -> belongsTo ( ' Author ' );
}
出于安全原因,这是必要的,因此只能使用_with
调用真正的关系方法。
注意:每当您将_fields
与_with
结合使用来限制字段时。在底层,字段通过关系的主键/外键进行扩展。 Eloquent 需要链接键来获取相关模型。
可以在响应中添加附加信息。目前有两种类型的计数可以添加到响应标头中。
total-count
表示资源的所有元素的计数,或更具体地说,是最初传递的查询构建器实例的计数。 filter-count
还考虑了过滤器。例如,它们可用于实现分页。
/api/books?id-gt=5&_config=meta-total-count,meta-filter-count
默认情况下,所有元字段都在响应标头中提供。使用以下自定义标头:
配置 | 标头 |
---|---|
元总计数 | 元总计数 |
元过滤器计数 | 元过滤器计数 |
默认情况下,元数据包含在响应标头中。如果您希望将所有内容都放在响应正文中,您可以通过在_config
参数中包含response-envelope
或覆盖包的默认config.php
来请求所谓的“信封”。
信封具有以下结构:
{
"meta" : {
},
"data" : [
]
}