zeanwork.com.br  >>  Documentação  >>  Controllers
Controllers
O controlador ou Controller é a camada onde você faz as regras da sua aplicação, onde irá tratar as ações do usuário. Aqui você buscará os dados do model e tratará para a view, aplicando as regras de negócio, nada de códigos HTML, nada de CSS e nada de JavaScript, somente o poderoso PHP, códigos puros, sem misturas.

Criando um controller

Como você deve ter visto na estrutura do Zeanwork, temos um diretório somente para armazenar os arquivos dos controllers, é localizado em App/Controllers/. Você também deve ter visto os padrões do Zeanwork, o nome do arquivo deve ser no padrão lowerCamelCase, seguindo com a extensão .php. Por exemplo: nomeDoController.php.

Todo controller deve ser uma classe, portando o nome da classe deve corresponder o nome do arquivo criado, acrescentando Controller. Por exemplo: Você criou um arquivo chamado nomeDoController.php, o nome da classe deve ser NomeDoControllerController, seguindo o padrão CamelCase.
Todos os controllers devem ser estendidos da classe AppController, pois o seu controller deve herdar os métodos do Zeanwork.

Veja exemplo de um controller chamado posts (post de um blog, por exemplo.):
class PostsController extends AppController {
}

Como o Zeanwork trabalha com a seguite estrutura de URL’s: /controller/action/..... Para executarmos este controller, devemos utilizar a seguinte URL: /posts.
Como você não definiu qual action será executada, o Zeanwork por padrão executará a action index, porem não criamos ela ainda, então será informado um erro.


Criando actions

As funcionalidades de um controller são separadas por métodos (functions) que são conhecidas como actions (ações). Cada action, como o nome já diz, executa uma ação no aplicativo.
É nas actions que você irá escrever os seus códigos que podem executar dirverços procedimentos, comunicar-se com o model e muito mais.
Estes métodos devem ser publicos, caso você deseja que um método não seja acessível pela URL, você deve definir este método como private ou protected.
O nome dos métodos devem seguir o padrão lowerCamelCase, por exemplo: nomeDaAction.

Veja exemplo:
class PostsController extends AppController {
	//Método acessível pela URL
	public function index(){
		//Procedimento qualquer.
	}

//Método acessível pela URL
	function view(){
		//Procedimento qualquer.
	}

//Método não acessível pela URL
	private function getPost(){
		//Procedimento qualquer.
	}
}

Veja como acessar as actions publicas:
/posts          //Acessará o método index
/posts/index    //Acessará o método index
/posts/view     //Acessará o método view


Variáveis de configuração

O Zeanwork possui algumas variáveis de configuração que determinam como proceder em determinadas situações.
Estas variáveis estão no nível da classe, portanto você pode seta-las em qualquer local do controller e até mesmo dentro de um método.

Veja as variáveis disponíveis:
Controller::$autoView
Esta configuração serve para definir se será renderizado automáticamente a view da action.
Cada action deve ter sua perspectiva view, contendo o seu HTML, CSS… mas as vezes não precissamos ter uma view para cada action, então temos esta configuração.
O valor a ser definido é boleano (boolean).

Veja exemplo:
class PostsController extends AppController {
	public function index(){
		$this->autoView = false;
		//Procedimento qualquer.
	}

}

Controller::$autoLayout
Esta configuração serve para definir se será renderizado automáticamente o layout.
O valor a ser definido é boleano (boolean).

Veja exemplo:
class PostsController extends AppController {
	public function index(){
		$this->autoView = false;
		//Procedimento qualquer.
	}

}

Controller::$autoRender
Esta configuração serve para definir se será renderizado automáticamente o layout e a view.
O valor a ser definido é boleano (boolean).

Veja exemplo:
class PostsController extends AppController {
	public $autoRender = false;
	public function index(){
		//Procedimento qualquer.
	}
}

Controller::$writeTimeExecution
Esta configuração serve para definir se será escrito um comentário no fim do código fonte do HTML contento o tempo de execução da página.

Veja exemplo:
class PostsController extends AppController {
	public function index(){
	$this->writeTimeExecution = false;
		//Procedimento qualquer.
	}
}

Controller::$layout
Com esta variável você define qual layout será utilizado para este controller.
O valor a ser definido é uma string, deve ser o nome do layout. O layout padrão é default.

Veja exemplo:
class PostsController extends AppController {
	public $layout = 'webSite';
	public function index(){
		//Procedimento qualquer.
	}
}


Nota: Os valores das variáveis definidas dentro de um método terão vigor somente para aquele método, porem as que foram definidas na classe (fora dos métodos) entrará em vigor para todos os métodos.


Passando valores para a view

Uma das funções do controller é comunicar-se com as views, para que isso venha acontecer devemos passar valores para as view quando necessário.

Veja os métodos e variáveis disponíveis:
Controller::$view
Os valores desta variável estará automáticamente na view com o nome $data.

Veja exemplo:
class PostsController extends AppController {
	public function index(){
		$this->view = array('message' => 'Hello World');
	}
}

//Na view


Contrller::setVar()
Este método seta variáveis na view.

Parâmetros:
string $var
Nome da variável que será criado na view.

mixed $value [opcional]
Valor para a variável.



Veja exemplo:
class PostsController extends AppController {
	public function index(){
		$this->setVar('message', 'Hello World');
	}
}

//Na view


Loader::vars()
Este método esta disponível no controller como: $this->load->vars();
Para saber mais sobre este método veja em: Classes >> Loader



Dados de entrada

Para receber dados de entrada (POST, GET, FILES...) o Zeanwok tem uma classe especialmente para isso. É a classe Input, ela esta disponível através da variável input nas classes Model, View e Controller.

Veja exemplo:
class PostsController extends AppController {
	public function index(){
		if($this->input->post()){
			$this->users->create($this->input->post());
		}
	}
}

Para saber mais sobre a classe Input, você deve buscar informações em: Classes >> Input


Carregando models, components, helpers e extensions

Pensando em velocidade, o Zeanwork trabalha com a tese de que não há necessidade de carregar o que não será utilizado, é por isso que temos algumas opções diferentes para carregar models, components, helpers e extensions.

Veja os métodos e variáveis disponíveis:
Models

Controller::$uses

Variável disponível no controller, somente pode ser definida na classe.
O valor a ser informado deve ser uma array, contendo os nomes dos models, estes models estarão disponíveis em todo o controller.

Veja exemplo:
class PostsController extends AppController {
	public $uses = array('posts', 'users');
	public function index(){
		$this->view['posts'] = $this->posts->read();
	}
}

Loader::model()

Em determinados casos não precisamos utilizar todos os models em todas as actions, por isso temos este método que pode ser chamado em qualquer parte de um método do controller.
Este método esta disponível no controller como: $this->load->model().
O valor a ser informado pode ser uma string contendo somente o nome do model, como também pode ser uma array, contendo o nomes de todos os models.

Veja exemplo:
class PostsController extends AppController {
	public function index(){
		$this->load->model('posts');
		$this->view['posts'] = $this->posts->read();
	}
}

Para saber mais sobre este método veja em: Classes >> Loader

Components

Controller::$components

Variável disponível no controller, somente pode ser definida na classe.
O valor a ser informado deve ser uma array, contendo os nomes dos components, estes components estarão disponíveis em todo o controller.

Veja exemplo:
class PostsController extends AppController {
	public $components = array('cookie', 'session');
	public function index(){
		$this->session->set('userVisited', 1);
	}
}


Loader::component()

Este método esta disponível no controller como: $this->load->component()
O valor a ser informado pode ser uma string contendo somente o nome do component, como também pode ser uma array, contendo os nomes de todos os components.

Veja exemplo:
class PostsController extends AppController {
	public function index(){
		$this->load->component('session');
		$this->session->set('userVisited', 1);
	}
}

Para saber mais sobre este método veja em: Classes >> Loader

Helpers

Controller::$helpers

Variável disponível no controller, somente pode ser definida na classe.
O valor a ser informado deve ser uma array, contendo os nomes dos helpers, estes helpers estarão disponíveis em todas views do controller.

Veja exemplo:
class PostsController extends AppController {
	public $helpers = array('html', 'pagination');
		public function index(){
	}
}

//Na view Posts/index.html.php
echo $this->html->js('geral');

Loader::helper()

Este método esta disponível na view como: $this->load->helper().
O valor a ser informado pode ser uma string contendo somente o nome do helper, como também pode ser uma array, contendo os nomes de todos os helpers.

Veja exemplo:
//Na view Posts/index.html.php
$this->load->helper(array('html', 'pagination'));
echo $this->html->js('geral');

Para saber mais sobre este método veja em: Classes >> Loader

Extensions

Controller::$extensions

Variável disponível no controller, somente pode ser definida na classe.
O valor a ser informado deve ser uma array, contendo os nomes das extensions.

Veja exemplo:
class PostsController extends AppController {
	public $extensions = array('date', 'security');
	public function index(){
		$this->view['calendar'] = Date::caleandar(08, 2010);
	}
}

Loader::extension()

Este método esta disponível na view como: $this->load->extension().
O valor a ser informado pode ser uma string contendo somente o nome da extension, como também pode ser uma array, contendo os nomes de todas as extensions.

Veja exemplo:
class PostsController extends AppController {
	public function index(){
		$this->load->extension('date');
		$this->view['calendar'] = Date::caleandar(08, 2010);
	}
}

Para saber mais sobre este método veja em: Classes >> Loader



Callbacks

Os callbacks são métodos executadas em determinados momentos da execução da aplicação e do Zeanwork.

Veja os métodos disponíveis:
beforeExecution()É executado antes de executar a action.
beforeRender()É executado antes de renderizar a view.
afterExecution()É executado depois de executar a action.

Para definir estes métodos, você deve criar estas funções no seu controller, também podem ser definidos no AppController.

Veja exemplo:
class PostsController extends AppController {
	public function beforeExecution(){
		$this->load->extension('date');
	}
}


AppController

Todos os controllers devem ser estendidos da classe AppController, pois o seu controller deve herdar os métodos do Zeanwork. Se você desejar criar métodos que serão utilizados em alguns dos seus controllers, você deve recriar o controller AppController no mesmo local dos controllers comuns, este controller deverá ser estentido da classe Model.

Veja exemplo:
class AppController extends Controller {
}


Definições padrões para toda aplicação

Caso você deseja definir components, helpers, extensions e cache para toda a aplicação, você deve fazer isso no AppController.

Veja as variáveis disponíveis:
$defaultsComponents
Components padrões.

$defaultsHelpers
Helpers padrões.

$defaultsExtensions
Extensions padrões.

$defaultCache
Configurações do cache para toda a aplicação.
Para saber mais sobre cache, veja em: Controllers >> Cache


Veja exemplo:
class AppController extends Controller {
	public $defaultsComponents = array('session', 'cookie');
	public $defaultsHelpers = array('html', 'pagination');
	public $defaultsExtensions = array('date');
	public $defaultCache = array('tweets' => array('index' => 300));
}