CakePHP: Evitando hardcode de URLs no código
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.










