Esta seção aborda a primeira das três camadas do padrão MVC.
No padrão MVC existem basicamente três camadas: Model, View e Controller.
O controller é o intermediário entre as outras duas camadas, ou seja, ele controla (daí o nome) todo o fluxo de informação do site/sistema.
Em outras palavras, o controller, comumente chamado de controlador, tem como objetivo definir as propriedades da visualização (view), isto é, ele tem a função de condicionar, executar as regras de negócio(models), interpretar parâmetros, dentre muitas outras.
Resumindo, nesta camada é decidido o “se”, “o que”, “quando” e “onde” deve funcionar na nossa aplicação.
Agora que você já sabe o que é um controller e a sua importância para o funcionamento da aplicação, você poderá finalmente criar o seu primeiro controller. Para tal, siga estes passos:
- Defina o link desejado (Ex: http://site.com.br/`produtos`/ ou http://site.com.br/`lista-de-produtos`/);
- Crie um arquivo nomeado no padrão CamelCase; com o link desejado, sem espaços, hífens ou underscores; com o sufixo 'Controller', e; a extensão '.php'. Ou seja, para os exemplos acima, os controllers seriam:
ProdutosController.php
eListaDeProdutosController.php
; - Salve este arquivo na pasta:
app/controllers/
Após salvar o arquivo, comece com o desenvolvimento de seu código e atente-se para o exemplo abaixo que mostra o código padrão para controllers utilizando os exemplos acima:
app/controllers/ProdutosController.php
class ProdutosController extends \HXPHP\System\Controller
{
}
Fique atento às seguintes características do código listado acima:
- O nome da classe é igual ao nome do arquivo;
- Cada controller é uma extensão da classe mestre
*\HXPHP\System\Controller*
, e; - A
indexAction()
, action padrão do controller, é executada automaticamente.
Mas, afinal de contas o que são actions? Actions são os métodos públicos de um controller. Cada action é responsável por um link específico. Veremos isto com mais detalhes na próxima seção.
Após criar o controller é provável que seja necessário a criação de actions específicas e, para tal, siga estes passos:
- Defina o link desejado, por exemplo: http://site.com.br/produtos/`listar`/ , e;
- No controller desejado, crie um método
público
nomeado com o link desejado, sem espaços, hífens ou underscores; com o sufixo 'Action'.
O código resultante do exemplo acima seria:
public function listarAction()
{
...
}
Com isto você poderá concluir que a nomenclatura dos controllers e actions está diretamente ligada às URL's escolhidas. E isto é um fator muito importante para técnicas de otimização para motores de pesquisa (SEO), dentre outras vantagens.
O erro 404, comumente chamado de Error Not Found, é um dos erros mais conhecidos e portanto dispensa definições. No HXPHP esse erro é manipulado por um controller que é definido nas configurações globais da aplicação. Por padrão, o valor desta configuração é: Error404Controller
, ou seja, o arquivo Error404Controller.php é requisitado toda vez que ocorre o erro 404 durante a execução da aplicação.
Como já mencionado na seção de funcionamento da URL, os parâmetros que serão interpretados no controlador (controller) devem constar na URL, ou seja, é necessário que o controller e a action sejam definidos.
Com estas condições atendidas tem-se a seguinte estrutura:
http://site.com.br/controller/action/parametro1/parametro2/parametro3/
Para resgatar estes valores, atente-se ao fato de que o parâmetro só pode ser interpretado pela action requisitada, ou seja, no exemplo: http://site.com.br/produtos/listar/1/
, é definido que a action listar
do controller Produtos
irá receber como argumentos
os parâmetros
informados.
O código resultante do exemplo acima seria:
class ProdutosController extends \HXPHP\System\Controller
{
public function listarAction( $pagina = 1 )
{
echo $pagina;
}
}
Algumas observações importantes:
- Os parâmetros devem ser declarados como argumentos do método (action);
- Estes argumentos podem ser nomeados livremente, porém devem ter obrigatoriamente um valor pré-definido, por exemplo:
listarAction($categoria = '', $pagina = 1)
, e; - Os argumentos devem ser declarados na mesma ordem que os parâmetros.
Através deste mecanismo é possível ter **N** parâmetros
e nomeá-los de forma sugestiva, o que possibilitará uma melhor experiência com seus códigos.
O método construtor de uma classe é um método mágico e basicamente tem como função ser o primeiro método de um objeto a ser executado, ou seja, é executado automaticamente quando uma instância é criada.
As vantagens são muitas, porém a principal é que o conteúdo do método construtor é dominante sobre todos os demais.
Imagine um processo de validação de autenticação de usuários. Este processo deve prevalecer em todas as actions de um controller restrito. Com o uso do método construtor o código não precisa ser repetido.
A única regra para o uso do método construtor nos controllers é que seja declarado o método construtor da classe mãe, pois, caso contrário, um irá sobrescrever o outro e isto acarretará na desconfiguração da aplicação.
Portanto, quando criar métodos construtores siga este padrão:
class ProdutosController extends \HXPHP\System\Controller
{
public function __construct()
{
parent::__construct();
...
}
}
Caso queira utilizar os valores das configurações e até mesmo recursos como o Request, que utiliza as configurações como dependência, é necessário resgatar as configurações como argumento no construtor.
class ProdutosController extends \HXPHP\System\Controller
{
public function __construct($configs)
{
parent::__construct($configs);
echo $configs->baseURI;
echo $configs->meumodulo->propriedade;
...
}
}
É muito comum que seja necessário o processo de redirecionamento nos controllers.
Imagine o seguinte processo:
produtos/cadastrar/ **->** produtos/salvar/ **->** produtos/listar/
Após o formulário ser processado e disparado para a action **salvar**
será necessário um redirecionamento para a action **listar**
e para fazermos isto utilizamos o seguinte código:
public function salvarAction()
{
if ($processo->status === true) {
/**
* @param string $url Especifique o link para qual a aplicação será redirecionada
*/
$this->redirectTo(URL);
}
}