Back-End

3 out, 2013

Silex + Respect\Relational – uma boa dupla

Publicidade

Fala, galera, beleza?

Neste artigo, vamos falar um pouco a respeito de dois importantes projetos para a comunidade PHP, um deles é o micro-framework Silex, criado pelo francês Fabien Potencier junto com Igor Wiedler, e o outro é o Respect\Relational, um ORM criado pelo Alexandre Gaigalas, o famoso @alganet.

O Silex é um micro-framework que, como o próprio site diz, foi construido sobre os ombros do Symfony2 e do Pimple, conciso, extensível e testável como toda aplicação deve ser.

O Respect\Relational é um excelente ORM fácil de usar/configurar, com features bem interessantes e uma incrível interface. Ele faz com que escrever consultas ao banco de dados seja muito mais compreensível para nós, humanos.

Quais são as vantagens de usar um micro-framework? Bom, na minha opinião os micro-frameworks são mais flexíveis que frameworks, a responsabilidade de uma boa organização/arquitetura da aplicação depende muitos mais do desenvolvedor do que necessariamente do micro-framework.

Aí você me pergunta: tá, mas e as desvantagens? E aí eu te respondo: cara, use pra saber, mas no geral ele não tem toda aquela “ajuda” que os frameworks te dão e também não é indicado para aplicações muito grandes, apesar de isso não ser de fato uma restrição.

Bom, tudo que eu falei são opiniões e, é claro, as suas podem ser diferentes, então fique à vontade para comentar.

Depois de tudo isso vamos para a parte de código do artigo. O Silex trabalha com Providers, e eu criei o RespectRelationalServiceProvider, para usar o Mapper do Respect\Relational.

Registrar um provider é bem tranquilo, é só fazer como no código abaixo:

<?php
    use Silex\Application;
    use Carminato\Silex\Provider\Respect\RespectRelationalServiceProvider;

    $app = new Application;

    $app->register(new RespectRelationalServiceProvider(), array(
            'respect.pdo.instances' => array(new \PDO('sqlite::memory:'))
        )
    );

 

Depois de feito isso, você pode pegar o Mapper default (sempre o primeiro definido) em qualquer lugar da aplicação em que você tenha a sua “$app” desta forma:

<?php
    $mapper = $app['respect.mapper'];

A partir daí, você pode utilizar todas as features do Mapper do Respect\Relational que estão no Github do projeto da maneira que quiser.

Olha como ficaria uma rota que recebe dados de um formulário para criar um autor, por exemplo:

public function autorCreate(Request $request)
    {
        $form = $this->app['form.factory']
            ->createBuilder(new AutorForm(),array())
            ->getForm()
        ;

        if ('POST' == $request->getMethod()) {
            $form->bind($request);

            if ($form->isValid()) {
                $mapper = $this->app['respect.mapper'];
                $data = $form->getData();

                $autor = new stdClass;
                $autor->name = $data['autor'];
                $autor->created_at = date('Y-m-d H:i:s');

                $mapper->autor->persist($autor);
                $mapper->flush();

                return $this->app->redirect('/admin/autor');
            }
        }

        return $this->app['twig']->render('Autor/admin/add.html.twig', array(
                'form' => $form->createView()
            )
        );
    }

 

No exemplo acima eu estou utilizando, além do provider do Respect\Relational, o de Form e o do Twig.

Ah e quer saber como ficaria a atualização desse autor? Deste jeito aqui:

public function autorUpdate($id, Request $request)
    {
        $mapper = $this->app['respect.mapper'];

        $autor = $mapper->autor[$id]->fetch();

        if (! $autor) {
            $this->app->abort(404, "Autor $id não existe.");
        }

        $form = $this->app['form.factory']
            ->createBuilder(new AutorForm(), array())
            ->getForm()
        ;

        if ('POST' == $request->getMethod()) {
            $form->bind($request);

            if ($form->isValid()) {
                $data = $form->getData();

                $autor->name = $data['autor'];

                $mapper->autor->persist($autor);
                $mapper->flush();

                return $this->app->redirect('/admin/autor');
            }
        }

        return $this->app['twig']->render('Autor/admin/edit.html.twig', array(
                'form' => $form->createView(),
                'autor' => $autor
            )
        );
    }

Bem legal, né?

Bom, galera, era isso. Se você se interessou por algum desses dois, você pode visitar o site do Silex e o Github do Respect\Relational para aprender mais.

Valeu e keep learning!