我们正在使用Laravel 4构建RESTful API。在使用优秀的Laracasts系列进行一些初步培训之后,我们给出的一个提示是使用对象变换器将我们的db结构转换为更易读的响应字段..所以对于例子' user_qual'可能会成为用户资格'等等。这意味着对基础结构的更改不会影响API定义。
但是,我们现在发现用户希望使用相同的命名约定发送POST请求,因此他们会在名为' user_qualification'我们现在需要将其映射到底层数据库表,但这个步骤似乎并未涵盖在laracasts中。我们现在正在做的事情如下所示(对于PUT)并且它有效,但是有更好的方法吗?在我们使用变换器之前,很容易将input :: all()映射到模型对象并进行更新,所以我认为必须有一个更简单的方法!感谢任何提示!
$this->staff = Staff::find($id);
if (!$this->staff) return $this->respondNotFound('Staff not found', 100);
//map inbound to model
$newStaffData = array();
if (Input::has('name')) $newStaffData = array_add($newStaffData, 'name', Input::get('name'));
if (Input::has('mobile')) $newStaffData = array_add($newStaffData, 'mobile_num', Input::get('mobile'));
if (Input::has('email')) $newStaffData = array_add($newStaffData, 'email_address', Input::get('email'));
if (Input::has('employee_id')) $newStaffData = array_add($newStaffData, 'employee_num', Input::get('employee_id'));
if (Input::has('staff_id')) $newStaffData = array_add($newStaffData, 'unique_id', Input::get('staff_id'));
if (Input::has('home_number')) $newStaffData = array_add($newStaffData, 'alternate_contact_num', Input::get('home_number'));
if (Input::has('address_line_1')) $newStaffData = array_add($newStaffData, 'address_line_1', Input::get('address_line_1'));
if (Input::has('address_line_2')) $newStaffData = array_add($newStaffData, 'address_line_2', Input::get('address_line_2'));
if (Input::has('address_line_3')) $newStaffData = array_add($newStaffData, 'address_line_3', Input::get('address_line_3'));
if (Input::has('address_line_4')) $newStaffData = array_add($newStaffData, 'address_line_4', Input::get('address_line_4'));
if (Input::has('post_code')) $newStaffData = array_add($newStaffData, 'postcode', Input::get('post_code'));
if (Input::has('country')) $newStaffData = array_add($newStaffData, 'country_id', Input::get('country'));
$this->staff->fill($newStaffData);
if (!$this->staff->isValid('update')) {
return $this->respondCantProcess('Validation Failed - ' . $this->staff->errors, 100);
}
答案 0 :(得分:2)
Fractal可能对您有用。
有一种更简单的方法,但Laravel没有提供。只需编写更好的PHP将大大减少您需要编写的内容。例如:
$newStaffData = array(
'name' => Input::get('name', $this->staff->name),
'mobile_num' => Input::get('mobile', $this->staff->mobile_num),
'email_address' => Input::get('email', $this->staff->email_address),
// ... and so on
);
$this->staff->fill($newStaffData);
if (!$this->staff->isValid('update')) {
return $this->respondCantProcess('Validation Failed - ' . $this->staff->errors, 100);
}
如果你经常进行这种类型的编码,我会创建一个简化过程的函数。例如,您可以执行以下操作:
function array_trans(array $lookup, $data)
{
$translated = array();
foreach($lookup as $from => $to)
{
if (array_key_exists($from, $data))
{
$translated[$to] = $data[$from];
}
}
return $translated;
}
使用示例:
$lookup = array(
'name' => 'name',
'mobile' => 'mobile_num',
'email' => 'email_address',
);
$newStaffData = array_trans($lookup, Input::get());