Router para Host ou Slug

50 views
Skip to first unread message

Marcelo Rodrigues

unread,
Oct 25, 2012, 11:32:46 AM10/25/12
to symfo...@googlegroups.com
Caros, 

Estou numa situação um pouco parecida com a velha questão que já tem várias discussões em listas relacionadas ao Symfony: roteamento baseado no nome do host. 

Explicando melhor. Teremos um site central onde será possível ter diversas instâncias (como blogs), como se fossem pequenos sites, independentes no gerenciamento das informações, o qual podem ser acessados pelo "slug" ou pelo seu "domínio" próprio, se assim tiver sido cadastrado e configurado na base de dados. Exemplificando:

Suponha que eu tenha 2 blogs: blog A e blog B. Ambos são acessados assim:

* Blog B -> www.blogB.com.br

Supondo que quero ver a lista de categorias de posts em ambos, então terei:


O que ocorre é que ambos são mapeados no mesmo servidor, e consequentemente, são mapeados pela mesma aplicação do Symfony, já que a base de dados do ambos será a mesma. O problema é que como configurar a rota corretamente. No caso do Blog B, quando acessar "categorias", ele interpretará como um "slug" e não como a rota para "/categorias". Ou seja, no Blog B, o domínio já é o próprio "slug", por assim dizer, e por isso devo eliminá-lo da rota e possibilitar que os controllers sejam acessados sem a necessidade do slug. 

Minha configuração atual está assim:

BlogBundle:
    resource: "@MeuBlogBundle/Controller/"
    type:     annotation
    prefix:   /{slug}

Porém, eu preciso que seja algo como isso:

BlogBundle:
    resource: "@MeuBlogBundle/Controller/"
    type:     annotation
    prefix:   /{slug}

BlogBundleHosted:
    resource: "@MeuBlogBundle/Controller/" <--- Mesmo bundle
    type:     annotation
    prefix:   / <---- Acesso apenas pela raíz. 

Em tempo. Tenho uma listener que, no domínio padrão, verifica pelo slug, busca na base qual o domínio e faz o redirecionamento adequado. Porém, ao chegar no domínio, ele sempre cai na rota com "slug". Já tentei usar requirements ou algo do tipo para condicionar esse acesso, mas sem sucesso. 

Alguém tem uma idéia de como resolver isso?

Desculpem pelo post longo, mas esse problema já está me consumindo tem um tempinho.

Valeu, 

Marcelo


ciro vargas

unread,
Oct 25, 2012, 12:16:35 PM10/25/12
to symfo...@googlegroups.com

Marcelo, tem muita gente com esse problema inclusive eu estou esperando o 2.2 pra começar um projeto próprio, tem um pr no git hub

uma solução tosquera que testei é fazer um if no route.php, mas teria que fazer um cache pra cada domínio

o sonata tem uma solução multi-site que não sei como é feito, poderia tirar umas idéias de lá
 
 
 
___
Att. Ciro vargas
Desenvolvedor Web/Mobile
Skype: ciro.vargas
Tel.: +55 61 8512 2992


De: Marcelo Rodrigues <marcelo....@gmail.com>
Para: symfo...@googlegroups.com
Enviadas: Quinta-feira, 25 de Outubro de 2012 13:32
Assunto: [symfony-pt] Router para Host ou Slug

--
Você está recebendo esta mensagem porque se inscreveu no grupo "Symfony Brasil" dos Grupos do Google.
Para postar neste grupo, envie um e-mail para symfo...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para symfony-pt+...@googlegroups.com.
Para obter mais opções, visite esse grupo em http://groups.google.com/group/symfony-pt?hl=pt-BR.


Marcelo Rodrigues

unread,
Oct 25, 2012, 1:21:21 PM10/25/12
to symfo...@googlegroups.com
Pois é Ciro, 

Vi essa thread também, inclusive sua solução. No meu caso, não daria pra resolver diretamente no arquivo de configuração, porque a configuração do domínio para cada entrada, no caso, o blog, vai ser dinâmico, podendo ser revertido para o padrão do slug. Mas nada que não possa ser resolvido diretamente pelo onKernelRequest também, antes de o routing.loader ser executado. Mas de qualquer maneira, a solução que está sendo proposta no 2.2 pode resolver essa situação. Vamos ver. 

Marcelo

ciro vargas

unread,
Oct 25, 2012, 1:39:15 PM10/25/12
to symfo...@googlegroups.com

Existe essa opção no momento, você faz um serviço executado no kernel e ele faz o parse do dominio

mas pra mim não atende
 
 
 
___
Att. Ciro vargas
Desenvolvedor Web/Mobile
Skype: ciro.vargas
Tel.: +55 61 8512 2992


De: Marcelo Rodrigues <marcelo....@gmail.com>
Para: symfo...@googlegroups.com
Enviadas: Quinta-feira, 25 de Outubro de 2012 15:21
Assunto: Re: [symfony-pt] Router para Host ou Slug

Marcelo Rodrigues

unread,
Oct 25, 2012, 2:45:08 PM10/25/12
to symfo...@googlegroups.com
Que opção é essa? De repente atende ao que eu quero. Eu não encontrei qualquer referencia a isso a não ser naquela thread de issue do Github, mas era apenas experimental pelo que visto. 

Marcelo

ciro vargas

unread,
Oct 25, 2012, 2:48:13 PM10/25/12
to symfo...@googlegroups.com

eu tentei uma vez mas nem lembro como era, tenho no pc de casa feito
 
 voce monta um serviço no kernel listener usando o event do kernel request ai você recepta essa informação e seta na sessão o dominio que ta requisitado
 
___
Att. Ciro vargas
Desenvolvedor Web/Mobile
Skype: ciro.vargas
Tel.: +55 61 8512 2992


De: Marcelo Rodrigues <marcelo....@gmail.com>
Para: symfo...@googlegroups.com
Enviadas: Quinta-feira, 25 de Outubro de 2012 16:45

Marcelo Rodrigues

unread,
Oct 25, 2012, 2:56:18 PM10/25/12
to symfo...@googlegroups.com
Sim, mas isso é o que eu já estou fazendo. Inclusive seto o listener para ser executado antes do Router determinar qual é controller com a rota equivalente. 

Mas essa do domínio na sessão, não funcionaria, uma vez que se o cara entrar por outro domínio, é outra sessão, é outro cookie. Acho que não deixei bem claro essa parte. No meu caso, não vai ser um tratamento baseado em "subdomínio" e sim em domínios totalmente distintos. Ex:


Capicce? Meu problema mesmo é só fazer a correção no "slug" para que ele não seja utilizado no host relacionado ao "blog", por exemplo. Redirecionar a partir do host padrão, determinando o domínio associado ao slug é tranquilo. O problema é quando chega no domínio de destino e fazer as actions que, no host padrão eram acessadas com /slug/controller-action e no destino será apenas /controller-action. Sacou?

Marcelo 

ciro vargas

unread,
Oct 25, 2012, 3:05:16 PM10/25/12
to symfo...@googlegroups.com

hmn, tem que ver olha o sonata que ele tem o multisite dele, mas não sei como funciona só sei que tem

Tipo isso aqui Marcelo:


config.yml

services:
   kernel.listener.subdomain_listener:
       class: projeto\DominiosBundle\Util\Dominios
       tags:
           - { name: kernel.event_listener, event: kernel.request, method: onDomainParse }

Dominios.php

<?php

namespace projeto\DominiosBundle\Util;

use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\Event;

class Dominios
{
   public function onDomainParse(Event $event)
   {
       $request = $event->getRequest();
       $session = $request->getSession();

// mimimi

       $session->set('subdomain', $request->getHost());
   }
}
 
 
 
 
___
Att. Ciro vargas
Desenvolvedor Web/Mobile
Skype: ciro.vargas
Tel.: +55 61 8512 2992


De: Marcelo Rodrigues <marcelo....@gmail.com>
Para: symfo...@googlegroups.com
Enviadas: Quinta-feira, 25 de Outubro de 2012 16:56

ciro vargas

unread,
Oct 25, 2012, 3:12:56 PM10/25/12
to symfo...@googlegroups.com

Eu queria fazer um opensource multisite baseado no openacs em tcl, onde existem várias versões de pacotes e quando você cria um novo site escolhe os pacotes, versões que ele vai utilizar e o banco, teria um super painel administrativo para managear todos os abaixo, e se for o caso consegue desacoplar esse site e entregar pra quem precisa.

É muito útil para empresas do ramo de publicidade, onde têm vários clientes e a mesma equipe, evita duplicação de código, agiliza no processo de criação e atualização sem atrapalhar os clientes antigos.

Mas vou esperar o 2.2 pra fazer bem.
 
 
 
___
Att. Ciro vargas
Desenvolvedor Web/Mobile
Skype: ciro.vargas
Tel.: +55 61 8512 2992


De: ciro vargas <cirob...@yahoo.com.br>
Para: "symfo...@googlegroups.com" <symfo...@googlegroups.com>
Enviadas: Quinta-feira, 25 de Outubro de 2012 17:05

Marcelo Rodrigues

unread,
Oct 25, 2012, 3:38:20 PM10/25/12
to symfo...@googlegroups.com
Essa seria uma solução "multi tenancy", o que nesse caso da versão 2.2 do Symfony, servirá muito bem. Mas não no meu caso. 

Imagine o seguinte o cenário. Tenho uma rede de "botecos". O site da "rede" é o domínio principal. Algo como:


No site da rede é possível acessar o site de cada "boteco" da rede, que seria acessível por: 


Agora imagine que cada boteco tem suas diversas páginas, que são acessadas assim:


Porém, o o boteco do João tem seu próprio domínio (www.boteco-do-joao.com.br, por exemplo). Então, mapeamos esse domínio no servidor web para apontar para o mesmo local da aplicação da rede. O boteco do joao está registrado no banco da "rede". Acessando por /boteco-do-joao (slug) o sistema verifica se tem  um domínio registrado pra ela no banco e redireciona (301) pra lá. 

Ao chegar lá nesse domínio (que é o mesmo sistema, mesmo banco), o sistema verifica qual é o boteco que tem o domínio relacionado ao endereço atual. É o boteco do joao? Beleza, deixa tudo nos conformes, mas agora as páginas desse site devem ser acessadas assim:


Só que agora, nesse ponto, não tenho como fazer isso porque, anteriormente, já existe um bundle que mapeia a raíz para /{slug}, ou seja, as paginas do boteco do joao serão tratadas como um slug para outro boteco na "rede" e não suas próprias páginas. Esse é que é o desafio. 

Possíveis soluções:

- No listener do request, verificar se o domínio acessado é de um boteco da rede. Se for, "carrego" a rota que mapeia para o "Bundle" para raíz. Do contrário, carrego o "mesmo" Bundle, mas com a configuração de rota para o "{slug}. Isso ainda não testei, mas deve funcionar, creio.

Agora coexistir as duas rotas no carregamento, vai ser impossível, pelo que percebi. 

Marcelo

ciro vargas

unread,
Oct 25, 2012, 4:13:03 PM10/25/12
to symfo...@googlegroups.com

Eu entendi tudo isso mas os caches do routing, como vai fazer? 

Seria um princípio do que eu precisaria, tenho um outro problema com roteamento onde o parâmetro de usuário vai no subdomínio como: boteco-do-ze.redeboteco.com.br onde sessão não me ajuda no caso de o usuário abrir um em cada aba ou usando o path do twig

no seu caso pode usar o forward em um bundle padrão chamando um serviço

pode ser uma boa
 
___
Att. Ciro vargas
Desenvolvedor Web/Mobile
Skype: ciro.vargas
Tel.: +55 61 8512 2992


De: Marcelo Rodrigues <marcelo....@gmail.com>
Para: symfo...@googlegroups.com
Enviadas: Quinta-feira, 25 de Outubro de 2012 17:38
Reply all
Reply to author
Forward
0 new messages