Сериализация
# Введение
При построении JSON API очень часто требуется преобразовать модель и отношения в массив или JSON. Октябрь обладает как удобным механизмом для подобных конвертаций, так и инструментами для контроля над отдельными атрибутами при сериализации.
# Основы использования
# Преобразование модели в массив
Используйте метод toArray
, чтобы преобразовать модель и соответствующие ей связи в массив. Этот метод рекурсивный, так что все атрибуты и все отношения (включая отношения отношений) так же будут преобразованы в массивы:
$user = User::with('roles')->first();
return $user->toArray();
Также можно преобразовывать в массивы и коллекции:
$users = User::all();
return $users->toArray();
# Преобразование модели в JSON
Для преобразования модели в JSON Вы можете использовать метод toJson
. Как и toArray
, метод toJson
также является рекурсивным, поэтому все атрибуты и отношения так же будут преобразованы в JSON:
$user = User::find(1);
return $user->toJson();
Как вариант, можно привести модель или коллекцию к строке, что автоматически вызовет метод toJson
:
$user = User::find(1);
return (string) $user;
Т.к. модели и коллекции преобразуются в JSON при приведении к строке, Вы можете возвращать объекты модели напрямую из маршрутов и контроллеров:
Route::get('users', function () {
return User::all();
});
# Скрытие атрибутов из JSON
Иногда Вам может потребоваться ограничения видимости атрибутов (например, пароля) при конвертации в массив или JSON представление. Для реализации этого функционала используйте свойство $hidden
в своей модели:
<?php namespace Acme\Blog\Models;
use Model;
class User extends Model
{
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = ['password'];
}
В качестве альтернативного варианта, можно использовать атрибут $visible
и определить «белый» список разрешенных полей и отношений при конвертации в JSON:
class User extends Model
{
/**
* The attributes that should be visible in arrays.
*
* @var array
*/
protected $visible = ['first_name', 'last_name'];
}
# Добавление атрибутов в JSON
Бывают ситуации, когда при экспорте Вам может понадобиться добавить атрибуты, соответствующих полей для которых в БД нет. Чтобы сделать это, для начала, определите для него аксессор:
class User extends Model
{
/**
* Get the administrator flag for the user.
*
* @return bool
*/
public function getIsAdminAttribute()
{
return $this->attributes['admin'] == 'yes';
}
}
После того, как такой метод создан, добавьте имя атрибута в свойство appends
:
class User extends Model
{
/**
* The accessors to append to the model's array form.
*
* @var array
*/
protected $appends = ['is_admin'];
}
После того как атрибут добавлен в массив appends
, он будет доступен как при конвертации в массив так и JSON. К этим атрибутам также относятся правила, заданные в visible
и hidden
массивах.