Дисциплины - Ресурсно-компонентное программирование

Основы разработки бэкенда на Laravel - Ресурсы в Laravel - Структуры JSON-объектов, генерируемые ресурсными классами

В JSON-объекты можно заносить:

  • Поля объекта модели. Причём, свойствам, которые хранят значения полей, можно задавать любые имена.
     public function toArray() {
      return [
       'key' => $this->id,
       'title'=> $this->name,
       ...
      ];
     }
    
  • Любые произвольные значения.
     return [
      ...,
      'product_counts' => $this->products()->count()
     ];
    
     return [
      ...,
      'powered_by' => 'Laravel'
     ];
    
  • Произвольные значения, получаемые в результате вычислений по условию.

    Для вычислений по условию можно воспользоваться специальными ресурсными методами: when, mergeWhen:

     return [
      'count' => $this->when($this->products()->exists(), $this->products()->count()),
      'secret' => $this->when(Auth::user()->isAdmin(), 'secret-value'),
     ];
    

    Вместо выводимого значения (второй входящий параметр метода when), можно использовать анонимную функцию:

     return [
      ...,
      'count' => $this->when($this->products()->exists(), function(){
       return $this->products()->count();
     })
     ];
    
    Если есть несколько атрибутов, которые должны быть включены в ответ ресурса только на основе одного и того же условия, то можно использовать метод mergeWhen для включения атрибутов в ответ только тогда, когда данное условие истинно:
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'email' => $this->email,
            $this->mergeWhen(Auth::user()->isAdmin(), [
                'first-secret' => 'value',
                'second-secret' => 'value',
            ]),
            'created_at' => $this->created_at,
            'updated_at' => $this->updated_at,
        ];
    }
    
  • Связанные записи - ввиде объектов соответствующих ресурсов:
     return [
      ...
      'parent' => new ProductResource($this->parent)
     ];
    
  • Коллекции связных записейм - ввдие объектов ресурсных коллекций.
     return [
      ...
      'products' => new ProductResourceCollection($this->products)
     ];
    
  • Значения из полей записи связующей таблицы.
    use App\Http\Resources\PostResource;
    
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'email' => $this->email,
            'posts' => PostResource::collection($this->posts),
            'created_at' => $this->created_at,
            'updated_at' => $this->updated_at,
        ];
    }
    
    В том числе в связях "многие-со-многими":
     return [
      ...
      'products' => $this->pivot->products
     ];
    
  • Значения из полей записи связующей таблицы по условию. Для этого можно воспользоваться методом whenLoaded
    use App\Http\Resources\PostResource;
    
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'email' => $this->email,
            'posts' => PostResource::collection($this->whenLoaded('posts')),
            'created_at' => $this->created_at,
            'updated_at' => $this->updated_at,
        ];
    }
    
    В дополнение к условному включению сведений об отношениях в ответы вашего ресурса вы можете условно включить данные из промежуточных таблиц отношений многие ко многим, используя метод whenPivotLoaded. Метод whenPivotLoaded принимает имя сводной таблицы в качестве первого аргумента. Вторым аргументом должно быть замыкание, которое возвращает значение, которое будет возвращено, если в модели доступна сводная информация:
    **
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'expires_at' => $this->whenPivotLoaded('role_user', function () {
                return $this->pivot->expires_at;
            }),
        ];
    }
    

Количество комментариев: 0

Для того, чтобы оставить коментарий необходимо зарегистрироваться
20421 БГУИР
30421 БГУИР