Ответ Laravel JSON возвращает зашифрованные данные
Я использую черту Encryptable для шифрования моих данных для модели комнаты.
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);
}
2 ответа
Я нашел способ с помощью ресурсов API:
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,
// ...
];
}
}