Вступление

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

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

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

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

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

return $user->toArray();

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

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

return $users->toArray();

 

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

Чтобы преобразовать модель в JSON, вы должны использовать toJsonметод. Мол toArraytoJsonметод рекурсивный, поэтому все атрибуты и отношения будут преобразованы в 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');
        });
    }
}