PD
Rotas amigáveis no Adianti Framework 5.5
Fechado
Ao criarmos uma aplicação com o Framework, percebemos que a URL nativa contém a informação da classe e do método que será executado, no seguinte formato:
Como o Framework é utilizado na grande maioria das vezes para criar sistemas corporativos internos, a URL não é tão relevante quanto seria em um web site público ou e-commerce. Mas mesmo em contextos privados e corporativos, é interessante usarmos URL’s em um formato amigável para facilitar o compartilhamento de links entre colaboradores. Além disso, o Framework é cada vez mais usado para produzir diferentes tipos de aplicações, como e-commerce, portais corporativos, etc. Dessa forma, vamos verificar como transformar uma URL completa em uma URL resumida:
Uma aplicação com rotas pré-configuradas é disponibilizada para download junto aos arquivos do Framework. Ela se chama Contacts API (www.adianti.com.br/framework-contacts), e além de rotas amigáveis possui outros recursos como serviços REST e RESTFul. A aplicação Contacts API já possui rotas pré-definidas para todas as ações previstas no Template, tais como: gerenciamento de programas, grupos de usuários, unidades, preferências, documentos, dentre outros. Caso tenha dúvidas, faça download da Contacts API para verificar uma aplicação já em funcionamento com o recurso de rotas amigáveis.
Para a abordagem a seguir funcionar, utilizaremos o servidor de páginas Apache. Antes, é preciso configurar o apache para habilitar a sobrescrita de configuração (AllowOverride), o que geralmente é feito no apache2.conf.
apache2.conf
O primeiro passo é configurar as rotas no servidor de páginas (Apache, Nginx). Neste exemplo, vamos utilizar o Apache. O primeiro passo é criar um arquivo no diretório raiz da aplicação (.htaccess) com as rotas e os seus respectivos direcionamentos. Neste exemplo, estamos criando rotas para o formulário de edição (contact-edit), para listagem (contact-list), e exclusão de registros (contact-ondelete, contact-delete), todas apontando para o index.php. Caso o usuário digite na URL estes caminhos, o servidor de páginas redirecionará para o index.php com os respectivos parâmetros. Além das rotas para o index.php, o Framework precisa das rotas para o engine.php. Estas rotas iniciam com xhr- e são usadas internamente para a navegação no sistema, sem necessidade de recarregamento de toda a página. A navegação interna (post, edição, paginação, ordenação) utiliza as rotas xhr- para maior performance.
.htaccess
Obs: O Template já acompanha um arquivo htaccess-dist, com rotas padrão. Renomeie-o para .htaccess e adicione as suas rotas, conforme sugerido.
Até este ponto, configuramos as rotas de entrada na aplicação, o que significa que se o usuário entrar na URL com a rota curta, o sistema já direcionará para o caminho correto. Entretanto, os links gerados internamente pelo Framework devem ser traduzidos para o formato curto também. Links são gerados em diversas situações como em postagens de formulários, ordenação, paginação de datagrids, edição de datagrids, dentre outros. Nestes casos, o Framework precisa entender que é necessário gerar a rota encurtada no lugar da rota nativa. Para que isso seja possível, é necessário alterar os arquivos index.php e engine.php para habilitar um tradutor de rotas. O tradutor indicará ao Framework traduzir as rotas extensas em rotas curtas.
index.php
engine.php
A classe AdiantiRouteTranslator é responsável por traduzir as rotas geradas pelo Framework para o formato curto. Ela pode funcionar no modo manual ou automático. No modo manual (procure por “manual entries” no arquivo a seguir), você deve criar um vetor com o mapeamento da URL a ser traduzida e sua versão amigável. Já no modo automático, basta executar o método parseHtAccess() para realizar a leitura do arquivo .htaccess e gerar o mapeamento automaticamente. Assim, se você seguir as instruções e usar Apache com .htaccess, não será necessário alterar este arquivo.
app/lib/util/AdiantiRouteTranslator.php
Agora, você já pode navegar na aplicação pelas rotas cadastradas e verá o funcionamento, como no caso a seguir:
Caso durante a navegação ocorram erros como “Connection Failed”, é provável que a rota está cadastrada da maneira errada no .htaccess, ou o Apache não está com o AllowOverride habilitado corretamente.
http://www.aplicacao.local/index.php?class=ContactForm&method=onEdit&key=1
Como o Framework é utilizado na grande maioria das vezes para criar sistemas corporativos internos, a URL não é tão relevante quanto seria em um web site público ou e-commerce. Mas mesmo em contextos privados e corporativos, é interessante usarmos URL’s em um formato amigável para facilitar o compartilhamento de links entre colaboradores. Além disso, o Framework é cada vez mais usado para produzir diferentes tipos de aplicações, como e-commerce, portais corporativos, etc. Dessa forma, vamos verificar como transformar uma URL completa em uma URL resumida:
http://www.aplicacao.local/contact-edit?key=1
Aplicação de exemplo
Uma aplicação com rotas pré-configuradas é disponibilizada para download junto aos arquivos do Framework. Ela se chama Contacts API (www.adianti.com.br/framework-contacts), e além de rotas amigáveis possui outros recursos como serviços REST e RESTFul. A aplicação Contacts API já possui rotas pré-definidas para todas as ações previstas no Template, tais como: gerenciamento de programas, grupos de usuários, unidades, preferências, documentos, dentre outros. Caso tenha dúvidas, faça download da Contacts API para verificar uma aplicação já em funcionamento com o recurso de rotas amigáveis.
Pré requisitos
Para a abordagem a seguir funcionar, utilizaremos o servidor de páginas Apache. Antes, é preciso configurar o apache para habilitar a sobrescrita de configuração (AllowOverride), o que geralmente é feito no apache2.conf.
apache2.conf
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
</Directory>
Configurando as rotas de entrada
O primeiro passo é configurar as rotas no servidor de páginas (Apache, Nginx). Neste exemplo, vamos utilizar o Apache. O primeiro passo é criar um arquivo no diretório raiz da aplicação (.htaccess) com as rotas e os seus respectivos direcionamentos. Neste exemplo, estamos criando rotas para o formulário de edição (contact-edit), para listagem (contact-list), e exclusão de registros (contact-ondelete, contact-delete), todas apontando para o index.php. Caso o usuário digite na URL estes caminhos, o servidor de páginas redirecionará para o index.php com os respectivos parâmetros. Além das rotas para o index.php, o Framework precisa das rotas para o engine.php. Estas rotas iniciam com xhr- e são usadas internamente para a navegação no sistema, sem necessidade de recarregamento de toda a página. A navegação interna (post, edição, paginação, ordenação) utiliza as rotas xhr- para maior performance.
.htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
#Application specific routes
RewriteRule ^contact-edit$ index.php?class=ContactForm&method=onEdit&%{QUERY_STRING} [NC]
RewriteRule ^contact-list$ index.php?class=ContactList&method=onReload&%{QUERY_STRING} [NC]
RewriteRule ^contact-ondelete$ index.php?class=ContactList&method=onDelete&%{QUERY_STRING} [NC]
RewriteRule ^contact-delete$ index.php?class=ContactList&method=Delete&%{QUERY_STRING} [NC]
RewriteRule ^xhr-contact-edit$ engine.php?class=ContactForm&method=onEdit&%{QUERY_STRING} [NC]
RewriteRule ^xhr-contact-list$ engine.php?class=ContactList&method=onReload&%{QUERY_STRING} [NC]
RewriteRule ^xhr-contact-ondelete$ engine.php?class=ContactList&method=onDelete&%{QUERY_STRING} [NC]
RewriteRule ^xhr-contact-delete$ engine.php?class=ContactList&method=Delete&%{QUERY_STRING} [NC]
Obs: O Template já acompanha um arquivo htaccess-dist, com rotas padrão. Renomeie-o para .htaccess e adicione as suas rotas, conforme sugerido.
Traduzindo as rotas geradas pelo Framework
Até este ponto, configuramos as rotas de entrada na aplicação, o que significa que se o usuário entrar na URL com a rota curta, o sistema já direcionará para o caminho correto. Entretanto, os links gerados internamente pelo Framework devem ser traduzidos para o formato curto também. Links são gerados em diversas situações como em postagens de formulários, ordenação, paginação de datagrids, edição de datagrids, dentre outros. Nestes casos, o Framework precisa entender que é necessário gerar a rota encurtada no lugar da rota nativa. Para que isso seja possível, é necessário alterar os arquivos index.php e engine.php para habilitar um tradutor de rotas. O tradutor indicará ao Framework traduzir as rotas extensas em rotas curtas.
index.php
- <?php
- AdiantiCoreApplication::setRouter(array('AdiantiRouteTranslator', 'translate'));
- ?>
engine.php
- <?php
- AdiantiCoreApplication::setRouter(array('AdiantiRouteTranslator', 'translate'));
- ?>
A classe AdiantiRouteTranslator é responsável por traduzir as rotas geradas pelo Framework para o formato curto. Ela pode funcionar no modo manual ou automático. No modo manual (procure por “manual entries” no arquivo a seguir), você deve criar um vetor com o mapeamento da URL a ser traduzida e sua versão amigável. Já no modo automático, basta executar o método parseHtAccess() para realizar a leitura do arquivo .htaccess e gerar o mapeamento automaticamente. Assim, se você seguir as instruções e usar Apache com .htaccess, não será necessário alterar este arquivo.
app/lib/util/AdiantiRouteTranslator.php
- <?php
- class AdiantiRouteTranslator
- {
- public static function translate($url, $format = TRUE)
- {
- /** manual entries
- $routes = array();
- $routes['class=TipoProdutoList'] = 'tipo-produto-list';
- $routes['class=TipoProdutoList&method=onReload'] = 'tipo-produto-list';
- $routes['class=TipoProdutoForm&method=onEdit'] = 'tipo-produto-edit';
- $routes['class=TipoProdutoForm&method=onDelete'] = 'tipo-produto-ondelete';
- $routes['class=TipoProdutoForm&method=delete'] = 'tipo-produto-delete';
- */
- // automatic parse .htaccess
- $routes = self::parseHtAccess();
- // ...
- }
- }
- ?>
Testando
Agora, você já pode navegar na aplicação pelas rotas cadastradas e verá o funcionamento, como no caso a seguir:
http://www.aplicacao.local/contact-edit?key=1
Possíveis erros
Caso durante a navegação ocorram erros como “Connection Failed”, é provável que a rota está cadastrada da maneira errada no .htaccess, ou o Apache não está com o AllowOverride habilitado corretamente.