Ответ Laravel JSON возвращает зашифрованные данные - PullRequest
2 голосов
/ 09 мая 2019

Я использую черту Encryptable для шифрования моих данных для модели комнаты.

RoomController (/ комнаты) возвращает расшифрованные данные, а ApiRoomController (/ api / комнаты) - нет. Как я могу сделать так, чтобы он возвращал расшифрованные данные?

Шифруемый признак

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 ]

4 голосов
/ 09 мая 2019

Я нашел способ, используя Ресурсы 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);
}
2 голосов
/ 10 мая 2019

Похоже, @emotality уже нашел хорошее решение для этого ...

Однако, причина этого не работает так, как вы ожидали, в том, что методы toArray() / toJson() базовой Модели делаютне вызывайте метод getAttribute() в вашей характеристике.

Это важно, поскольку метод response()->json() отображает заданную коллекцию и вызывает метод toJson() для каждой модели, чтобы подготовить ее к ответу.

Следовательно, вы также можете решить эту проблему, переписав в своей модели метод toArray.

class Room extends Model
{
    use Encryptable;

    public function toArray()
    {
        return [
            'id'   => $this->id,
            'name' => $this->name,
            // ...
        ];
    }
}

...