【发布时间】:2016-07-10 00:39:16
【问题描述】:
我有这个控制器用于我在 Laravel Lumen 中构建的 RESTful API,它接受相对大量的参数并将它们解析到查询位置,并根据是否提供数据来获取数据。例如,
GET /nodes?region=California
GET /nodes?ip=127.0.0.1
我目前正在将它们放入构造函数中,构建参数数组(因为我无法弄清楚如何在 Lumen 中获取原始 get 数组,并且因为我已经有其他参数所以不方便),并且过滤掉空值(如果它们不在查询中,我将值设置为空)。
现在,当涉及到过滤数组中的每个值时,我是通过一个 foreach 数组来完成的。这是我能想到的最简洁的方法,无需太多代码(我不想让我的控制器太胖。)。 有没有其他方法可以干净地做到这一点,也许是函数/类的分离?
这是我的构造函数代码:
/**
* Get some values before using functions.
*
* @param Request $request Instance of request.
*/
public function __construct(Request $request)
{
$this->offset = (int) $request->input('offset', 0);
// TODO: I'm not sure how to implement this, code in question
$this->filters = [
'region' => $request->input('region', null),
'name' => $request->input('name', null),
'ip' => $request->input('ip', null)
];
$this->filters = array_filter($this->filters, function ($v) {
return !is_null($v);
});
// Set a sane SQL limit.
$this->limit = 5;
$this->request = $request;
}
以及控制器代码:
/**
* List all nodes.
*
* @return [string] [JSON containing list of nodes, if sorted.]
*/
public function all()
{
try {
// use filters provided
$data = Nodes::limit($this->limit)->offset($this->offset);
foreach ($this->filters as $filter => $value) {
$data->where($filter, $value);
}
$data = $data->get();
$response = $this->respond($data);
} catch (\Exception $e) {
$response = $this->respondServerError('Could not retrieve data from database.');
}
return $response;
}
【问题讨论】:
标签: php sql arrays laravel lumen