3.6.2 Construindo componentes personalizados
Suponha que sua aplicação online precisa utilizar funções complexas de matemática em diversas partes da aplicação. Poderíamos, então, criar um componente para que esta lógica seja compartilhada entre diversos controladores.
O primeiro passo é criar um arquivo para o componente e uma classe. Crie o arquivo em /app/controllers/components/math.php. A estrutura básica do arquivo do componente é similar a apresentada abaixo.
<?php
class MathComponent extends Object {
function doComplexOperation($amount1, $amount2) {
return $amount1 + $amount2;
}
}
?>
<?phpclass MathComponent extends Object {function doComplexOperation($amount1, $amount2) {return $amount1 + $amount2;}}?>
Quando seu componente estiver criado, nós podemos utilizá-lo nos controladores da aplicação colocando o nome do componente no vetor da variável $components:
// Isso faz com que o novo componente possa ser acessado usando $this->Math
var $components = ('Math', 'Session');
// Isso faz com que o novo componente possa ser acessado usando $this->Mathvar $components = ('Math', 'Session');
3.6.2.1 Including Components in your Controllers
Once our component is finished, we can use it in the application’s controllers by placing the component's name (minus the "Component" part) in the controller’s $components array. The controller will automatically be given a new attribute named after the component, through which we can access an instance of it:
/* Make the new component available at $this->Math,
as well as the standard $this->Session */
var $components = array('Math', 'Session');
/* Make the new component available at $this->Math,as well as the standard $this->Session */var $components = array('Math', 'Session');
Components declared in AppController will be merged with those in your other controllers. So there is no need to redeclare the same component twice.
When including Components in a Controller you can also declare a set of parameters that will be passed onto the Components initialize() method. These parameters can then be handled by the Component.
var $components = array( 'Math' => array( 'precision' => 2, 'randomGenerator' => 'srand' ), 'Session', 'Auth' );
var $components = array('Math' => array('precision' => 2,'randomGenerator' => 'srand'),'Session', 'Auth');
The above would pass the array containing precision and randomGenerator to MathComponent's initialize() method as the second parameter.
This syntax is not implemented by any of the Core Components at this time
3.6.2.2 Acessando classes do MVC de dentro dos componentes
Para ter acesso a instância do controlador dentro do seu novo componente, você precisa implementar o método startup(). Este é um método especial que trás a referência do controlador como primeiro parâmetro e esta função é chamada automaticamente depois da função beforeFilter() do controlador. Se por alguma razão você não quer que o método startup() seja executado quando o controlador é instanciado, defina o valor da variável $disableStartup para true.
Se você deseja inserir uma lógica antes que o controlador seja chamado, use o método initialize() no seu componente.
<?php
class MathComponent extends Object {
//chamado antes de Controller:beforeFilter()
function initialize() {
}
//chamado depois de Controller::beforeFilter()
function startup(&$controller) {
}
function doComplexOperation($amount1, $amount2) {
return $amount1 + $amount2;
}
}
?>
<?phpclass MathComponent extends Object {//chamado antes de Controller:beforeFilter()function initialize() {}//chamado depois de Controller::beforeFilter()function startup(&$controller) {}function doComplexOperation($amount1, $amount2) {return $amount1 + $amount2;}}?>
Você pode também querer utilizar outros componentes dentro de um componente personalizado. Para isso, basta criar a variável $components na classe (assim como você faria em um controlador) como um array que contenha os nomes dos componentes que você deseja utilizar.
