Tableless

Busca Menu

Iniciando com Symfony 2 – Parte 09

Seja o primeiro a comentar por

No tutorial anterior, instalamos e configuramos o bundle Knp Paginator, para fazer a paginação de posts em nosso index, agora vamos instalar e configurar o Bundle StofDoctrineExtensionsBundle, para fazermos os slugs de nossos posts

Instalação do bundle StofDoctrineExtensionsBundle

Para instalar o StofDoctrineExtensionsBundle, temos que adicioná-lo em nosso composer.json. Abra o arquivo composer.json e adicione a linha abaixo:

"stof/doctrine-extensions-bundle": "1.2.*@dev"

Depois de adicionando o StofDoctrineExtensionsBundle no composer, vamos instalá- lo. Entre no terminal e digite:

$ composer update

Após o Download, o StofDoctrineExtensionsBundle está instalado em nossa aplicação.

Configurando o StofDoctrineExtensionsBundle

A primeira configuração que devemos fazer, é registrar o novo bundle instalado, para isso entre no AppKernel, caminho: app/AppKernel.php

Adicione a linha abaixo no registro de bundles:

new Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle(),

Veja na linha 17:

class AppKernel extends Kernel 
{ 
    public function registerBundles() 
    { 
        $bundles = array( 
            new Symfony\Bundle\FrameworkBundle\FrameworkBundle(), 
            new Symfony\Bundle\SecurityBundle\SecurityBundle(), 
            new Symfony\Bundle\TwigBundle\TwigBundle(), 
            new Symfony\Bundle\MonologBundle\MonologBundle(), 
            new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(), 
            new Symfony\Bundle\AsseticBundle\AsseticBundle(), 
            new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(), 
            new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(), 
            new Tableless\CoreBundle\TablelessCoreBundle(), 
            new Tableless\ModelBundle\TablelessModelBundle(), 
	    new Knp\Bundle\PaginatorBundle\KnpPaginatorBundle(),
	    new Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle(),
        );

...

Pronto, o StofDoctrineExtensionsBundle está registrado.
Agora vamos fazer as configurações no arquivo config.yml, caminho: app/config/config.yml

No final do arquivo adicione as configurações abaixo:

stof_doctrine_extensions:
    orm:
        default:
            sluggable: true

Configurando a entidade Post

Temos que configurar nossa entidade post, para que a mesma receba os slugs. Entre na entidade post, caminho: src/Tableless/ModelBundle/Entity/Post.php

Vamos dar um use em Annotation, e apelidá-la de Gedmo veja abaixo:

use Gedmo\Mapping\Annotation as Gedmo;

Agora vamos criar uma propriedade privada chamada slug, com as suas annotations correspondentes, veja:

    /**
     * @var string
     *
     * @Gedmo\Slug(fields={"title"}, unique=false)
     * @ORM\Column(length=255)
     */
     private $slug;

...

Temos que gerar os getters e setters, para isso vamos entrar no terminal e digitar:

$ php app/console generate:doctrine:entities TablelessModelBundle:Post

Pronto, em nossa entidade Post, temos os getters e setters, veja:

    /**
     * Set slug
     *
     * @param string $slug
     *
     * @return Post
     */
    public function setSlug($slug)
    {
        $this->slug = $slug;

        return $this;
    }

    /**
     * Get slug
     *
     * @return string
     */
    public function getSlug()
    {
        return $this->slug;
    }

...

Configurando o Banco de Dados

Depois de nossa entidade configurada, temos que atualizar o banco de dados, porém se tivermos posts já criados, ocorrerá um erro em nosso blog. Caso não tenha nenhum post escrito poderá rodar o comando abaixo:

$ php app/console doctrine:schema:update –force

Caso tenha escrito algum post para exemplo, como no meu caso, vamos excluir o banco de dados, e criá lo novamente. Entre no terminal e digite:

Excluindo o banco de dados:

$ php app/console doctrine:database:drop --force

Criando o banco de dados novamente:

$ php app/console doctrine:database:create

Criando as tabelas:

$ php app/console doctrine:schema:create

Obs: Caso tenha posts escritos, e não queria excluir o banco de dados, poderá apenas atualizá-lo, porém terá que adicionar manualmente, slug por slug em cada post no banco de dados, senão ocorrerá erro na aplicação.

Veja a estrutura do banco de dados:

Banco de dados

Configurando o Controller

Depois de termos feito as configurações citadas acima, vamos configurar nosso controller, para isso entre no IndexControlerController, caminho: src/Tableless/CoreBundle/Controller/IndexControlerController.php

No nosso método showAction, estamos passando por parâmetro o $id, no momento não queremos mais buscar nossos posts pelo id, e sim pelo slug, vamos alterar:

de:

public function showAction($id)

para:

public function showAction($slug)

Temos que mudar também a annotation da rota, veja:

de:

* @Route("/show/{id}", name="show")

para:

* @Route("/show/{slug}", name="show")

Estamos passando para a variável $post, o método find, e recuperando o id, vamos mudar o find para findOneBy e passar um array de slug, veja:

...

$post = $em->getRepository('TablelessModelBundle:Post')->findOneBy([
            'slug' => $slug
        ]);

...

Veja o método showAction pronto:

    ...

    /**
     * @Route("/post/{slug}", name="show")
     * @Template()
     */
    public function showAction($slug)
    {
        $em = $this->getDoctrine()->getManager();

        $post = $em->getRepository('TablelessModelBundle:Post')->findOneBy([
            'slug' => $slug
        ]);

        if (!$post) {
            throw $this->createNotFoundException('O post não existe! Volte para home!');
        }

        return [
            'post' => $post,
        ];
    }
 
    ...

Configurando o index

Em nossa index, estamos passando os links para que os posts sejam buscados pelo id, porém temos que alterá- los para que possamos buscar os posts pelo slug.
Entre no index.html.twig, caminho: src/Tableless/CoreBundle/Resources/views/IndexController/Index.html.twig

Vamos alterar os links:
No meu caso a linha 21, 29 e 35:

de:

<a href="{{ path('show', { 'id': post.id }) }}">

para:

<a href="{{ path('show', { slug: post.slug }) }}">

Testando nossa aplicação:

Caso tenham seguido o tutorial e excluído o bando de dados, que foi criado novamente, como no meu caso. Antes de criarmos um post, temos que criar os autores novamente, depois sim criarmos os posts. No meu caso vou criar apena um post para exemplo.
Depois do post criado, click no link e observe a url, verá o slug, que em nosso caso é o slug do titulo, veja:

Urls

Conclusão

Pronto, nosso simples projeto está retornando o slug dos post em nossa url.

Links dos tutoriais anteriores:
Iniciando com Symfony 2 – Instalação
Iniciando com Symfony 2 – parte 02
Iniciando com Symfony 2 – parte 03
Iniciando com Symfony 2 – parte 04
Iniciando com Symfony 2 – parte 05
Iniciando com Symfony 2 – parte 06
Iniciando com Symfony 2 – parte 07
Iniciando com Symfony 2 – parte 08

O projeto encontra-se no GitHub!

Publicado no dia