Roteamento de URL em uma estrutura MVC - PHP
-
25-09-2019 - |
Pergunta
Estou desenvolvendo uma estrutura MVC no PHP do zero; Principalmente para a experiência de aprendizado, mas isso pode facilmente acabar em um projeto ao vivo. Eu passei por isso tutorial Como base e eu expandi a partir daí.
Solicitações são feitas assim:
Exemplesite.com/controller/action/param1/param2/ e assim por diante ...
E este é o meu arquivo .htaccess:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?rt=$1 [L,QSA]
Portanto, todas as solicitações vão para index.php e são roteadas para o controlador e a ação corretos a partir daí. Se nenhum controlador ou ação for dada, o 'índice' padrão será assumido para ambos.
Eu tenho um controlador de índice com uma ação de índice, que deveria ser a página inicial do meu site. Eu posso acessá -lo indo para exemplos.com (já que a parte do índice é assumida). Possui algumas imagens, um link para uma folha de estilo e alguns scripts. Eles estão ligados a caminhos em relação ao index.php. Eu pensei que isso seria bom, pois toda a solicitação vá para index.php e todo o conteúdo está simplesmente incluído nesta página usando o PHP. Isso funciona se eu for para exemplos.com. Verei todas as imagens e estilos, e os scripts serão executados. No entanto, se eu for ao Exemplesite.com/index, estou roteado para a parte correta do site, mas todos os links não funcionam. O navegador acha que estou em uma pasta diferente?
Eu gostaria de poder usar caminhos relativos para todo o conteúdo do meu site, porque, caso contrário, preciso usar caminhos absolutos em todos os lugares para garantir que as coisas apareçam. Isso é possível?
Solução
Você precisa de um caminho absoluto, porque os navegadores avaliam os caminhos relativos em relação ao URI de solicitação atual (a menos que você use a tag base, veja abaixo). Lembre -se, porém, que um caminho absoluto não necessidade significa que você precisa incluir o nome do domínio nele. Simplesmente começar com uma barra para a frente é suficiente. É o caminho absoluto em relação ao servidor, por assim dizer.
Então:
<img src="/images/bla.gif">
ao invés de
<img src="images/bla.gif">
... vai funcionar bem.
Como mencionei, outra abordagem seria usar o Tag base. Mas, por razões que não me lembro agora, acredito que é recomendável não usá -lo. (Se alguém mais quiser fazer uma coisa aqui ...)
Outras dicas
Imagens imo, javascript, estilos e outros conteúdos estáticos devem não fazer parte do sistema de roteamento. Isso significa que você carrega o PHP para cada solicitação (um desempenho de desempenho), quando o Apache pode servir esses arquivos muito bem.
Meu .htaccess sempre permite que os arquivos existentes ignorem o PHP:
# Files with an extension that exist are served up straight.
RewriteCond %{REQUEST_URI} \..+$
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule .* - [L]