Não foi possível chamar o método construtor da classe Olá, Pablo e pessoal da comunidade. Primeiro quero dizer que esse framework é muito bom. Eu já vinha usando alguns componentes que foram desenvolvidos no livro PHP Programando com Orientações a Objetos e agora com o framework tudo parece estar melhor. Eu vinha lendo o livro Adianti Framework para PHP e fazendo os exemplos no framework, cuja a versão é a 1.0.3. Eu tive um problema ao...
JA
Não foi possível chamar o método construtor da classe  
Fechado
Olá, Pablo e pessoal da comunidade.

Primeiro quero dizer que esse framework é muito bom. Eu já vinha usando alguns componentes que foram desenvolvidos no livro PHP Programando com Orientações a Objetos e agora com o framework tudo parece estar melhor.

Eu vinha lendo o livro Adianti Framework para PHP e fazendo os exemplos no framework, cuja a versão é a 1.0.3.
Eu tive um problema ao executar o exemplo da página 48 mais especificamente o arquivo CollectionUpdate.class.php.

 
  1. <?php
  2. class CollectionLoad extends TPage
  3. {
  4. public function __construct()
  5. {
  6. parent::__construct();
  7. try
  8. {
  9. TTransaction::open('samples'); // abre uma transação
  10. $criteria = new TCriteria;
  11. $criteria->add(new TFilter('gender', '=', 'F'));
  12. $repository = new TRepository('Customer');
  13. $customers = $repository->load($criteria);
  14. foreach ($customers as $customer)
  15. {
  16. echo $customer->id . ' - ' . $customer->name . '<br>';
  17. }
  18. TTransaction::close(); // fecha a transação.
  19. }
  20. catch (Exception $e)
  21. {
  22. new TMessage('error', $e->getMessage());
  23. }
  24. }
  25. }
  26. ?>


Ao executar o arquivo eu recebo uma mensagem de erro (TMessage) 'Não é possível chamar o construtor da classe'.
Acredito que os objetos Customer's não estão sendo carregados e, consequentemente, o TRepository não está conseguindo chamar o método construtor dos objetos Customer's.

A fim de verificar o comando SQL gerado eu utilizei a classe TLoogerTXT e verifiquei que o comando SQL está correto e retornando as linhas da tabela corretamente.

Então, não sei o que está ocasionando o problema.
Vocês podem me ajudar a descobrir esse problema?
Agradeço desde já qualquer ajuda.
:)


Curso Dominando o Adianti Framework

O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado!


Dominando o Adianti Framework Quero me inscrever agora!

Comentários (5)


JA

P.S. Gostaria de mudar o título do post pra algo mais sugestivo (Não foi possível chamar o método construtor da classe - Livro: Adianti Framework para PHP pag 48)
FC

O nome da classe que vc criou esta diferente vc percebeu ?

CollectionLoad

Digita assim como está na url, ou mude para CollectionUpdate como no exemplo.

Sds
Felipe Cortez
PD

Jairo,

Em primeiro lugar, obrigado!

Para facilitar o debug, experimente substituir:
 
  1. <?php
  2. new TMessage('error', $e->getMessage());
  3. ?>

por:
 
  1. <?php
  2. new TExceptionView($e);
  3. ?>


Vai dar um debug mais completo.

Atenciosamente,
Pablo
JA

Desculpe a demora pra responder. Eu estava muito ocupado recentemente, mas logo retornarei ao estudo do Adianti Framework.

Eu descobri o problema.

O problema aconteceu depois que eu havia criado o método interceptador do atributo
birthdate
(set_birthdate)
da classe
Customer
no exemplo anterior do livro. Acontece que eu já havia inserido alguns (2) registros de Clientes (Customer) que não seguia o padrão de data do método ('2014-11-07').
Quando o objeto TRepository tentava instanciar o objeto Customer ele não conseguia porque no método construtor da classe TRecord não conseguia atribuir a data no novo padrão para o atributo birthdate, logo, o erro 'Não é possível chamar o construtor da classe'.

Espero que tenham entendido. Foi um pouco difícil saber qual era o erro. Cheguei a pensar que era um problema no método load() da classe TRepository.

No meu post coloquei o nome da classe errada CollectionUpdate.class.php mas se referia a CollectionLoad.class.php.


 
  1. <?php
  2. /**
  3. * Encapsulate the birthdate property
  4. * Sample: $customer->birthdate = 'March, 8';
  5. */
  6. public function set_birthdate($value)
  7. {
  8. $parts = explode('-', $value);
  9. if (checkdate($parts[1], $parts[2], $parts[0]))
  10. {
  11. $this->data['birthdate'] = $value;
  12. }
  13. else
  14. {
  15. throw new Exception("Cannot set '{$value}' in birthdate");
  16. }
  17. }
  18. ?>


Usarei o 'new TException($e)' para ver se consigo informações mais detalhadas do bug, Pablo.
Obrigado pela ajuda, pessoal.
EC

Me ajudou bastante, também estava com esse mesmo problema e conseguir solucionar e entender graça a seu post.