我有一个名为smsmo的Api端点表,而Models Class是Smsmo,具有以下字段:
Smsmo:
customer code varchar(30),
customer phone varchar(30),
customer name varchar(30),
customer address varchar(30),
customer hash varchar(300)
在尝试保存或更新时,这些字段(电话,代码,姓名)将被哈希到哈希字段中。
hash = name + code + phone
我已经拥有这些Api:
ApiController:
public function indexSmsmo()
{
$smsmos = Smsmo::all();
return response()->json(['success' => true,'data'=>$smsmos], $this->successStatus);
}
public function showSmsmo($id)
{
$smsmo = Smsmo::find($id);
if (is_null($smsmo)) {
return $this->sendError('SMS Outgoing not found.');
}
return response()->json(['success' => true,'data'=>$smsmo], $this->successStatus);
}
public function storeSmsmo(Request $request)
{
$smsmo = Smsmo::create($request->all());
return response()->json(['success' => $smsmo], $this-> successStatus);
}
public function editSmsmo($id)
{
$smsmo = Smsmo::find($id);
return response()->json(['success' => true,'data'=>$smsmo], $this->successStatus);
}
public function updateSmsmo(Request $request, $id)
{
$smsmo = Smsmo::find($id);
$smsmo = $smsmo->update($request->all());
return response()->json(['success' => true,'data'=>$smsmo], $this->successStatus);
}
public function deleteSmsmo($id)
{
$smsmo = Smsmo::find($id)->delete();
}
那么在发送端点之前,如何使用SHA512和上面的函数进行哈希处理。
答案 0 :(得分:2)
您可以为此使用 Laravel Mutator 。
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Smsmo extends Model
{
/**
* Set the hash attribute.
*
* @param string $value
* @return void
*/
public function setHashAttribute($value)
{
$hash = $this->phone.$this->code.$this->name;
$this->attributes['hash'] = hash('sha512', $hash, false);
}
}
无需更改控制器功能。
此处是文档,以获取更多详细信息。 https://laravel.com/docs/5.8/eloquent-mutators
答案 1 :(得分:1)
PHP具有built-in hash()
函数,该函数涵盖了包括SHA-512
在内的许多算法,因此这样的方法应该可以工作:
public function storeSmsmo(Request $request)
{
$smsmo = new Smsmo;
$smsmo->fill($request->all());
$smsmo->hash = hash('sha512', $smsmo->name.$smsmo->code.$smsmo->phone);
$smsmo->save();
return response()->json(['success' => $smsmo], $this-> successStatus);
}
public function updateSmsmo(Request $request, $id)
{
$smsmo = Smsmo::find($id);
$smsmo->fill($request->all());
$smsmo->hash = hash('sha512', $smsmo->name.$smsmo->code.$smsmo->phone);
$smsmo->save();
return response()->json(['success' => true,'data'=>$smsmo], $this->successStatus);
}
或者,您可以通过延长模型生命周期来提高代码的可重用性:
class Smsmo extends Model
{
...
public static function boot()
{
parent::boot();
static::saving(function ($model){
$model->hash = hash('sha512', $model->name.$model->code.$model->phone);
});
}
...
}
简而言之,在保存static::saving()
模型之前,将始终执行您在Smsmo
中定义的任何内容。通过这种方法,您无需在控制器中进行任何更改。