2012-10-25 17 views
5

thư viện jaxl Tôi đã thư viện cho các giao dịch XMPP sử dụng:jaxl trở lại chức năng mà nó được gọi là từ

class xmpp{ 

     public function register_user($username, $password){ 
      require_once 'JAXL/jaxl.php'; 

      $this->client = new JAXL(array(
       'jid' => 'localhost', 
       'log_level' => JAXL_ERROR 
      ));   
      $this->username = $username; 
      $this->password = $password; 

      $this->client->require_xep(array(
       '0077' // InBand Registration 
      ));  
      $thisClassObject =& $this; 

      $this->client->add_cb('on_stream_features', function($stanza) use(&$thisClassObject) { 
       $thisClassObject->client->xeps['0077']->get_form('localhost'); 
       return array($thisClassObject, 'wait_for_register_form'); 
      }); 

      $this->client->start();  

      return; 
     } 

     public function wait_for_register_response($event, $args) { 


      if($event == 'end_stream') { 
       return; 
      } 
      else if($event == 'stanza_cb') { 
       $stanza = $args[0]; 
       if($stanza->name == 'iq') { 
       if($stanza->attrs['type'] == 'result') { 
        echo "registration successful".PHP_EOL."shutting down...".PHP_EOL; 
        $this->client->end_stream(); 
        return 'logged_out'; 
       } 
       else if($stanza->attrs['type'] == 'error') { 
        $error = $stanza->exists('error'); 
        echo "registration failed with error code: ".$error->attrs['code']." and type: ".$error->attrs['type'].PHP_EOL; 
        echo "error text: ".$error->exists('text')->text.PHP_EOL; 
        echo "shutting down...".PHP_EOL; 
        $this->client->end_stream(); 
        return "logged_out"; 
       } 
      } 
     } 
    } 

     public function wait_for_register_form($event, $args) { 

      $stanza = $args[0]; 
      $query = $stanza->exists('query', NS_INBAND_REGISTER); 
      if($query) { 
       $form = array(); 
       $instructions = $query->exists('instructions'); 
       if($instructions) { 
       echo $instructions->text.PHP_EOL; 
      } 

      $this->client->xeps['0077']->set_form($stanza->attrs['from'], array('username' => $this->username, 'password' => $this->password)); 
      return array($this, "wait_for_register_response"); 
     } 
     else { 
      $this->client->end_stream(); 
      return "logged_out"; 
     } 
     }  
    } 

các mã đều giống như register_user.php, nhưng thực hiện trong một lớp học;

tôi sử dụng lớp này trong mã của tôi theo cách này:

$xmppObj = new xmpp(); 
$xmppObj('user','password'); 
/* 
some more code after this 
/* 

khi nó thực thi, tạo sử dụng thành công nhưng nó in một thông điệp ('đăng ký thành công ...') và ứng dụng thoát và nó doesn' t thực hiện "một số mã sau này" sau khi chức năng lớp, nói cách khác nó không tuân theo mã ...

Tôi có thể làm gì để giải quyết vấn đề này, một người có thể giúp tôi quen thuộc với thư viện JAXL .

Trả lời

1

Có vẻ như bạn đang sử dụng cùng một mã như được tìm thấy bên trong examples/register_user.php. Khi đăng ký sử dụng thành công, kịch bản đóng XMPPStream như hiển nhiên từ phần này của mã:

if($stanza->attrs['type'] == 'result') { 
    echo "registration successful".PHP_EOL."shutting down...".PHP_EOL; 
    $this->client->end_stream(); 
    return 'logged_out'; 
} 

Bạn thay vì phải gọi $client->send_end_stream(); và không $client->end_stream();. Điều này sẽ đảm bảo XMPPStream nằm bên dưới làm cho đúng FSM state transition. Ngoài ra thêm một cuộc gọi lại cho sự kiện on_disconnect, bên trong cuộc gọi lại này, bạn có thể thử kết nối lại với tài khoản XMPP mới được đăng ký và nó chỉ hoạt động tốt.

Lưu ý: Vui lòng kiểm tra mã mới nhất từ ​​kho lưu trữ. Tôi đã thực hiện một số bản cập nhật cho phép lõi JAXLLoop được khởi tạo lại. Nếu bạn quan tâm đến chi tiết, đây là commit log.