CakePHP: Evitando hardcode de URLs no código

por Jan Seidl em 24 de junho de 2009

Quando tivermos que referenciar uma váriavel ou enviar um $this->redirect() para uma URL que corresponde a um par controlador/ação não é legal que tenhamos este endereço escrito “hardcoded” (na mão) no código. A classe Route do CakePHP nos ajuda a manter o código limpo e reduz a manutenção, caso necessária.

Os exemplos abaixo são uma tentativa de levar o usuário para seu painel de controle.
Suponhamos que tenhamos a rota para o controlador clients e método myaccount.

1
Route::connect('/clientes/minhaconta',array('controller'=>'clients','action'=>'myaccount'));

Modelo Hardcoded

1
2
3
$var = "/clientes/minhaconta";
# (saída) 
# $var = "/clientes/minhaconta";

Modelo com o auxílio da classe Route

Nesta classe, contamos com o método estático url que tranforma a instrução de array (a mesma usada no connect) para seu endereço relativo respectivo.

1
2
3
$var = Route::url(array('controller'=>'clients','action'=>'myaccount'));
# (saída) 
# $var = "/clientes/minhaconta";

O truque da ação index com named parameters

É comum usarmos as rotas genéricas do CakePHP que ao chamar /controlador/método chama a respectiva função no controlador. O problema existe quando a rota não está definida explicitamente, chamamos o controlador sem função /controlador (que vai buscar a função index quando não definido explicitamente) e passamos os famosos named parameters [1]: Como a ação padrão index é omitida (pois é deduzida pelo CoC do CakePHP), as named parameters são acrescidas ao final da url e acabam sendo confundidas com a ação que deveria ser chamada.

1
2
3
4
$urlData = array('controller' => 'controlador', 'action' => 'index', 'namedarg' => 'valor');
debug(Router::url($urlData));
# (saida)
# /controlador/namedarg:valor

Para contornar este problema basta definirmos a rota explícitamente:

1
Route::connect('/controlador/:action',array('controller'=>'controlador','action'=>'index'));

Tendo assim a saída conforme esperado: /controlador/index/namedarg:valor

Pronto, agora se mudares o nome da acão o código se adaptará. Diga não ao hardcode!

NOTA: A função url também recebe um segundo parâmetro do tipo boolean que indica se a URL retornada é absoluta ou não (relativa). O valor padrão é false.

NOTA: A dica só vale para o framework CakePHP.

Referências

Adicionar esta notícia no Linkk

Deixe sua opinião

Nota: Seu endereço de email nunca será publicado.

Acompanhe os comentários por RSS