我正在使用可加密特征对Room模型的数据进行加密。
RoomController (/ rooms)返回解密的数据,但ApiRoomController (/ api / rooms)不会。 如何使它返回解密的数据?
可加密特征
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);
}
答案 0 :(得分:4)
我找到了使用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);
}
答案 1 :(得分:2)
似乎@emotality已经为此提供了一个很好的解决方案...
但是,此操作未按预期工作的原因是因为基础模型的handle_error()
/ toArray()
方法未在特征中调用toJson()
方法。
这很重要,因为getAttribute()
方法会映射给定的集合并在每个模型上调用response()->json()
方法,以便为响应做准备。
因此,您还可以通过覆盖模型中的toJson()
方法来解决此问题。
toArray