Url amigável
Bom, sempre procurei na net uma solução para url amigável, e nunca encontrei uma forma que me atendesse, então resolvi estudar como os Frameworks fazem. Bom, tive vários problemas para adptar uma melhor forma, pois, em meus projetos costumo usar uma estrutura bem simples e de fácil manutenção.
Exemplo da estrutura que costumo usar:
Projeto - app - controller - model - view - public - images - css - js - config - index.php
Bom trabalho com MVC, portanto, minha URL é assim:
- http://meusite.com/controller/action/param/value/params/value
- http://meusite.com/controller/param/value/param2/value
- http://meusite.com/controle/?param=value
Vou mostar a simplicidade que alcancei:
- Precisamos que o módulo mod_rewrite esteja habilitado no servidor;
- Que seja possível o uso do arquivo .htaccess (que será criado na raiz da aplicação)
- Criar um arquivo .php que vai ser o gerenciador da sua Url.
Vamos primeiro pelo htaccess.
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?$1 [QSA]
Agora o aquivo que vai gerenciar a url passada pelo usuário ou pelo proprio sistema:
class ControleURI
{
public static $control;
public static $action;
public static $file;
public static $params = array();
public static function getURI()
{
$caminhos = array();
if($_SERVER['QUERY_STRING'] != "") {
$caminhos = explode("/",$_SERVER['QUERY_STRING']);
}
$action = false;
foreach($caminhos as $key => $caminho)
{
if($key == 0)
{
// Verifico se existe um controle
if (class_exists("Controle" . ucfirst($caminho))) {
self::$params['control'] = $caminho;
self::$control = $caminho;
} else {
self::$params['control'] = "Index";
self::$control = 'Index';
}
}
if($key == 1)
{
// Verifico se existe o metodo
if (method_exists("Controle" . ucfirst(self::$control), $caminho))
{
self::$params['action'] = $caminho;
self::$action = $caminho;
$action = true;
} else {
self::$params['action'] = "index";
self::$action = "index";
}
}
if(!$action)
{
if($key % 2 != 0)
{
if(isset($caminhos[$key+1]))
self::$params[$caminhos[$key]] = $caminhos[$key+1];
}
}
else if($key > 1 && !empty($caminhos[$key+1]))
{
if($key % 2 == 0)
{
if(isset($caminhos[$key+1]))
self::$params[$caminhos[$key]] = $caminhos[$key+1];
}
}
}
if (isset(self::$params["control"])) {
self::$control = self::$params["control"];
} else if (isset($_REQUEST["control"])) {
self::$control = $_REQUEST["control"];
} else {
self::$control = "Index";
}
if (isset(self::$params["action"])) {
self::$action = self::$params["action"];
} else if (isset($_REQUEST["action"])) {
self::$action = $_REQUEST["action"];
} else {
self::$action = "index";
}
// Verifico se foi passado algum arquivo
if(isset($_FILES)) {
self::$file = $_FILES;
}
// verificamos se existe os params, se sim faz um merge com os dados passados via post.
$parametros = array_pop($caminhos);
foreach(explode("&", $parametros) as $parametro) {
$parametro = explode("=", $parametro);
if(isset($parametro[1])) {
self::$params[$parametro[0]] = $parametro[1];
}
}
foreach($_REQUEST as $key => $value)
{
if(!empty($value))
{
$param[$key] = $value;
}
}
self::$params = array_merge(self::$params, $param);
}
public static function getUrlBase()
{
return preg_replace('#/[^/]+\.php5?$#', '', $_SERVER['SCRIPT_NAME']);
}
}
Agora falta pouco, só precisamos chamar o método no arquivo de configuração ou no index (eu chamo no index por utilizar essa estrutura para criar sites e/ou blogs).
ini_set("display_errors", "on");
date_default_timezone_set('America/Sao_Paulo');
ControleURI::getURI();
// aqui abaixo faço outros includes /requires
Com isso conseguimos fazer com que a url fique de forma amigável e de simples manipulação.
Essa foi a forma que encontrei para atender minha necessidade. Se tiverem algo que possa melhorar ou até mesmo implementar novos tratamentos, fiquem à vontade.
Aguardo sugestões, críticas etc.
#FicaDica




