samj/fractal-bundle

This package is abandoned and no longer maintained. No replacement package was suggested.

A Symfony Bundle for Fractal by League. Implements dependency injection into your transformers

4.0.0 2020-06-19 12:31 UTC

This package is auto-updated.

Last update: 2021-09-19 14:59:25 UTC


README

This bundle provides integration of league/fractal for Symfony. In addition it allows you to use transformers as a services.

Getting Started

First of all you need to add dependency to composer.json:

composer require samj/fractal-bundle

Then register bundle in app/AppKernel.php:

public function registerBundles()
{
    return [
        // ...
        new SamJ\FractalBundle\SamJFractalBundle(),
    ];
}

Now we can write and use fractal transformers:

Using Transformers as Services

There are several cases when you need to pass some dependencies into transformer. The common one is role/scope based results in transformers. For example you need to show email field only for administrators or owner of user profile:

class UserTransformer extends TransformerAbstract
{
    private $authorizationCheker;
    
    public function __construct(AuthorizationChecker $authorizationCheker)
    {
        $this->authorizationCheker = $authorizationCheker;
    }
    
    public function transform(User $user)
    {
        $data = [
            'id' => $user->id(),
            'name' => $user->name(),
        ];
        
        if ($this->authorizationChecker->isGranted(UserVoter::SEE_EMAIL, $user)) {
            $data['email'] = $user->email();
        }
        
        return $data;
    }
}

Then you could just register this class as service, and pass service ID as transformer. This bundle then will try to get it from container:

$resource = new Collection($users, 'app.transformer.user');

This works in includes as well:

public function includeFriends(User $user)
{    
    return $this->collection($user->friends(), 'app.transformer.user');
}

You could see example of how to use transformers in sample application which is used in test suites.