Postagens populares

terça-feira, 14 de julho de 2015

Como pegar o Referer no Symfony 2

Prelúdio

O Symfony 2 é um ótimo framework em minha opinião, mas devido ao tamanho que tem hoje em dia, a documentação tem se mostrado ineficiente em apresentar algumas coisas. Comento abaixo uma delas: o uso do referer.

Atente para o fato de que no meu caso (e na maioria deles) acabamos por optar a utilizar uma autenticação personalizada. Se vc utiliza a autenticação "automática" acredito que vc só precisa utilizar o use_referer (mas não tenho certeza pq não utilizo desta maneira).

Logo de saída, o pensamento de qualquer um seria pegar o parâmetro referer, que, os mais antigos sabem, reside na superglobal (em teoria) $_SERVER['HTTP_REFERER'].

No caso do SF2, ao procurar na documentação vc logo fica sabendo que o SF2 alterar e "sanitiza" as superglobals, além do fato de alguns browsers não repassarem a mesma para o server. Mesmo assim vc tenta, da maneira "symfony":

$request->headers->get('referer')

Sem sucesso!

Mas #comofaz?

O SF2 tem milhares de parâmetros para configurar milhares de coisas. Uma delas é a configuração dos firewalls, os verdadeiros responsáveis por verificar o acesso a determinadas rotas.

Um dos parâmetros é o "use_referer" situado dentro de CADA firewall (vc pode ter várias) porém ao contrário do que pensaríamos (sei que eu pensei) o dado não estará situado no referer propriamente dito, mas sim em uma diretiva chamada "target_path" residente na sessão, desde que ativada a outra diretiva "use_referer", armazenará a última URL que redirecionou para o login (só leva em conta requests do tipo GET e não armazena as url's de autenticação).

Sabendo disto, utilize o seguinte método para resgatar o referer (target_path):


*Symfony 2.1 em diante

$this->container->get('session')->get('_security.nome-do-seu-firewall.target_path') ou $session->get('_security.nome-do-seu-firewall.target_path')

*Symfony 2.0 ou anterior

$this->container->get('session')->get('_security.target_path') ou $session->get('_security.target_path')
Também está na própria documentação, um passo a passo de como personalizar o método que grava o target_path caso vc tenha necessidades específicas:
http://symfony.com/doc/2.2/cookbook/security/target_path.html



Há!

Magazine Luiza