kodicms / laravel-api
v1.0.5
2016-02-16 17:36 UTC
Requires
- php: >=5.5.9
- laravel/framework: 5.*
README
该包是为了方便处理API请求而设计的。目前,该模块仅提供了一个控制器,包含一系列方法,帮助组织AJAX请求的处理。
安装
composer require kodicms/laravel-api
添加外观到别名
'RouteAPI' => KodiCMS\API\RouteApiFacade::class,
修改文件 app\Exceptions\Handler.php
...
use KodiCMS\API\Http\Response as APIResponse;
use KodiCMS\API\Exceptions\Exception as APIException;
...
/**
* Render an exception into an HTTP response.
*
* @param \Illuminate\Http\Request $request
* @param \Exception $e
*
* @return \Illuminate\Http\Response
*/
public function render($request, \Exception $e)
{
if ($request->ajax() OR ($e instanceof APIException)) {
return (new APIResponse(config('app.debug')))
->createExceptionResponse($e);
}
...
}
描述
控制器
控制器需要继承自 KodiCMS\API\Http\Controllers\Controller
,之后它将开始以特定格式返回所有响应(错误等),并可以选择响应类型(json
,xml
,yaml
)
响应示例
{ code: 200, content: '....', type: 'content', method: '...' }
响应代码
200
- 正常110
- 请求中未传递必需的参数120
- 验证错误130
- 未知错误140
- 令牌错误150
- 尝试在模型中设置受保护的字段值220
- 权限错误403
- 未授权404
- 页面未找到
响应类型
error
- 错误content
- 响应redirect
- 重定向
不同代码的响应示例(JSON格式)
// 200
{
code: 200,
content: '....',
type: 'content',
method: '...'
}
// 200/Redirect
{
code: 200,
targetUrl: '....',
content: '....',
type: 'redirect',
method: '...'
}
// 110
{
code: 110,
type: 'error',
failed_rules: {...}, // поля, которые не прошли валидацию с текстом ошибки
message: ... // текст ошибки
...
}
// 120
{
code: 120,
type: 'error',
errors: {...}, // текст ошибок
failed_rules: {...} поля, которые не прошли валидацию с текстом ошибки
...
}
// Другие ошибки
{
type: 'error',
message: ... // текст ошибки
...
}
实用方法
getParameter($key, $default = NULL, $isRequired = false)
- 获取请求中传递的参数getRequiredParameter($key, $rules = true)
- 获取必需的参数,第二个参数可以指定验证规则(true == 'required'
),抛出错误110setMessage($message)
- 将消息传递到响应setErrors(array $errors)
- 将错误传递到响应setContent($data)
- 将数据传递到响应。如果传递的是view
,则将其转换为HTML
实用参数
jsonResponse
- 将要传递到响应并转换为JSON的数据requiredFields
- 期望的字段,形式为['action' => ['param1', 'param2']]
路由器
为API模块创建了一个外观 RouteAPI
,用于添加API路由,它将自动为新路由添加响应类型选择(json
,xml
,yaml
)的能力。
API请求可以按以下方式执行
- site.com/api.refresh.key =>
json
, - site.com/api.refresh.key.json =>
json
, - site.com/api.refresh.key.xml =>
xml
, - site.com/api.refresh.key.yaml =>
yaml
示例
RouteAPI::post('refresh.key', ['as' => 'api.refresh.key', 'uses' => 'API\KeysController@postRefresh']);
// Что равнозначно
Route::post('api.refresh.key{type?}', ['as' => 'api.refresh.key', 'uses' => 'API\KeysController@postRefresh'])->where('type', '\.[a-z]');
返回数据的控制器示例
use KodiCMS\API\Http\Controllers\Controller;
class PageController extends Controller
{
public function getSearch()
{
$query = $this->getRequiredParameter('search');
...
$this->setContent(view('pages.children'));
}
}
// return JsonResponse
{
code: 200,
content: 'html data',
method: 'get',
type: 'content'
}
以任意形式返回数据的控制器示例
use KodiCMS\API\Http\Controllers\Controller;
class MessageController extends Controller
{
public function sendMessage()
{
$message = $this->getRequiredParameter('message');
...
$this->testParam = '...';
// или
$this->jsonResponse['testParam'] = '...';
$this->setMessage($message);
}
}
// return JsonResponse
{
code: 200,
content: null,
testParam: '...'
type: 'content',
method: 'post',
message: 'message text'
}
带有重定向的控制器示例
use KodiCMS\API\Http\Controllers\Controller;
class MessageController extends Controller
{
public function sendMessage()
{
$message = $this->getRequiredParameter('message');
...
return redirect('...');
}
}
// return JsonResponse
{
code: 200,
targetUrl: '....',
content: '....',
method: 'post',
type: 'redirect'
}
输出HTML的控制器示例
use KodiCMS\API\Http\Controllers\Controller;
class MessageController extends Controller
{
public function sendMessage()
{
$message = $this->getRequiredParameter('message');
...
return view('.....');
}
}
// return JsonResponse
'html content'
异常
API模块有自己的异常类 KodiCMS\API\Exceptions\Exception
,最好从该类继承API控制器使用的异常。该类包含一个 responseArray
方法,其中包含将传递到 Response
的参数列表
/**
* @var int
*/
protected $code = Response::ERROR_UNKNOWN;
public function responseArray()
{
return [
'code' => $this->getCode(),
'type' => Response::TYPE_ERROR,
'message' => $this->getMessage(),
];
}
自定义异常类示例
use KodiCMS\API\Exceptions\Exception;
use KodiCMS\API\Http\Response;
class ValidationException extends Exception
{
/**
* @var int
*/
protected $code = Response::ERROR_VALIDATION;
public function getFailedRules()
{
...
}
public function getErrorMessages()
{
...
}
/**
* @return array
*/
public function responseArray()
{
$data = parent::responseArray();
$data['failed_rules'] = $this->getFailedRules();
$data['errors'] = $this->getErrorMessages();
return $data;
}
}