Skip to content
This repository has been archived by the owner on Jun 27, 2022. It is now read-only.

Latest commit

 

History

History
237 lines (181 loc) · 5.24 KB

converter.md

File metadata and controls

237 lines (181 loc) · 5.24 KB

Converter

Fixture converters transform the fixture data in objects.

DefaultConverter

The standard converter uses the setter methods of the class. It can also works with classes that have a constructor and has some more features.

The default converter needs the class property so that it knows which class to be initialized.

fixtures:
    user:
        properties:
            class: 'YourBundle\Entity\User'
        data:
            # ...

The converter handles all attributes and he trying to pass values ​​to the object.

fixtures:
    user:
        properties:
            class: 'YourBundle\Entity\User'
        data:
            david:
                name: 'David Badura'
                email: 'd.badura@gmx.de'

Order to pass data:

  • $object->set{PropertyName}()
  • $object->add{PropertyName}() (foreach)
  • $object->get{PropertyName}() (instanceof ArrayCollection)
  • $object->{PropertyName}
  • $object->__set()

If you have a class with a constructor you can add the constructor property.

fixtures:
    user:
        properties:
            class: 'YourBundle\Entity\User'
            constructor: [name, email]
        data:
            david:
                name: 'David Badura'
                email: 'd.badura@gmx.de'

Also you can mark optional constructor attributes with a ? symbole.

fixtures:
    user:
        properties:
            class: 'YourBundle\Entity\User'
            constructor: [name, ?email]
        data:
            david:
                name: 'David Badura'

The DefaultConverter support \DateTime parameters in setter and adder methods:

Method example $object->setCreateDate(\DateTime $date)

fixtures:
    user:
        properties:
            class: 'YourBundle\Entity\User'
            constructor: [name, ?email]
        data:
            david:
                name: 'David Badura'
                createDate: 'now'

Create your own converter

You can also implement your own Converter. The Converter must extends the DavidBadura\FixturesBundle\FixtureConverter\FixtureConverter class. The fixture converter are loaded automatically from YourBundle\FixtureConverter folder.

// YourBundle/FixtureConverter/UserConverter.php
namespace YourBundle\FixtureConverter;

use DavidBadura\FixturesBundle\FixtureConverter\FixtureConverter;
use DavidBadura\FixturesBundle\FixtureData;

class UserConverter extends FixtureConverter
{

    public function createObject(FixtureData $fixtureData)
    {
        $data = $fixtureData->getData();

        $user = new User($data['name'], $data['email']);
        foreach ($data['groups'] as $group) {
            $user->addGroup($group);
        }

        return $user;
    }

    public function getName()
    {
        return 'user';
    }
}

In your fixture files your fixtures must add/change the converter property in user.

fixtures:
    user:
        converter: user
        data: # ...

Your converter can also access the properties section.

fixtures:
    user:
        converter: user
        properties:
            foo: bar
        data: # ...
// YourBundle/FixtureConverter/BazConverter.php
namespace YourBundle\FixtureConverter;

use DavidBadura\FixturesBundle\FixtureConverter\FixtureConverter;
use DavidBadura\FixturesBundle\FixtureData;

class BazConverter extends FixtureConverter
{

    public function createObject(FixtureData $data)
    {
        $properties = $data->getProperties();
        $properties['foo'] # bar
        // ...
    }

    // ...

}

To resolve bidrectional references you can overwrite the finalizeObject method.

// YourBundle/FixtureConverter/UserConverter.php
namespace YourBundle\FixtureConverter;

use DavidBadura\FixturesBundle\FixtureConverter\FixtureConverter;
use DavidBadura\FixturesBundle\FixtureData;

class GroupConverter extends FixtureConverter
{

    public function createObject(FixtureData $fixtureData)
    {
        $data = fixtureData->getData();

        $group = new Group();

        return $group;
    }

    public function finalizeObject($object, FixtureData $data)
    {
        $data = $fixtureData->getData();
        $object->addLadder($data['ladder']);
    }

    public function getName()
    {
        return 'group';
    }
}

Data validation (config tree)

// YourBundle/FixtureConverter/UserConverter.php
namespace YourBundle\FixtureConverter;

use DavidBadura\FixturesBundle\FixtureConverter\FixtureConverter;
use DavidBadura\FixturesBundle\FixtureConverter\ConverterDataValidate;
use Symfony\Component\Config\Definition\Builder\NodeBuilder;

class UserConverter extends FixtureConverter implements ConverterDataValidate
{

    // ...

    public function addNodeSchema(NodeBuilder $node)
    {
        $node->scalarNode('name')->isRequired()->end()
             ->scalarNode('email')->end()
    }

}

Converter as a service

To register a converter as a service, you must add the davidbadura_fixtures.converter tag to your service.

<services>
    <service id="your_bundle.converter.user" class="YourBundle\FixtureConverter\UserConverter">
        <tag name="davidbadura_fixtures.converter" />
    </service>
</services>