1 Introdução A utilização de frameworks como base para a construção de aplicativos tem sido adotada pelos desenvolvedores com três objetivos básicos. Primeiramente para adotar um padrão de projeto que estabeleça um modelo único para todos as aplicações, facilitando o seu entendimento pela equipe e torne o processos de desenvolvimento e manutenção menos onerosos. Em segundo para permitir a reutilização de código, reduzindo o tempo de codificação e depuração, resultando em um significativo ganho de produtividade. Por último, porém não menos importante, para direcionar o agrupamento dos diversos componentes das aplicações de acordo com parâmetros claramente definidos, normalmente de acordo com a suas responsabilidades e forma de atuação. A framework PHP desenvolvida e adotada pela Codevasf como ambiente de operação dos sistemas de informação da empresa, é baseada na arquitetura de software MVC (Model View Controller), utilizada em diversos padrões de projeto de software, inclusive em frameworks voltadas para aplicativos WEB. Na arquitetura MVC, Model representa os dados e regras negociais da aplicação, View representa os elementos da interface com o usuário, enquanto Controller atua como um mediador na transferência de dados entre as duas outras camadas. É importante observar que a arquitetura MVC estabelece como os componentes da aplicação interagem, e não apenas como estes estão agrupados nas diversas camadas. Além dos objetivos gerais de utilização de frameworks, o modelo MVC visa dotar as aplicações de um máximo de independência principalmente entre a interface do usuário e o modelo negocial, permitindo que alterações em um acarretem em um mínimo de impacto sobre o outro. Apesar de existirem diversas implementações de MVC, em linhas gerais, o fluxo funciona geralmente da seguinte forma: 1. O usuário interage com a interface (preenchendo um campo, acionando um botão, etc); 2. O Controller interpreta o evento da interface do usuário; 3. O Controller aciona o Model, baseado no evento e nos dados recebidos da interface; 4. O Model realiza as operações negociais da aplicação, incluindo a interação com as ferramentas de persistência de dados; 5. A View gera uma interface apropriada, utilizando indiretamente o Model; 6. A interface gerada pela View aguarda nova interação do usuário, iniciando um novo ciclo. O modelo MVC não define explicitamente uma camada de acesso a dados, estando no entanto sub-entendido que estes componentes encontram-se no Model. PHP Framework Ambiente de Sistemas de Informação 1
2 Arquitetura da Framework A framework PHP da Codevasf é desenvolvida utilizando a metodologia de Programação Orientada a Objeto (OOP), de forma que todas as aplicações nela desenvolvidas devem obrigatoriamente seguir este paradigma. Da mesma forma, os componentes destas aplicações devem seguir os padrões estabelecidos pelo modelo, no que se refere ao agrupamento em camadas e nas suas competências. Esta framework adota a seguinte designação para as camadas nas quais os objetos e componentes das aplicações encontram-se agrupados: Apresentação Composta pelos elementos que formam a interface do usuário e responsável pela sua geração e interação com o usuário; Controle Responsável pela interpretação dos eventos disparados pela interface do usuário e pela comunicação de dados entre as camadas de apresentação e negócio; Negócio Detém as regras de negócio da aplicação e conforme acionamento pela camada de controle, interage com a camada de acesso a dados; Acesso a Dados Possui a definição das ferramentas de persistência de dados (estrutura e métodos de banco de dados) e realiza as operações de recuperação e atualização dos dados da aplicação. Outra premissa fundamental da framework refere-se à definição de caso de uso, elemento básico sobre o qual os aplicativos desenvolvidos devem estar organizados. Existe uma associação unívoca entre caso de uso e camada de controle, de forma que um caso de uso é definido pela classe de seu objeto da camada de controle. Desta forma, toda a referência ao aplicativo será efetuada utilizando-se o caso de uso, visto tratar-se da unidade por meio da qual o aplicativo é executado pela framework. Seguindo este padrão de projeto, a cada caso de uso acionado, além do objeto da camada de controle instanciado para o caso de uso, deve também ser instanciado um objeto correspondente à camada de apresentação. Com relação às demais camadas, do ponto de vista da framework, tais objetos não são obrigatórios, tendo em vista a sua específica relação com a funcionalidade do caso de uso e pelo fato de não ocorrer interação direta entre estas camadas e os objetos internos da framework. Na maioria dos casos, no entanto, deverá ser necessário instanciar pelo menos o objeto correspondente à camada de negócio. Assim sendo, a partir deste momento, sempre que forem citados os termos apresentação, controle, negócio e acesso a dados, estes estarão referindo-se aos componentes (classes e objetos) da framework e dos aplicativos, agrupados de acordo com o seu comportamento e pertencentes a estas camadas. PHP Framework Ambiente de Sistemas de Informação 2
Execução dos Casos de Uso Considerando o agrupamento dos componentes nas camadas acima definidas, o fluxo da framework, em linhas gerais, opera da seguinte forma: 1. O usuário interage com a interface (preenchendo um campo, acionando um botão, etc), concluindo a sua interação com um evento associado a uma ação de formulário; 2. A apresentação efetua um tratamento ao evento, de acordo com a ação de formulário recebida e considerando o estado atual, e estabelece um novo estado para o caso de uso; 3. O controle interpreta o evento da interface do usuário de acordo com o estado estabelecido, acionando o negócio, baseado no evento e nos dados recebidos da interface; 4. O negócio realiza as operações negociais da aplicação, interagindo com os componentes de acesso a dados quando estas envolverem persistência de dados; 5. O controle, provê a apresentação com informações recebidas do negócio, por meio de interação com seus componentes, podendo estabelecer novo estado para o caso de uso; 6. A apresentação gera uma interface apropriada, de acordo com o comportamento estabelecido pelo estado atual; 7. A interface gerada pela apresentação aguarda nova interação do usuário, iniciando um novo ciclo. O fluxo apresentado acima, apesar de bastante semelhante àquele descrito anteriormente, possui algumas diferenças importantes. A mais importante delas refere-se ao estado do caso de uso, conceito de fundamental importância para o fluxo do caso de uso como um todo. O estado é uma propriedade da execução do caso de uso, que, como o próprio nome indica, altera o comportamento tanto da apresentação como do controle. O conceito de estado permite, por exemplo, que um mesmo evento acionado pela interface do usuário, resulte em duas ou mais alternativas de comportamento do caso de uso, dependendo do estado em que se encontra o caso de uso. Deve-se observar ainda as diferenças existentes entre o primeiro ciclo de execução do caso de uso e os ciclos seguintes. Métodos e propriedades existentes, em especial nas camadas de apresentação e controle, são tratados de forma diferenciada no primeiro ciclo. Estas diferenças serão apresentadas quando do detalhamento de cada uma destas camadas. Outro ponto importante a ser considerado na construção dos casos de uso refere-se ao modelo de execução transacional ao qual todos os sistemas web estão vinculados. Tal modelo, no qual um ciclo de execução (transação) possui independência de execução e de processamento no servidor, não é adequado à necessidade quase sempre existente nos aplicativos, onde informações tratadas pela aplicação em um ciclo precisam ser utilizadas no ciclo seguinte. A persistência destas informações no ambiente da aplicação deve ser provida pela arquitetura existente, vinculadas à sessão do cliente e à janela de execução do browser. Esta última característica, a qual vincula a execução do cliente à janela do browser, é raríssima nas frameworks e sistemas baseados na tecnologia web, nas quais não é possível a execução simultânea de mais de um caso de uso com a utilização de várias janelas de um mesmo browser por um cliente. Dentre as informações persistidas ao nível do caso de uso estão o estado e o conteúdo dos objetos da camada de apresentação. PHP Framework Ambiente de Sistemas de Informação 3
Acionamento dos Casos de Uso O acionamento dos casos de uso pela framework é realizado por meio de links montados na interface do usuário ou por um caso de uso em execução. Não é possível ao usuário realizar diretamente este acionamento, uma vez que o endereço para acesso ao caso de uso não encontra-se exposto pelo servidor web, como ocorre na maioria das frameworks e soluções de sistemas web existentes. Isto constituise um aspecto importante na segurança na aplicação, pois garante que o acionamento de um caso de uso ocorra apenas se autorizado pela framework, de acordo com o perfil do usuário corrente, nunca por decisão unilateral deste usuário. A referência para acionamento de um caso de uso pela framework é a classe da camada de controle definida para o caso de uso. É responsabilidade do construtor desta classe o instanciamento dos objetos da camada de apresentação e da camada de negócio, tornando-os acessíveis à framework. Cabe ao objeto da camada de negócio, por sua vez, o instanciamento, quando necessário e obedecendo à modelagem de negócio da aplicação, dos demais objetos negociais e de acesso a dados. A duração da vida do caso de uso se estende desde o momento do seu acionamento, independente da origem, até a sua substituição por outro componente no espaço de execução do cliente. Durante todo este tempo as informações persistentes na sessão do cliente são restauradas a cada ciclo de execução. Encadeamento de Casos de Uso Quando o acionamento de um caso de uso é efetuado durante a execução de um outro caso de uso e não por meio do menu apresentado pela estrutura da framework, pode ser desejada pela arquitetura da aplicação a retomada do caso de uso original, após a conclusão do segundo ou subseqüentes casos de uso acionados. Esta situação é implementada pela framework por meio de empilhamento e desempilhamento dos casos de uso conforme o seu acionamento, realizando a restauração do seu estado e de suas propriedades internas no retorno, tornando transparente para a aplicação o processamento ocorrido durante o encadeamento. A pilha de encadeamento dos casos de uso é esvaziada quando ocorre a seleção de qualquer item do menu de funcionalidades disponíveis para o usuário. Além do encadeamento acima descrito, um caso de uso pode ser acionado para execução em uma nova janela do browser, podendo este último, quando do seu encerramento, interagir com o caso do uso de origem. É importante observar que esta interação só é permitida no mesmo ciclo de execução que realizou o acionamento. PHP Framework Ambiente de Sistemas de Informação 4
3 A Persistência da Sessão do Usuário A persistência de informações na sessão do usuário, definida por cada janela do browser do cliente, ocorre em três níveis: Global Vinculada à sessão do usuário; Por Aplicação Vinculada à cada aplicação definida na framework; e Local Vinculada ao tempo de vida do caso de uso. A implementação desta persistência é executada pela framework e disponibilizada para o caso de uso por meio de um objeto da classe FormControl, o qual é instanciado pela framework e tornado disponível por referência à apresentação e ao controle. É também por meio de métodos disponibilizados por este objeto que o caso de uso efetua interações com a framework para além do seu próprio contexto de execução. Estes métodos podem ser agrupados de acordo com a sua funcionalidade, conforme descrito a seguir: Métodos de manipulação das informações da sessão: getapplparameters e setapplparameters Manipula as informações disponíveis no escopo da aplicação à qual o caso de uso pertence; getglobalparameters e setglobalparameters Manipula as informações disponíveis globalmente; setsessionvars Define as informações no escopo do caso de uso. Métodos de controle do fluxo de execução: execute Aciona a execução de um método público de uma aplicação; isauthorized, isconnected, loginuser, logoutuser e refresh Manipula informações referentes ao perfil do cliente; getcurrentprogram, getlastprogram, hasreturn, ispopup, popupreturn, redirect, redirectreturn e redirectsetparameter Trata as informações referentes ao fluxo de execução de casos de uso; getlaststate, getstate e setstate - Outros métodos disponíveis: getuniqueid Retorna uma identificação única; settoolbar Configura a barra de ferramentas. PHP Framework Ambiente de Sistemas de Informação 5