Вступление
При создании 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::serializeUsingserializeUsing
<?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 комментариев