У меня есть ArticleCommentsController с методом индекса
class ArticleCommentsController extends BaseController
{
public function index($id)
{
$comments = DB::table('comments')
->leftJoin('users', 'users.id', '=', 'comments.user_id')
->where('comments.article_id', '=', $id)
->get();
return $this->response->item($comments, new CommentTransformer);
}
}
Это класс трансформер
namespace App\Transformers;
use League\Fractal\TransformerAbstract;
class CommentTransformer extends TransformerAbstract{
public function transform($comment)
{
return $comment; //simplified
}
}
Ответом является следующая ошибка:
get_class() expects parameter 1 to be object, array given.
Очевидно, мне нужно отправить экземпляр объекта комментария при вызове Fractal \ transform, но я не знаю, как это сделать, поскольку необработанные запросы laravel возвращают только массив или экземпляр класса QueryBuilder.
К сожалению, item
метод на response
объект, кажется, требует и объект, а не массив. С использованием array
Метод сработает, но не будет использовать любой передаваемый вами трансформатор.
Итак, я думаю, что вы могли бы уйти с помощью ArrayObject
, следующим образом:
return $this->response->item(new ArrayObject($comments), new CommentTransformer);
Не забудьте поставить use ArrayObject;
в верхней части файла.
это было очень давно, но я напишу ответы для этого парня или других или меня в будущем, если я потеряю память, хахаха
class ArticleCommentsController extends BaseController
{
public function index($id)
{
$comments = DB::table('comments')
->leftJoin('users', 'users.id', '=', 'comments.user_id')
->where('comments.article_id', '=', $id)
->get();
return $this->response->collection(Collection::make($comments), new CommentTransformer);
}
}
конечно, вам нужно добавить это в контроллер ArticleCommentsController
// Dingo
use Dingo\Api\Routing\Helpers;
//Convert query to collective
use Illuminate\Support\Collection;
//Transformers for API
use App\Transformers\CommentTransformer;
и это внутри вашего контроллера перед вашими функциями
//Use for Dingo Helpers
use Helpers;
Все вместе:
<?php
namespace App\Http\Controllers;
use Response;
use App\User;
use App\Http\Requests;
use Illuminate\Http\Request;
// Dingo
use Dingo\Api\Routing\Helpers;
//Convert query from LMS lbrary to collective
use Illuminate\Support\Collection;
//Transformers for API
use App\Transformers\CommentTransformer;
class ArticleCommentsController extends BaseController
{
//Use for Dingo Helpers
use Helpers;
public function index($id)
{
$comments = DB::table('comments')
->leftJoin('users', 'users.id', '=', 'comments.user_id')
->where('comments.article_id', '=', $id)
->get();
return $this->response->collection(Collection::make($comments), new CommentTransformer);
}
}
С уважением !, Я надеюсь, что это поможет другим в будущем: D
Проделайте следующие шаги, все получится:
1.Change
return $this->response->item($comments, new CommentTransformer);
в
return $this->response->collection(Collection::make($comments), new CommentTransformer);
2.Трансфомер класс
namespace App\Transformers;
use League\Fractal\TransformerAbstract;
class CommentTransformer extends TransformerAbstract{
public function transform($comment)
{
return [
'id' => $comment->id,
...
];
}
}