Class de Services

Salve, Salve pessoal, analizando e pensando bem acho que minhas class de controller tem muita responsabilidade, com isso gostaria de ta abastraindo para uma class de services assim futuramente posso aproveitar em outras partes da aplicacao ou ate mesmo fazendo um facade de webservices que chama estes services, gostaria de opnioes de vcs se ja tiveram que fazer algo assim , como que fizeram , oque indica.

Eu tenho uma classe "BaseController" que extende a classe CController.

Tudo que preciso para ser reaproveitado em todo o sistema eu adiciono em "BaseController", pois todas as "Classes de Controle" extende a classe "BaseController".

A classe base para todo o sistema:




<?php

class BaseController extends CController 

{

   # Aqui adicionei um valor padrao para o PageSize, que será usado no sistema inteiro, e se eu quiser mudar para uma determinada "view",  

   # posso alterar diretamente na própria classe controle adicionando: public $pageSize = 30;

   public $pageSize = 14; 

   ...

}

?>



Extendendo a classe BaseController:




<?php

class CalendarioEscolar extends BaseController 

{

   ...

}

?>



Você também pode melhorar esse esquema, veja outro exemplo:

Pastas e arquivos

===============




controllers

    |- secretaria

          |--- BaseSecretariaController.php

          |--- Classe1Controller.php

          |--- Classe2Controller.php

          |--- Classe3Controller.php

    |- BaseController.php



Veja então que as Classes: Classe1Controller, Classe2Controller, Classe3Controller que estão na pasta "secretaria", vão extender a classe "BaseSecretariaController" e que "BaseSecretariaController" extende "BaseController".

Com isso você deixa a responsabilidade para as classes "BaseSecretariaController" e "BaseController".

Espero que este exemplo seja útil para todos. Abs!

Ola Armando, interessante esta sua abordagem, na verdade esta parte de controle eu tambem tenho uma class base pois nela eu ja implemento os filtros de permissao, ja faz o crud dinamicamente unica coisa que precisa definir e a metaclass, acho que o controller do mvc seria para organizar o fluxo da aplicacao nao ter regra de negocio, por isso que pensei nas class de services ou usando o padrao GOF a class "controller" que nao e a mesmo controller do mvc veja por ex neste cenario vc realiza uma venda dae tem que dar baixa no estoque, no seu VendaContoller teria um metodo finalizarvenda dae este metodo pegaria os dados da venda os itens da venda, grava no banco e faz a baixa no estoque, isso ta no controller do mvc, agora vc quer disponibilzar um websevices no seu webservices tem o metodo finalizarvenda que faz a mesma coisa pega os dados da venda, os intens da venda, grava no banco e faz a baixa no estoque.

como resolver esta "duplicacao" de codigo ? por isso que imagino em ta utilizando uma class services

que posso chamar tanto no mvc como no webservices tipo servicesVenda que teria o metodo finalizarvenda que passaria para ela o processo de finalizar a venda e dar a baixa no estoque, nao sei se esta e a melhor abordagem por isso que trouxe a discusao para o forum para ve se ja passaram por esta situacao e como resolveram …

(;

att

Sua abordagem seria uma ótima saída para o processo de finalização das vendas.

Eu faria o mesmo que você, criaria a classe "service" passando pra ela o método finalizarVenda.

Na sua classe VendaContoller você precisaria importar a classe "service":




<?php 

Yii::import('application.controllers.service');

class VendaController extends BaseController {

  ...

  // você pode instanciar a classe service e usar outros métodos

  $service = new service();

  $service->baixaNoEstoque($venda);


}

?>



Todos os controlles que precisarem da classe service, esta terá que ser importada e poderá usar todos os métodos que se fizerem nescessário.

Pessoal, as actions não precisam ser métodos de um controller. Uma action também pode ser uma classe que extende CAction. Dessa forma é possível utilizar uma mesma ação em varios controllers, apenas sobrescrevendo o método actions:




class MeuController extends CController {

    public function actions() {

        return array(

            'minha_action' => 'application.actions.MinhaAction',

        );

    }

}



Putz. Nada haver com a questão do tópico, mas tu acabou de matar a pau uma dívida minha :)

Entrei aqui pra procurar justamente se tinha como fazer isso.

Desta forma acima, cada Action seria um arquivo e no controller deveria fazer o "override" de actions().

Confira o link: Opção Action

Isso vai depender do tamanho, diversidade da aplicação e do gosto do desenvolvedor. No caso de grande volume e diversidade, eu ficaria somente com uma classe de serviço.

Diaaaa, bem acho que nos casos das action nao resolveria meu caso, acho que vou seguir a abordagem de usar uns class de "services"