Solucionado (ver solução)
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