tecbot / AMFBundle

AMF for Symfony2
21 stars 11 forks source link

Annotation Example #4

Open leonardorcortes opened 12 years ago

leonardorcortes commented 12 years ago

Can you post example using annotation to map VO? Can I use annotation to map services too?

tecbot commented 12 years ago

Hey.

the first thing you need is my fork of the JMSSerializerBundle, you found this here: https://github.com/tecbot/JMSSerializerBundle

then define class mappings in the config:

tecbot_amf:
  use_serialization: true # activate this for vo serialization

  mappings:
    FooVO: My\Bundle\Foo

and the last step. Define the serialization mapping for the JMSSerializerBundle:

<?xml version="1.0" encoding="UTF-8" ?>
<serializer>
    <class name="My\Bundle\Foo" vo-class="FooVO" />
</serializer>

for the serialization stuff you can found more here: https://github.com/schmittjoh/JMSSerializerBundle

Regards, Thomas

leonardorcortes commented 12 years ago

Serializer does not work with getter and setter:

config.yml

tecbot_amf:
    use_serialization: true

    services:
        ExampleAmfService: MyExampleBundle:ExampleAmf

    mappings:
        Example: My\ExampleBundle\Entity\Example

My\ExampleBundle\Resources\config\serializer\Example.xml

<serializer>
    <class name="My\ExampleBundle\Entity\Example" vo-class="Example" access-type="public_method" />
</serializer>

My\ExampleBunde\Entity\Example

<?php
namespace My\ExampleBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Example
 *
 * @ORM\Table(name="example")
 * @ORM\Entity
 */
class Example
{

    /**
     * @var bigint $id
     *
     * @ORM\Column(name="id", type="bigint", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="SEQUENCE")
     * @ORM\SequenceGenerator(sequenceName="seq_example", allocationSize=1, initialValue=1)
     */
    private $id;

    /**
     * @var string $name
     *
     * @ORM\Column(name="name", type="string", length=100, nullable=false, unique=true)
     */
    private $name;

    public function getId()
    {
        return $this->id;
    }

    public function setId($id)
    {
        $this->id = $id;
    }

    public function getName()
    {
        return $this->name;
    }

    public function setName($name)
    {
        $this->name = $name;
    }

}

My\ExampleBundle\Amf\ExampleAmfService.php

namespace My\ExampleBundle\Amf;

use Symfony\Component\DependencyInjection\ContainerAware;

class ExampleAmfService extends ContainerAware
{

    public function getByIdAction($id)
    {
        $entity = $this->container->get('my.example_bundle.example_service')->getById($id);
        return $entity;
    }

}

My\ExampleBundle\Service\ExampleService.php

namespace My\ExampleBundle\Service;

class ExampleService
{

    private $entityManager;

    public function getEntityManager()
    {
        return $this->entityManager;
    }

    public function setEntityManager($entityManager)
    {
        $this->entityManager = $entityManager;
    }

    public function getById($id)
    {
        return $this->getEntityManager()->getRepository('My\ExampleBundle\Entity\Example')->find($id);
    }

}

My\ExampleBundle\Resources\config\services.xml

<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">

    <services>

        <service id="my.example_bundle.example_service" class="My\ExampleBundle\Service\ExampleService">
            <call method="setEntityManager">
                 <argument type="service" id="doctrine.orm.entity_manager" />
            </call>
        </service>

    </services>

</container>

Flex get object serialized correctly, but with null values using getter. Modifying entity atributes to public works.

What can I do to use getter/setter?

tecbot commented 12 years ago

You need to serialize the entity before you return.

namespace My\ExampleBundle\Amf;

use Symfony\Component\DependencyInjection\ContainerAware;

class ExampleAmfService extends ContainerAware
{
    public function getByIdAction($id)
    {
        $entity = $this->container->get('my.example_bundle.example_service')->getById($id);

        return $this->container->get('serializer')->serialize($entity, 'vo');
    }
}
leonardorcortes commented 12 years ago

Ok, at this point, PHP and FLEX can understand types, but related entitites not.

For example, City -> State:

PHP: all properties from city entity are populated. FLEX: related properties (i.e: state) are null.

What can I do to solve this?