PD
Executando métodos do Adianti Framework pela linha de comando
Fechado
Durante o desenvolvimento de um sistema, é comum termos de invocar algumas de suas rotinas pela linha de comando. Um dos motivos mais frequentes é agendar rotinas na Crontab (pt.wikipedia.org/wiki/Crontab) para realizar rotinas frequentes. Imagine que você desenvolveu todo um sistema que controla clientes, e agora precisa enviar e-mails para aqueles que possuem pagamentos pendentes com alertas pelo menos uma vez ao dia. Neste artigo veremos como executar métodos criados no Adianti Framework pela linha de comando. Neste artigo, trabalharemos com a classe de Clientes (Customer), e criaremos uma rotina para exibir X clientes em tela.
Bom, em primeiro lugar, provavelmente você já tem uma série de classes de modelo representando usas tabelas na pasta app/model. Junto ao tutor, temos por exemplo a classe Customer. Agora, vamos criar uma rotina acionada pela linha de comando que imprimirá X clientes na tela. Para tal, precisamos criar uma classe de serviço. Uma classe de serviço cria uma camada que interage com uma funcionalidade interna da aplicação e expõe esta funcionalidade para o mundo externo. Neste caso, vamos chamar a classe de CustomerService e salvar em app/service/CustomerService.php. Veja que a classe em questão, utiliza a classe Customer, já existente em app/model/Customer.php, e também usa a conexão "samples", existente em app/config/samples.ini
A classe CustomerService terá o método printBetween() que imprimirá em tela todos os clientes cujo ID está entre dois valores informados. Para tal, este método receberá um vetor de parâmetros (passados posteriormente pela linha de comando). Com base nestes parâmetros, obterá as posições "from" e "to", que são os códigos inicial e final.
app/service/CustomerService.php
Agora que já temos a classe de serviço criada, basta invocarmos este serviço pela linha de comando. Neste caso, acionaremos o script cmd.php, que só responde à requests efetuados pela linha de comando (CLI). Este script já acompanha a instalação default do framework.
PS: Ao criarmos uma camada específica para serviços (CustomerService), desoneramos a classe de modelo (Customer), e também evitamos de colocar lá chamadas para bibliotecas externas (Ex:PHPMailer), o que não é recomendado para uma camada de modelo.
Bom, em primeiro lugar, provavelmente você já tem uma série de classes de modelo representando usas tabelas na pasta app/model. Junto ao tutor, temos por exemplo a classe Customer. Agora, vamos criar uma rotina acionada pela linha de comando que imprimirá X clientes na tela. Para tal, precisamos criar uma classe de serviço. Uma classe de serviço cria uma camada que interage com uma funcionalidade interna da aplicação e expõe esta funcionalidade para o mundo externo. Neste caso, vamos chamar a classe de CustomerService e salvar em app/service/CustomerService.php. Veja que a classe em questão, utiliza a classe Customer, já existente em app/model/Customer.php, e também usa a conexão "samples", existente em app/config/samples.ini
A classe CustomerService terá o método printBetween() que imprimirá em tela todos os clientes cujo ID está entre dois valores informados. Para tal, este método receberá um vetor de parâmetros (passados posteriormente pela linha de comando). Com base nestes parâmetros, obterá as posições "from" e "to", que são os códigos inicial e final.
app/service/CustomerService.php
- <?php
- class CustomerService
- {
- /**
- * Exibe no Standard Output todos clientes entre $param['from'] e $param['to']
- * @param @param Vetor de parâmetros recebido
- */
- public static function printBetween( $param )
- {
- $from = $param['from'];
- $to = $param['to'];
- TTransaction::open('samples');
- $response = array();
- // define o critério
- $criteria = new TCriteria;
- $criteria->add(new TFilter('id', '>=', $from));
- $criteria->add(new TFilter('id', '<=', $to));
- // carrega os clientes
- $all = Customer::getObjects( $criteria );
- foreach ($all as $customer)
- {
- $response[] = $customer->toArray();
- }
- TTransaction::close();
- print_r( $response );
- }
- }
- ?>
Agora que já temos a classe de serviço criada, basta invocarmos este serviço pela linha de comando. Neste caso, acionaremos o script cmd.php, que só responde à requests efetuados pela linha de comando (CLI). Este script já acompanha a instalação default do framework.
php5 cmd.php "class=CustomerService&method=printBetween&from=3&to=4"
PS: Ao criarmos uma camada específica para serviços (CustomerService), desoneramos a classe de modelo (Customer), e também evitamos de colocar lá chamadas para bibliotecas externas (Ex:PHPMailer), o que não é recomendado para uma camada de modelo.
Olá Pablo, gostaria de saber se essa camada se serviço representa um controler para troca de dados, e se posso fazer esse mesmo código dentro de um método no meu controlador. No caso enviar um e-mail sempre que uma nova venda for realizada. Ou a camada de serviço esta abaixo da camada de controle? Obrigado.
Anderson,
Não é um controller, mas um service mesmo.
Você pode invocar serviços a partir de seus controladores.
Att,
Pablo
Pablo me ajude preciso criar um sistema de controle bibliotecário para uma escola publica.
Me ajude, por favor
Opa boa tarde!!
Pablo, segui os passos conforme o tutorial, mas ele continua dando acesso negado!!
A pasta service não existia e não cria quando gero o projeto então criei maualmente e tentei todas as permissões e não funfa...
Já criei até como framework puro e nem assim ;(
Obrigado
Att.
Marcelo
Marcelo,
Cole a mensagem de erro exata. Assim, é meio subjetivo.
Você está com a versão 3?
Att,
Boa Noite, como faço para chamar uma função de uma classe criada na pasta service?. Criei uma classe para carregar um json mais não estou conseguindo chamar a função no controlador.
Já vi em outro post, Tinha colocado a pasta como services e não service.
Estou tentando rodar o script que verifica no banco os e-mail não enviados. Esse script será rodado em intervalo de 1 minuto.
Criei o arquivo php na pasta service e coloquei o cron para rodar. O interessante é que na hospedagem não gera erro, mais também não executa. Rodei local pelo prompt : php cmd.php .... e me gera o erro que não consegue localizar a variável onde faço a estância do TMail.
Alguem poderia me da uma luz, de como rodar o script pelo cron?
Boa tarde!
Preciso fazer exatamente isso. Executar um script chamado "verificaVencimentosMail.class.php", que faz uma verificação dos vencimentos de contratos cadastrados e envia um email para a pessoa responsável com a lista de contratos a vencer.
o que esse arquivo, que esta salvo em /app/control/ faz é só isso.
para começar a executá-lo a partir do crontab, basta salvá-lo no services?
Boa tarde!
Phablo quando executa uma classe através da linha de comando é permitido atualizar dados de uma tabela?
Tem um caso que está dando uma mensagem no php 'Warning: Illegal string offset 'cod_situacao' in /var/www/cbr/lib/adianti/database/TRecord.php on line 179' quando executo o método store() altera os dados dentro do objeto mas não atualiza o registro na tabela.
Obrigado!