A view abstraction for Fractal making it more simple to integrate inside a framework.
composer require lumenated/fractal-views
In order to use Fractal views for a resource we need to implement a transformer to map the resource to a serializable array and a view to present our resource to the consumer.
A View extends the Lumenated\FractalViews\Views
class which exposes two methods:
- renderOne which renders a single resource to an array
- renderMany which renders multiple objects to an array with pagination support
class BookView extends Lumenated\FractalViews\View
{
// The fractal transformer that has to be used for this view
protected $transformerClass = BookTransformer::class;
}
Next up we need to implement the BookTransformer
. Below is an example from the fractal documentation:
<?php
namespace Acme\Transformer;
use Acme\Model\Book;
use League\Fractal;
class BookTransformer extends Fractal\TransformerAbstract
{
public function transform(Book $book)
{
return [
'id' => (int) $book->id,
'title' => $book->title,
'year' => (int) $book->yr,
'links' => [
[
'rel' => 'self',
'uri' => '/books/'.$book->id,
]
],
];
}
}
After configuring our view they can be used inside our project. Below is an example how to use them in a Lumen controller:
namespace \App\Http\Controllers;
class BookController extends Controller
{
private $view;
public function __construct(BookView $view)
{
$this->view = $view;
}
public function get($id)
{
$book = Book::findOrFail($id);
return response()->json($this->view->render($book));
}
public function getAll()
{
$books = Book::all();
return response()->json($this->view->render($books));
}
}
after installing the dependencies with:
composer install
Execute the following command to execute the tests:
vendor/bin/phpunit