Devexz Posted September 7, 2013 at 10:52 AM Report #523748 Posted September 7, 2013 at 10:52 AM (edited) Boas pessoal, Precisava de uma ajuda na maneira de organização de duas classes Exemplo: Eu quero enviar encomendas utilizando várias empresas de correio ( ctt, dhl, fedex, etc ) E cada uma dessas empresas é uma classe, e que têm o método para enviar encomendas: class-ctt.php class-dhl.php class-fedex.php O que eu fiz foi class-enviarEncomendas.php // que trata de enviar encomendas class-meuprojecto.php // class para gestão do meu projecto class-enviarEncomendas.php require 'class-ctt.php'; require 'class-dhl.php' require 'class-fedex.php' class class-enviarEncomendas { private empresaTransporte; private empresaInstancia; function __construct($empresa) { if($empresa == "ctt") { $this->empresaInstancia = new ctt(); } else if($empresa == "fedex") { $this->empresaInstancia = new fedex(); } else if { // assim em diante } $this->empresaTransporte = $empresa; } public function enviarEncomenda() { //agora vejo novamente qual a empresa que foi chamada no construct e chamo o método correspondente if($this->empresaTransporte == "ctt") { $this->empresaInstancia->MetodoEnviarCTT(); } else if($this->empresaTransporte == "fedex") { $this->empresaInstancia->MetodoEnviarFEDEX(); } } } class-meuprojecto.php class-meuprojecto extends class-enviarEncomendas { private empresaTransporte = ctt; // defino a empresa que quero utilizar para o envio function __construct() { parrent:construct($this->empresaTransporte); // outras variaveis são definidas aqui também } public function enviar() { $this->enviarEncomenda() // chamo o metodo da class parent //fazer as query para guardar, etc, blalbal } } (Ok, até agora isto está a funcionar, e sei que talvez não seja a melhor maneira de fazer isto, por isso podem dar as vossas opiniões.) O problema: Agora o problema é que eu quero modificar o metodo enviarEncomenda()de maneira que se o envio pelos ctt falhar, tenta enviar pelo fedex, se este também falhar passa para a próxima empresa. A solução que tinha pensado era fazer um array por ordem de preferência: array("ctt", "fedex", etc) e percorrê-lo enquanto não for retornado true, mas também quero que seja possivel definir apenas e só uma empresa de envio. No meio disto tudo não como é obvio não posso estar a instanciar classes de cada empresa... Bem, como é que vocês fariam ou como é que eu devo fazer? 👍 Edited September 7, 2013 at 10:54 AM by Devexz Contador de calorias: caloriaspordia.com
yoda Posted September 7, 2013 at 11:23 AM Report #523753 Posted September 7, 2013 at 11:23 AM Isso não me parece função de nenhuma dessas classes. Se qualquer uma delas tomar conhecimento desse "mundo de possibilidades", deixou de ser um objecto. before you post, what have you tried? - http://filipematias.info sense, purpose, direction
Devexz Posted September 7, 2013 at 11:45 AM Author Report #523756 Posted September 7, 2013 at 11:45 AM Isso não me parece função de nenhuma dessas classes. Se qualquer uma delas tomar conhecimento desse "mundo de possibilidades", deixou de ser um objecto. podes explicar melhor sff ? Contador de calorias: caloriaspordia.com
taviroquai Posted September 7, 2013 at 12:28 PM Report #523758 Posted September 7, 2013 at 12:28 PM Agora o problema é que eu quero modificar o metodo enviarEncomenda()de maneira que se o envio pelos ctt falhar, tenta enviar pelo fedex, se este também falhar passa para a próxima empresa. O que é falhar? O que acontece? Isso é uma simulação? Tens que ficar a "espera" da conclusão do processo de envio? Se o resultado do envio for instantâneo (tipo simulação), então basta uma coisa deste tipo: <?php $company_order = array('ctt', 'fedex'); $i = 0; do { $company = new {$company[$i]}; $result = $company->enviar(); $i++; } while ($i < count($company_order) && !$resultado); Se tiveres que ficar à espera do resultado do envio da empresa então o teu sistema fica num estado em "standby" (guarda o estado numa base de dados) e tens que ter alguma coisa que receba a notificação da conclusão do envio; ou então algo que fique constantemente a verificar o estado da conclusão do serviço da empresa (neste caso uma solução pode ser cron job).
Devexz Posted September 7, 2013 at 02:55 PM Author Report #523763 Posted September 7, 2013 at 02:55 PM (edited) o resultado é obtido de imediato, o código é meramente um exemplo, no entanto a lógica é igual. assim que chamo o método enviar encomenda de cada empresa, obtenho logo um resultado e caso fosse false, queria passar de imediato para a próxima empresa. Outra questão seria se devo fazer: $ctt = new CTT(); $fedex = new fedex(); // ou então private $instancia $this->instancia = new Ctt(); $this->instancia= new fedex(); É que no __construct do class-enviarEncomendas.php já estou inicializar a classe e no método enviarEncomenda vou ter inicializar novamente? Edited September 7, 2013 at 05:13 PM by brunoais geshi Contador de calorias: caloriaspordia.com
yoda Posted September 7, 2013 at 05:49 PM Report #523788 Posted September 7, 2013 at 05:49 PM Antes de mais, o que estás a tentar fazer não faz muito sentido. Em que condições é que o envio de um objecto falha num desses provedores? before you post, what have you tried? - http://filipematias.info sense, purpose, direction
Devexz Posted September 7, 2013 at 06:04 PM Author Report #523790 Posted September 7, 2013 at 06:04 PM (edited) Antes de mais, o que estás a tentar fazer não faz muito sentido. Em que condições é que o envio de um objecto falha num desses provedores? por exemplo, se eu estiver a enviar alguma coisa pelos ctt e estes estão com os servidores down, ou não conseguem enviar por alguma razao, eu tentava com outra empresa. Edit: O objectivo final é que o envio da encomenda nunca falhe, daí eu ter várias empresas e se uma falhar, tentava noutra. Edited September 7, 2013 at 06:14 PM by Devexz Contador de calorias: caloriaspordia.com
yoda Posted September 7, 2013 at 08:45 PM Report #523797 Posted September 7, 2013 at 08:45 PM (edited) Acho que o processo de mudança devia passar pelo utilizador, ou ele não pode escolher? Lembra-te que caso o servidor de um provedor estiver em baixo, não é o envio que falha, é simplesmente o provedor que não está acessível, coisa que podes verificar até antes do envio da encomenda (e que faz mais sentido). Edited September 7, 2013 at 08:46 PM by yoda 1 Report before you post, what have you tried? - http://filipematias.info sense, purpose, direction
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now