0

Борьба с использованием parseIncludes в https://github.com/thephpleague/fractal.Использование parseincludes в Laravel5 Fractal

У меня есть две таблицы, собственность и недели. Каждое свойство имеет много недель. Используя Fractal, я могу вернуть свой элемент недвижимости с коллекцией недель. Я хочу использовать parseIncludes, так что возвращение недель является необязательным.

PropertyTransformer.php

<?php 
namespace App\Transformer; 

use App\Models\Property; 
use League\Fractal\TransformerAbstract; 


class PropertyTransformer extends TransformerAbstract 
{ 

    protected $availableIncludes = [ 
     'week' 
    ]; 

    public function transform(Property $property) 
    { 
     return [ 
      'id'    => (int) $property['PropertyID'], 
      'PropertyName'  => $property['PropertyName'], 
      'ExactBeds'   => (int) $property['ExactBeds'], 
      'weeks'    => $property->week 
     ]; 
    } 

    /** 
    * Include Week 
    * 
    * @return League\Fractal\ItemResource 
    */ 
    public function includeWeek(Property $property) 
    { 
     $week = $property->week; 

     return $this->item($week, new WeekTransformer); 
    } 
} 

WeekTransformer.php

<?php 
namespace App\Transformer; 

use App\Models\Week; 
use League\Fractal; 

class WeekTransformer extends Fractal\TransformerAbstract 
{ 


    public function transform(Week $week) 
    { 
     return [ 
      'Week'   => $week['week'], 
      'Available'  => $week['available'], 
      'Price'   => (int) $week['price'], 

     ]; 
    } 

} 

Мои PropertyController.php

<?php namespace App\Http\Controllers\Api\v1; 

use App\Http\Requests; 
use App\Models\Week; 
use Illuminate\Support\Facades\Response; 

use App\Models\Property; 

use League\Fractal; 
use League\Fractal\Manager; 
use League\Fractal\Resource\Collection as Collection; 
use League\Fractal\Resource\Item as Item; 

use App\Transformer\PropertyTransformer; 


class PropertyController extends \App\Http\Controllers\Controller { 

public function show($id) 
{ 
    $property = Property::with('bedroom')->with('week')->find($id); 

    $fractal = new Fractal\Manager(); 

    if (isset($_GET['include'])) { 
     $fractal->parseIncludes($_GET['include']); 
    } 

    $resource = new Fractal\Resource\Item($property, new PropertyTransformer); 
    //$resource = new Fractal\Resource\Collection($properies, new PropertyTransformer); 

    return $fractal->createData($resource)->parseIncludes('weeks')->toJson(); 

} 

Я получаю следующее сообщение об ошибке на parseIncludes: -

Метод «parseIncludes» не найден в классе \ лига \ Fractal \ Scope

Я следую руководство здесь на трансформаторах - http://fractal.thephpleague.com/transformers/

Я думаю, что я неправильно где-то здесь, где он говорит: -

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

<?php 
use League\Fractal; 

$fractal = new Fractal\Manager(); 

if (isset($_GET['include'])) { 
    $fractal->parseIncludes($_GET['include']); 
} 

Если я удалить parseIncludes, я не получаю сообщение об ошибке, я также получаю мои данные свойства с моим коллективом n недель, но? include = week не работает, чтобы получить его.

ответ

3

Ваша проблема в этой строке:
return $fractal->createData($resource)->parseIncludes('weeks')->toJson();

createData() возвращает \League\Fractal\Scope и это не имеет никакого parseInlcudes метода.

Вы уже назвали parseIncludes здесь:

if (isset($_GET['include'])) { 
    $fractal->parseIncludes($_GET['include']); 
} 

Так просто удалить второй вызов к нему в return заявлении:
return $fractal->createData($resource)->toJson();

+0

Благодаря Армен, вы совершенно правы. Решение, которое я нашел, использовало его, и оно отбрасывало меня от запаха. Проблема была в другом месте, и parseincludes был необходим, и, как вы говорите, это не метод для Scope. Спасибо за вашу помощь. –

+0

Добро пожаловать, Пол. –

+0

убедитесь, что у вас есть 'protected $ availableIncludes = ['xxx']' – Rafee