URLs Amigáveis Sem htaccess Usando Slim

URLs Amigáveis Sem .htaccess Usando Slim

Você já sofreu criando regras malucas no seu .htaccess pra conseguir criar suas URLs Amigáveis?

Conhece pouco sobre Expressões Regulares e sempre apanha das regras de reescrita?

Já imaginou criar URLs Amigáveis sem essas dores de cabeça, tudo em PHP puro, sem .htaccess, de forma clara e objetiva?

E o melhor: em poucos segundos!

Há uma maneira muito simples de fazer isso. E a solução se chama Slim.

Continue lendo, que você vai ver como criar URLs Amigáveis pode ser uma tarefa ridiculamente simples e rápida.

Hoje eu quero solucionar um GRANDE problema:

Criar URLs Amigáveis Sem .htaccess

Isso é possível, sim. E o melhor: é extremamente simples!

Vamos usar um pequeno framework, chamado Slim.

O Que é o Slim

O Slim é um micro-framework. Ou seja, um conjunto pequeno (porém poderoso) de ferramentas para desenvolver aplicações.

Ele permite fazer diversas outras coisas, não apenas criar URLs Amigáveis, também chamadas de rotas. Dentre os principais recursos do Slim estão:

  • Rotas (URLs Amigáveis)
  • Gerenciamento de Requisições HTTP
  • Gerenciamento de Sessões
  • Cache
  • Criptografia

O Slim é bem completo e faz várias coisas, porém hoje vou mostrar apenas a parte de Rotas.

Se vocês gostarem da ferramenta e comentarem aqui no post, farei outros artigos mostrando mais recursos do Slim. :)

URLs Amigáveis Usando o Slim

Que tal um desafio?

Vamos criar uma aplicação com URLs Amigáveis do zero em apenas poucos segundos?

Parece loucura? Impossível?

Não é!

Vou mostrar como é simples.

Para criarmos nosso projeto, vamos usar o Composer.

Lembrando que o Composer fica instalado na sua máquina local. Você pode instalá-lo no seu servidor, mas não precisa. Você usará o Composer em sua máquina para baixar o Slim. Depois basta fazer upload de tudo para o servidor (mesmo que o Composer não esteja instalado lá, tudo vai funcionar).

Com o Composer instalado, abra o terminal (prompt de comando, pra quem sofre usando Windows) e digite:

composer require slim/slim

O Composer vai baixar o Slim, além do seu próprio autoloader, que utilizaremos para carregar o Slim em nossa aplicação.

Agora você verá esta estrutura de arquivos

├── composer.json
├── composer.lock
└── vendor
    ├── autoload.php
    ├── composer
    └── slim

Só precisamos criar nosso arquivo index.php. Crie-o com este conteúdo:

<?php
require 'vendor/autoload.php';
 
/* =================
   Instanciando o Slim
   Escolha uma das opções abaixo. 
   A primeira não exibe os erros, ideal para ambiente de produção
   A segunda exibe erros, ideal para debug em ambiente de desenvolvimento
   ================ */
 
// Esta linha instancia o Slim, sem habilitar os erros
$app = new \Slim\App();
 
// Estas linhas instanciam o Slim, habilitando os erros (útil para debug, em desenvolvimento)
$app = new \Slim\App([
    'settings' => [
        'displayErrorDetails' => true
    ]
]);
 
 
/* ============
   Rotas da aplicação
   ============ */
 
 
$app->get('/', function ()
{
    echo "Página inicial";
});
 
$app->get('/contato', function ()
{
    echo "Fale conosco";
});
 
$app->run();

Pronto!

Agora basta iniciar o servidor do PHP:

php -S localhost:8000

Agora acesse as URLs abaixo:

  • http://localhost:8000/
  • http://localhost:8000/contato

Seu projeto com URLs Amigáveis já está funcionando!

Falei que seriam apenas alguns segundos!

Parâmetros de URL

Provavelmente você ainda não está satisfeito(a), né?

Aí você me diz:

E se eu quiser passar parâmetros dinâmicos na URL?

É tão simples quanto!

Vamos imaginar que temos um sistema de artigos e que precisamos permitir a exibição de artigos pelo seu ID. Por exemplo, para exibir o artigo de ID 7, usaremos a URL localhost:8000/artigos/7.

Nesse caso, o número 7 é a parte dinâmica da URL.

Para montar essa rota, vamos adicionar esta regra ao nosso arquivo index.php:

$app->get('/artigos/{id}', function ( $request )
{
    $id = $request->getAttribute('route')->getArgument('id');
    printf( "Exibindo artigo %d", $id );
});

Veja que a rota é artigos/{id}. As chaves entre o id diz que esse valor é um parâmetro, que será passado como parâmetro para a função que manipula essa rota.

Outros Métodos HTTP

Nos exemplos anteriores, usamos apenas o método GET para as rotas. Mas também é possível usar os outros métodos HTTP, como POST, PUT, DELETE e outros. Basta trocar o nome do método ao definir a rota:

$app->post('/enviar', function ()
{
    echo "método post";
});
 
$app->put('/alterar', function ()
{
    echo "método put";
});
 
$app->delete('/remover', function ()
{
    echo "método delete";
});

Logicamente, também é possível usar parâmetros nessas rotas.

Só Um Pouco de .htaccess

Eu falei que não usaríamos .htaccess para criar as URLs Amigáveis, certo?

E realmente não usamos.

Mas pode ser necessário criar o .htaccess para que todas as requisições seja encaminhadas para o arquivo index.php. Isso garante que suas rotas funcionem adequadamente em qualquer servidor web.

Vamos criar o .htaccess com este conteúdo:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]

Apenas dizemos para encaminhar as requisições sempre para nosso index.php.

Conclusão

Em apenas alguns segundos, usando o Slim e o Composer, conseguimos criar um sistema de rotas bem completo e fácil de manter.

Esse é só um dos inúmeros excelentes recursos do Slim. Veja algumas outras facilidades que ele possui:

  • Criação de Rotas (URLs Amigáveis). Mostrei o básico aqui, mas há diversos outros recursos mais avançados;
  • Rotas nomeadas, para facilitar a criação de links e navegação em seu sistema;
  • Grupos de rotas, permitindo diversos métodos HTTP para a mesma rota;
  • Middlewares, para garantir a Segurança e impedir acesso indevido por usuários não logados;
  • Gerenciamento de Requisições HTTP, para desenvolver clientes de Web Service com facilidade;
  • Gerenciamento de Sessões, para facilitar o desenvolvimento de sistemas de login;
  • Cache, para acelerar o carregamento de sua aplicação;
  • Criptografia, para garantir total Segurança para os dados de seus usuários;

 

Aprenda Ainda Mais

15 Dicas, Boas Práticas e Fundamentos do PHP

Conheça Dicas FUNDAMENTAIS para programar em PHP de forma Profissional

Não se considere Programador PHP sem antes ler este guia e adotar estas práticas!

Baixe gratuitamente este guia com 15 Dicas de PHP

The following two tabs change content below.
Graduado em Ciência da Computação, pela Universidade Federal do Paraná (UFPR), é desenvolvedor de software desde 2008, com foco em Desenvolvimento Web com PHP.
  • Muito interessante.
    Tipo Laravel, só que não… rsrs

    • Exato, o Laravel (e diversos outros frameworks) possuem esse tipo de sistema de rotas. É muito prático.

      Se você não quiser usar um framework inteiro só pra ter a facilidade das rotas, o Slim cai como uma luva

  • Paulo Sergio

    Se entendi bem, todas as urls vão apontar para index e só vai mudar o texto da página? E se eu quiser que redirecione para outra página que não seja a index?

    • O processamento é todo feito na index.php, mas nela você faz o que quiser. Pode redirecionar, chamar funções, instanciar classes etc.

      Por exemplo:

      $app->get(‘/contato’, function ()
      {
      showContactForm();
      });

      Dentro da função showContactForm() você processa a exibição do formulário.

      Ou seja, dentro das funções que manipulam cada rota é possível executar qualquer rotina.

  • Bruno

    Bem interessante pra quem está começando agora e não quer ter trabalho desenvolvendo um pequeno algoritmo para isso.

    Quando criei meu primeiro projeto em .htacces desenvolvi um pequeno bloco de código que não levou mais de um dia pra ser criado e já faz isso que o slim faz e tudo que eu uso no .htaccess é o redirecionamento de tudo para index. Nunca precisei criar inúmeras regras no .htaccess para tanto.

  • Carlos

    Estou desenvolvendo o meu tcc, e vou precisar usar um web service em php, estou procurando bastante coisas,
    Sei que a pergunta, parecer ser simples, mas desculpe(sou iniciante)
    é possível desenvolver um web service(do lado server, ele é baseado em REST) usando o slim?
    Como consumir depois?
    estou estudando e procurando, achei tutorial de como aprender slim, mas esta em francês, inglês e espanhol.
    Se tiver tem como me mandar um modelinho de web service ou me indicar um tutorial ?

    • Rai Siqueira

      Sim,é possível fazer isso com o Slim Framework.

  • Perfeito artigo…!

  • Por que não usar o Silex em vez do Slim?

    Da pra criar vários tipos de aplicações, e também facilita a criação de APIs.

    • Olá, Bruno

      Você pode usar o Silex também. ele é um micro-framework também, assim como o Slim. Ambos fazem praticamente as mesmas coisas.

      Abraço
      Beraldo

  • Leo Barreto

    Parabéns, mais um ótimo post. Já tinha lido outro sobre sitema de login com o Slim. Foi quando o conheci. Que tal pensar em um mini-curso sobre o Slim, ou mais dicas e funcionalidades?

  • Geovane Krüger

    Legal esse Framework
    Eu precisei utilizar o .htaccess da seguinte forma
    RewriteRule ^(.*)$ index.php [QSA,L]

    • O Slim é muito útil, mesmo!
      Essa regra do .htaccess é praticamente a mesma que mostrei no artigo. A diferença principal é que verifico se a URL é um arquivo existente; a sua regra redireciona sempre para index.php, impedindo qualquer acesso direto a arquivos. É possível que você tenha problemas ao acessar arquivos CSS, JS ou imagens se usar URL completa

      • Geovane Krüger

        Então, eu havia colocado da maneira que vc exemplificou acima o .htaccess, mas aí da página não encontrada.
        Desta forma funcionou.
        Enfim, estou começando um projeto novo e estou tentando me atualizar através dos seus post e dicas.
        Se apresentar os problemas que você mencionou tentarei da outra maneira.

        Antes eu utiliza URL amigável através de um código php direto e um pequena alteração no .htaccess e pra corrigir problemas tinha que usar um <base href="http:///” /> no início do arquivo index.php e mais algumas eventuais gambiarras (o que quero eliminar)

  • Vinícius Dias

    Você poderia escrever um post mostrando como estruturar os arquivos e códigos para a criação de um framework REST com o Slim.
    :-D

    Me ajudaria demais!

  • Lucas Corrêa Braz

    Beraldo, teria como eu acessar a rota passando o id no parâmetro (localhost:8000/artigos/7) mas ao invés do 7 mostrar o título do artigo? Ex. localhost:8000/artigos/rota-amigavel-sem-htaccess

    • Olá. Sim, é possível usar uma “slug” em vez do ID. Salve essa slug no banco de dados e use esse valor para buscar o artigo no banco.

      • Lucas Corrêa Braz

        Entendi, pensei que tivesse uma forma mais elegante, a busca pelo id é muito mais performática que por string. Sera que nao teria como buscar pelo id e só exibir a slug? Ai fica profissa

        • Não, pois não existe como identificar o ID a partir da slug sem consultar o banco.
          O que dá pra fazer é usar um hash do ID, como o Youtube faz, por exemplo. Você pode usar a biblioteca Hashids: http://hashids.org/php/

          Mas nesse caso, perderia a slug na URL, o que pode prejudicar SEO, caso seja importante para o seu site.

          • Lucas Corrêa Braz

            Legal Roberto, tive uma ideia, passar o hash id – slug. Assim faço a busca pelo id e a URL ficaria SEO friendly, q acha?
            Muito obrigado pelas dicas.

            • Sim, é uma alternativa também. Já vi alguns sites fazerem isso, inclusive Stack Overflow, se não me engano, e alguns fóruns

              • Lucas Corrêa Braz

                Perfeito! Novamente muito obrigado.

  • Edmilson

    Beraldo parabéns pelo conteúdo, você conhece alguma forma de trabalhar com navegação de conteúdo onde somente o nome do domínio ficaria exposto ou estático, por exemplo o Facebook trabalha em certas ocasiões somente em cima do (https://www.facebook.com/)

    • Olá. Obrigado!
      Olha, manter a URL estática não é algo muito bom, por questões de usabilidade. Em um painel privado, até vai. Mas para uma página pública, não é muito bom. Se mantiver a mesma URL, ninguém pode mandar o link para um amigo ou compartilhar em rede social.
      Eu conheço duas formas de fazer isso: 1: frames/iFrames; 2) Ajax

      • Edmilson

        Estou desenvolvendo um sistema de marcação de consulta onde o usuário necessita ter uma conta e permanecer logado para realiza-lo e gostaria que nesta ocasião a url fosse estática, pode me passar onde possa dar uma estudada sobre este conteúdo? obrigado pela atenção…

        • Veja se realmente precisa disso. Não vejo necessidade.
          Mas se realmente quiser, considere usar Ajax. Estude jQuery ou AngularJS