Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
10
respostas

URL Amigável - MVC

Olá pessoal, estou criando um projeto em MVC, onde o controller e a action são passados via GET para o arquivo index.php, exemplo:

index.php?ControllerName=testController&action=testeaction

Desta forma o arquivo index instância a classe e chama o método, que por sua vez chama o Model e carrega a View. (Não sei muito bem se isso está sendo feito em um padrão correto, oque vocês acham ?

Mass, esta não seria a dúvida principal, estou na procura de aplicar uma URL amigável, alguém conseguiria indicar um procedimento descomplicado para ativar está funcionalidade em meu sistema? Já analisei alguns vídeos sobre o assunto, mas quero recolher mais informações, pois estou com algumas dificuldades para executar e entender este processo.

Obrigado desde já.

10 respostas

criem um arquivo com esse nome (exatamente, não adicione nada antes do ponto): .htaccess

RewriteEngine On 

# Handle Front Controller... 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-l 
RewriteRule ^ index.php [L]

no index.php


$path = $_SERVER['REQUEST_URI']; 
$path = rtrim($path, '/'); 
$path = filter_var($path, FILTER_SANITIZE_URL); 
$path = explode('/', $path); 

$this->controller = $path[1]; 
$this->action = $path[2];

Olá Ismael, muito obrigado pela resposta, depois de utilizar o explode na variável $path, a seguinte array é retornada:

Array ( [0] => [1] => diretorio1 [2] => ditetorio2 [3] => ?controller=TestController&action=testaction )

Na chave [3] esta localizada as chamadas que preciso, como o nome do controller e o nome da ação, as chaves anteriores, são os diretórios, será que terei que explodir a variável de uma outra maneira?

Grato pela atenção.

Oi Mario, por causa das regras escritas no ".htaccess", em vez de passas as urls desta maneira:

index.php?ControllerName=testController&action=testeaction

agora você vai ter que fazer desta maneira:

http://127.0.0.1:8000/diretorio1/diretorio2/TestController/testaction

E é o que faz sentido, já que se trata de URLs amigáveis

Sim, porém não está retornando uma array com as chaves que preciso, como pode ver, tudo esta armazenado na chave 3 da array.

As únicas coisas que possivelmente podem ser, são: 1 - as regras de rescrita o .htaccess estão diferentes; 2 - erro ao passas as as URL; 3 - a versão do PHP não suporta as regras inseridas no .htaccess.

aqui, eu utilizo essa versão do PHP:

$ php -v
PHP 7.2.0 (cli) (built: Nov 28 2017 23:48:32) ( NTS MSVC15 (Visual C++ 2017) x64
 )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2017 Zend Technologies

eu utilizo o servidor do próprio PHP não utilizo wampserver ou xampp

aqui está um projeto base que utilizei: https://github.com/ismaelmdesousa/phpmvc

Estou utilizando o MAMP e a versão do PHP é a 7.1.6, como faço para saber se o RewriteEngine esta realmente ligado, através de um phpinfo()? Se sim, tentei localizar o trecho que informa algo sobre isso e não encontrei.

Agora pude compreender melhor oque você quiz dizer, terei que mudar a forma com que passo os valores na url, correto?

Só de adicionar o .htaccess no diretório a reescrita de url do PHP já fica habilitada, aquela primeira linha do .htaccess e que habilita a reescrita. E sim, você vai ter que mudar a forma de passar os valores para a url

Você poderia me explicar quais ações o .htaccess esta fazendo? Pois pelo que percebi, sem ele nada disso funciona.

solução!

RewriteEngine On: Habilita a reescrita de URI; RewriteCond: e uma condicional para a reescrita. Por exemplo

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-l

Essas duas linha verifica se a requisição não é um diretório, não é um arquivo e não e um link simbólico. RewriteRule: responsável por fazer a reescrita da url.

Nesse caso o htaccess está vazendo algo mais ou menos assim: verificar e a requisição não e um diretório e se não é um arquivo e se não é um link simbólico se não faça a reescrita e o redirecionamento da requisição para o index.php pegando tudo que tiver na requisição anterior e passando como parâmetro.

para mais veja: https://pt.stackoverflow.com/questions/102722/o-que-significam-rewritecond-e-rewriterule-em-um-arquivo-htaccess

http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html