{meta}

A melhor parceira de TI para o seu negócio English version

Adianti Forum

Conheça mais sobre com o livro:

Adianti Framework para PHP

  • Instalação e configuração;
  • Modelos e persistência;
  • Componentes de apresentação;
  • Organização e controle;
  • Desenvolvimento ágil com Studio Pro.
Ver detalhes...

Busca

Digite o termo a ser localizado:

Lista de discussões

Cadastrar no grupo adianti-tools-pt:
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
  1. <?php
  2. class CustomerService
  3. {
  4.     /**
  5.      * Exibe no Standard Output todos clientes entre $param['from'] e $param['to']
  6.      * @param @param Vetor de parâmetros recebido
  7.      */
  8.     public static function printBetween$param )
  9.     {
  10.         $from $param['from'];
  11.         $to   $param['to'];
  12.         TTransaction::open('samples');
  13.         $response = array();
  14.         
  15.         // define o critério
  16.         $criteria = new TCriteria;
  17.         $criteria->add(new TFilter('id''>='$from));
  18.         $criteria->add(new TFilter('id''<='$to));
  19.         
  20.         // carrega os clientes
  21.         $all Customer::getObjects$criteria );
  22.         foreach ($all as $customer)
  23.         {
  24.             $response[] = $customer->toArray();
  25.         }
  26.         TTransaction::close();
  27.         print_r$response );
  28.     }
  29. }
  30. ?>


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.


Comentários

Anderson Madureira: ( 2015-03-26)
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.
Pablo Dall'Oglio: ( 2015-05-15)
Anderson,

Não é um controller, mas um service mesmo.
Você pode invocar serviços a partir de seus controladores.

Att,
Pablo
Elieti Rodrigues: ( 2015-06-28)
Pablo me ajude preciso criar um sistema de controle bibliotecário para uma escola publica.
Me ajude, por favor
Marcelo Schmidt: ( 2016-03-05)
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
Pablo Dall'Oglio: ( 2016-04-28)
Marcelo,

Cole a mensagem de erro exata. Assim, é meio subjetivo.
Você está com a versão 3?

Att,
Herbert Thiago: ( 2016-06-21)
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.
Herbert Thiago: ( 2016-06-21)
Já vi em outro post, Tinha colocado a pasta como services e não service.
Herbert Thiago: ( 2016-08-10)
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.

  1. <?php
  2. class EnvioEmailService
  3. {
  4.     
  5.      public static function onEmail()
  6.     {
  7.         // read email configuration file
  8.         $ini parse_ini_file('app/config/email.ini');
  9.          $body  "INFORMATIVO DE ENTREGA";        
  10.             try
  11.         {
  12.             TTransaction::open('mysql');
  13.             $repository = new TRepository('EnvioEmail');
  14.             $criteria = new TCriteria;
  15.             $criteria->add(new TFilter('status''='0));
  16.             $criteria->add(new TFilter('email''!='''));
  17.             $object $repository->load($criteria);
  18.             if(!empty($object))
  19.             {
  20.                 foreach ($object as $key
  21.                 {
  22.                     
  23.                     $body .= "Nota Fiscal: $key->nota_fiscal"
  24.                     $mail = new TMail();
  25.                     $mail->setFrom$ini['from'], $ini['name'] );     
  26.                     $mail->addAddress$key->email );                                     
  27.                     $mail->setSubject'INFORMATIVO DE ENTREGA NOTA FISCAL Nº ' $key->nota_fiscal );  
  28.                     $mail->setHtmlBody$body );                                           
  29.             
  30.                     $mail->SetUseSmtp(FALSE);
  31.                     $mail->SetSmtpHost$ini['smtp'], $ini['port'] );     
  32.                     $mail->SetSmtpUser$ini['user'], $ini['pass'] );
  33.                     $mail->setReplyTo'...@....com.br' );       
  34.                     $mail->send();
  35.                     $object->status 1;
  36.                     $object->data_hora date('d-m-Y H:m:s');
  37.                     $object->store();
  38.                 }
  39.                 
  40.             }
  41.             TTransaction::close();
  42.         } 
  43.         catch (Exception $e)
  44.         {
  45.             TTransaction::close();
  46.         }   
  47.     
  48.     }
  49. }
  50. ?>


Alguem poderia me da uma luz, de como rodar o script pelo cron?
Marcos Rodrigo Jung Alves: ( 2017-07-26)
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?
Leandro Portz: ( 2017-08-30)
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!
 


Você precisa realizar login para enviar posts, comentários, dentre outros. Para isso, clique em um dos botões a seguir para logar utilizando a API de um dos serviços.