Вступление
При создании API-интерфейсов JSON вам часто нужно преобразовывать свои модели и отношения в массивы или JSON. Eloquent включает удобные методы для выполнения этих преобразований, а также управления тем, какие атрибуты включены в ваши сериализации.
Сериализация моделей и коллекций
Сериализация в массивы
Чтобы преобразовать модель и ее загруженные отношения в массив, вы должны использовать toArray
метод. Этот метод является рекурсивным, поэтому все атрибуты и все отношения (включая отношения отношений) будут преобразованы в массивы:
$user = App\User::with('roles')->first();
return $user->toArray();
Вы также можете конвертировать целые коллекции моделей в массивы:
$users = App\User::all();
return $users->toArray();
Сериализация в JSON
Чтобы преобразовать модель в JSON, вы должны использовать toJson
метод. Мол toArray
, toJson
метод рекурсивный, поэтому все атрибуты и отношения будут преобразованы в JSON. Вы также можете указать параметры кодирования JSON, поддерживаемые PHP :
$user = App\User::find(1);
return $user->toJson();
return $user->toJson(JSON_PRETTY_PRINT);
Кроме того, вы можете привести модель или коллекцию к строке, которая автоматически вызовет toJson
метод для модели или коллекции:
$user = App\User::find(1);
return (string) $user;
Поскольку модели и коллекции преобразуются в JSON при приведении к строке, вы можете возвращать объекты Eloquent непосредственно из маршрутов или контроллеров вашего приложения:
Route::get('users', function () {
return App\User::all();
});
Отношения
Когда модель Eloquent преобразуется в JSON, ее загруженные связи будут автоматически включены в качестве атрибутов в объект JSON. Кроме того, хотя методы отношений Eloquent определяются с использованием «случая верблюда», атрибутом JSON отношения будет «случай змеи».
Скрытие атрибутов от JSON
Иногда вы можете захотеть ограничить атрибуты, такие как пароли, которые включены в массив вашей модели или представление JSON. Для этого добавьте $hidden
свойство к вашей модели:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = ['password'];
}
При скрытии отношений используйте имя метода отношения.
В качестве альтернативы вы можете использовать это visible
свойство для определения белого списка атрибутов, которые должны быть включены в массив вашей модели и представление JSON. Все остальные атрибуты будут скрыты при преобразовании модели в массив или JSON:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* The attributes that should be visible in arrays.
*
* @var array
*/
protected $visible = ['first_name', 'last_name'];
}
Временное изменение видимости атрибута
Если вы хотите сделать некоторые типично скрытые атрибуты видимыми в данном экземпляре модели, вы можете использовать makeVisible
метод. makeVisible
Метод возвращает экземпляр модели для удобного метода построения цепочки:
return $user->makeVisible('attribute')->toArray();
Аналогично, если вы хотите сделать некоторые типично видимые атрибуты скрытыми в данном экземпляре модели, вы можете использовать makeHidden
метод.
return $user->makeHidden('attribute')->toArray();
Добавление значений в JSON
Иногда при приведении моделей к массиву или JSON вы можете добавить атрибуты, у которых нет соответствующего столбца в вашей базе данных. Для этого сначала определите метод доступа для значения:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* Get the administrator flag for the user.
*
* @return bool
*/
public function getIsAdminAttribute()
{
return $this->attributes['admin'] == 'yes';
}
}
После создания средства доступа добавьте имя атрибута к appends
свойству модели. Обратите внимание, что на имена атрибутов обычно ссылаются в «случае змеи», даже если метод доступа определяется с помощью «случая верблюда»:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* The accessors to append to the model's array form.
*
* @var array
*/
protected $appends = ['is_admin'];
}
После добавления атрибута в appends
список он будет включен как в массив модели, так и в представления JSON. Атрибуты в appends
массиве также будут соответствовать параметрам visible
и hidden
, настроенным в модели.
Добавление во время выполнения
Вы можете указать одному экземпляру модели добавлять атрибуты, используя append
метод. Или вы можете использовать setAppends
метод для переопределения всего массива добавленных свойств для данного экземпляра модели:
return $user->append('is_admin')->toArray();
return $user->setAppends(['is_admin'])->toArray();
Дата сериализации
Настройка формата даты для атрибута
Вы можете настроить формат сериализации отдельных атрибутов даты Eloquent, указав формат даты в объявлении приведения :
protected $casts = [
'birthday' => 'date:Y-m-d',
'joined_at' => 'datetime:Y-m-d H:00',
];
Глобальная настройка через Carbon
Laravel расширяет библиотеку дат Carbon , чтобы обеспечить удобную настройку формата сериализации JSON в Carbon. Чтобы настроить сериализацию всех дат углерода в вашем приложении, используйте метод. Метод принимает Closure , который возвращает строковое представление даты для сериализации JSON:Carbon::serializeUsing
serializeUsing
<?php
namespace App\Providers;
use Illuminate\Support\Carbon;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Register bindings in the container.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Carbon::serializeUsing(function ($carbon) {
return $carbon->format('U');
});
}
}
0 комментариев