Как правильно возвращать JSON с контроллеров Laravel для API приложения?
1. Для того чтобы какие-то поля модели не отображались нужно использовать переменную hidden, с помощью нее мы указываем какие поля не должны отображаться в JSON ответе.protected $hidden = [
        'type_id',
        'created_at',
        'updated_at',
    ];
2. У каждой модели вы должны указать свои поля которые должны быть скрытыprotected $hidden = [
        'type_id',
        'created_at',
        'updated_at',
    ];
3. Category::with('posts.comments')->get();
4. Для этого также есть специальные переменные и методы.
Также доступен такой метод public function getDateAttribute () {
        return date('Y-M-D', $this->date);
    }
public function getUrlAttribute () {
        return url($this->slug);
    }
этот метод выведет $post->date в нужном формате
чтобы такой метод был доступен в json нужно указать его в protected $appends = [
        'url',
        'topic',
    ];
Использую laravel-fractal. В последней версии league/fractal, на основе которого и построен spatie/fractalistic, добавили тип primitive и все стало на свои места. 
Конечно, не обошлось без танцев с бубном: я сделал для нужных моделей трейт Transform, который добавляет метод toApi (хотя лучше бы назвал transform), берущий класс из переменной $transformer:
И пришлось написать макрос для collection ларавельной, тоже toApi(). Хотя без обеих этих фич можно обойтись, используя fractal($items, $transformer).
В остальном же полностью доволен.