Может войдёшь?
Черновики Написать статью Профиль

Сериализация

перевод документация 5.х

  1. 1. Введение
  2. 2. Сериализация моделей и коллекций
    1. 2.1. Сериализация в массивы
    2. 2.2. Сериализация в JSON
  3. 3. Скрытие атрибутов от JSON
  4. 4. Добавление значений в JSON
Этот перевод актуален для англоязычной документации на (ветка 5.3) , (ветка 5.2) и (ветка 5.1). Опечатка? Выдели и нажми Ctrl+Enter.

Введение

При создании JSON API вам часто потребуется преобразовывать модели и отношения к массивам или формату JSON. Eloquent содержит методы для выполнения этих преобразований и управляет атрибутами, включенными в вашу сериализацию.

Сериализация моделей и коллекций

Сериализация в массивы

Для преобразования модели и её загруженных отношений в массив надо использовать метод PHPtoArray(). Этот метод рекурсивный, поэтому все атрибуты и все отношения (включая отношения отношений) будут конвертированы в массивы:

PHP
$user App\User::with('roles')->first();

return 
$user->toArray();

Вы можете также преобразовывать целые коллекции моделей в массивы:

PHP
$users App\User::all();

return 
$users->toArray();

Сериализация в JSON

Для преобразования модели в JSON вам надо использовать метод PHPtoJson(). Метод PHPtoJson() рекурсивный, поэтому все атрибуты и отношения будут преобразованы в JSON:

PHP
$user App\User::find(1);

return 
$user->toJson();

В качестве альтернативы, вы можете преобразовать модель или коллекцию в строку, что автоматически вызовет метод PHPtoJson() на модели или коллекции:

PHP
$user App\User::find(1);

return (string) 
$user;

Поскольку модели и коллекции конвертируются в JSON при их преобразовании в строку, вы можете возвращать объекты Eloquent напрямую из ваших маршрутов или контроллеров:

PHP
Route::get('users', function () {
  return 
App\User::all();
});

Скрытие атрибутов от JSON

Иногда вам может быть нужно ограничить список атрибутов, включённых в преобразованный массив или JSON-строку — например, скрыть пароли. Для этого добавьте в модель свойство PHP$hidden:

PHP
<?php

namespace App;

use 
Illuminate\Database\Eloquent\Model;

class 
User extends Model
{
  
/**
    * Атрибуты, которые должны быть невидимы для массива.
    *
    * @var array
    */
  
protected $hidden = ['password'];
}

При скрытии отношений используйте имя метода отношения, а не имя его динамического свойства.

Вы также можете использовать свойство visible, чтобы определить белый список атрибутов, которые должны быть включены в ваш массив модели и преобразованный JSON. Все остальные атрибуты будут скрыты при конвертировании модели в массив или JSON:

PHP
<?php

namespace App;

use 
Illuminate\Database\Eloquent\Model;

class 
User extends Model
{
  
/**
   * Атрибуты, которые должны быть видны в массиве.
   *
   * @var array
   */
  
protected $visible = ['first_name''last_name'];
}
+ 5.3 5.2

добавлено в 5.3 () 5.2 ()

Временное изменение видимости атрибута

Используйте метод PHPmakeVisible(), чтобы сделать обычно скрытые атрибуты видимыми в данном экземпляре модели. Метод PHPmakeVisible() возвращает экземпляр модели для удобной сцепки методов:

PHP
return $user->makeVisible('attribute')->toArray();

А также, используйте метод PHPmakeHidden(), чтобы сделать обычно видимые атрибуты скрытыми в данном экземпляре модели.

PHP
return $user->makeHidden('attribute')->toArray();

Добавление значений в JSON

Иногда, при конвертировании моделей в массив или JSON, вам может понадобиться добавить атрибуты, для которых нет соответствующих столбцов в вашей БД. Для этого просто определите для него читателя:

PHP
<?php

namespace App;

use 
Illuminate\Database\Eloquent\Model;

class 
User extends Model
{
  
/**
   * Получить флаг администратора для пользователя.
   *
   * @return bool
   */
  
public function getIsAdminAttribute()
  {
    return 
$this->attributes['admin'] == 'yes';
  }
}

После создания читателя, добавьте имя атрибута в свойство модели appends. Обратите внимание на то, что имена атрибутов обычно указываются в стиле «snake case», хотя читатель определяется в стиле «camel case»:

PHP
<?php

namespace App;

use 
Illuminate\Database\Eloquent\Model;

class 
User extends Model
{
  
/**
   * Читатель, добавленный к форме массива модели.
   *
   * @var array
   */
  
protected $appends = ['is_admin'];
}

Когда атрибут добавлен в список appends, он будет включён в оба представления — и в массив модели, и в JSON. Атрибуты в массиве appends соответствуют настройкам модели visible и hidden.

Написать комментарий

Разметка: ? ?

Авторизуйся, чтобы прокомментировать.