Laravel json 响应 returns 加密数据
Laravel json response returns encrypted data
我正在使用 Encryptable 特征来为 a Room 模型加密我的数据。
RoomController (/rooms) returns 解密数据但 ApiRoomController (/api/rooms) 没有。
我怎样才能returns解密数据?
可加密特征
trait Encryptable
{
public function getAttribute($key)
{
$value = parent::getAttribute($key);
if (in_array($key, $this->encryptable) && $value !== '' && $value !== null ) {
$value = Crypt::decrypt($value);
}
return $value;
}
public function setAttribute($key, $value)
{
if (in_array($key, $this->encryptable)) {
$value = Crypt::encrypt($value);
}
return parent::setAttribute($key, $value);
}
}
RoomController索引函数
public function index()
{
$rooms = Room::select('id', 'name')->get()->sortBy('name')->values()->all();
return view('rooms.index')->withRooms($rooms);
}
ApiRoomController索引函数
public function index()
{
$rooms = Room::select('id', 'name')->get()->sortBy('name')->values()->all();
return response()->json($rooms);
}
我找到了使用 API Resources 的方法:
php artisan make:resource Rooms --collection
然后在您的 app/Http/Resources/Rooms.php
文件中:
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
// more fields here
];
}
然后在您的 ApiRoomController.php
文件中:
use App\Http\Resources\Rooms;
public function index()
{
$rooms = Room::select('id', 'name')->get()->sortBy('name')->values()->all();
return Rooms::collection($rooms);
}
@emotality 似乎已经想出了一个很好的解决方案...
然而,这并没有像您预期的那样工作的原因是因为底层模型的 toArray()
/ toJson()
方法没有调用您特征中的 getAttribute()
方法。
这很重要,因为 response()->json()
方法映射给定的集合并在每个模型上调用 toJson()
方法以准备响应。
因此,您也可以通过覆盖模型中的 toArray
方法来解决此问题。
class Room extends Model
{
use Encryptable;
public function toArray()
{
return [
'id' => $this->id,
'name' => $this->name,
// ...
];
}
}
我正在使用 Encryptable 特征来为 a Room 模型加密我的数据。
RoomController (/rooms) returns 解密数据但 ApiRoomController (/api/rooms) 没有。 我怎样才能returns解密数据?
可加密特征
trait Encryptable
{
public function getAttribute($key)
{
$value = parent::getAttribute($key);
if (in_array($key, $this->encryptable) && $value !== '' && $value !== null ) {
$value = Crypt::decrypt($value);
}
return $value;
}
public function setAttribute($key, $value)
{
if (in_array($key, $this->encryptable)) {
$value = Crypt::encrypt($value);
}
return parent::setAttribute($key, $value);
}
}
RoomController索引函数
public function index()
{
$rooms = Room::select('id', 'name')->get()->sortBy('name')->values()->all();
return view('rooms.index')->withRooms($rooms);
}
ApiRoomController索引函数
public function index()
{
$rooms = Room::select('id', 'name')->get()->sortBy('name')->values()->all();
return response()->json($rooms);
}
我找到了使用 API Resources 的方法:
php artisan make:resource Rooms --collection
然后在您的 app/Http/Resources/Rooms.php
文件中:
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
// more fields here
];
}
然后在您的 ApiRoomController.php
文件中:
use App\Http\Resources\Rooms;
public function index()
{
$rooms = Room::select('id', 'name')->get()->sortBy('name')->values()->all();
return Rooms::collection($rooms);
}
@emotality 似乎已经想出了一个很好的解决方案...
然而,这并没有像您预期的那样工作的原因是因为底层模型的 toArray()
/ toJson()
方法没有调用您特征中的 getAttribute()
方法。
这很重要,因为 response()->json()
方法映射给定的集合并在每个模型上调用 toJson()
方法以准备响应。
因此,您也可以通过覆盖模型中的 toArray
方法来解决此问题。
class Room extends Model
{
use Encryptable;
public function toArray()
{
return [
'id' => $this->id,
'name' => $this->name,
// ...
];
}
}