Components

Você já viu essa história antes: você começa um projeto, programa uma solução, começa um novo projeto, programa novamente a mesma solução. Components são extensões auto-suficientes, plug and play, para que você não se incomode mais com tarefas repetitivas.

Os exemplos mais clássicos de components incluem o envio de e-mails, upload de arquivos, autenticação de usuários, redimensionamento de imagens, alguns deles já disponíveis no Spaghetti*. Estamos sempre desenvolvendo novos components para nossos próprios problemas, então novas funcionalidades ou melhoramentos em funcionalidades antigas aparecem de tempos em tempos.

Instalando um component

Não há segredos quanto a instalação de um novo component em sua aplicação. Quando você baixar um componente, apenas extraia o arquivo ZIP e copie o arquivo PHP para a pasta /app/components. E é isso, ele já está instalado!

Um component, entretanto, não é ativado por padrão, mesmo depois de instalado. Isso quer dizer que você precisa informar quando deseja usar um component dentro de um controller. Para tal, você precisa habilitá-lo:

public $components = array("NomeDoComponente");

Você pode ainda carregar vários components dentro de um controller passando vários itens dentro do array:

public $components = array("NomeDoComponente1", "Nome do Componente2");

Utilizando components

Vamos supor que você tenha carregado o componente de upload de arquivos, o UploadComponent, em seu controller Fotos. Para que você tenha acesso às funcionalidades dentro de FotosController, a instância de UploadComponent fica gravada em $this->UploadComponent.

Por exemplo, caso você precise utilizar o método UploadComponent::upload(), você o faria dentro de uma action da seguinte maneira:

public function upload() {
	$this->UploadComponent->upload($this->data["images"]);
}

Nota: Lembre-se sempre que cada component possui seus próprios métodos e próprio funcionamento. O exemplo acima meramente ilustra como carregar, instanciar e utilizar os métodos de um component.

Escrevendo seus próprios components

Como um component é uma boa maneira de manter código que pode ser usado em várias aplicações diferentes, talvez você queira criar seus próprios components para suas aplicações, contendo funcionalidades que você usa frequentemente.

Um component basicamente é composto por uma classe, chamada de NomeComponent, que estende a classe Component. O arquivo deve ser chamado, neste exemplo, nome_component.php, e deve estar na pasta de componentes da sua aplicação em /app/components/.

Um objeto da classe do seu component será instanciado automaticamente sempre que um controller estiver habilitado para utilizá-lo. Portanto, pelo fato de se tratar de um processo automático, não há como passar parâmetros para o construtor de sua classe. Isso significa que, se você precisar atribuir valores às variáveis de instância, deve fazê-lo dentro do controlador, conforme o exemplo:

protected function configComponent() {
	$person = $this->PersonComponent;
	$person->name = "Roberto";
	$person->age = 32;
}

Em alguns components do Spaghetti*, também é necessário definir algumas configurações antes de qualquer ação do controller, em Controller::beforeFilter(). Você também pode se utilizar dessa técnica para components que atuem automaticamente baseado em alguma configuração.