2009-08-19 6 views
4

Tout d'abord, je peux m'authentifier avec Oauth. J'utilise le tutoriel de Padraic trouvé ici: http://blog.astrumfutura.com/archives/411-Writing-A-Simple-Twitter-Client-Using-the-PHP-Zend-Frameworks-OAuth-Library-Zend_Oauth.htmlZend Framework: Zend_Oauth et Zend_Service_Twitter

Maintenant, mon problème est que j'ai déjà un modèle Twitter en utilisant Zend_Service_Twitter. Mais puisque Zend_Service_Twitter nécessite un mot de passe, je décide de l'étendre. Ma nouvelle classe est comme ceci:

<?php 

/** 
* I'm trying to extend Zend_Service_Twitter to use Oauth instead 
*/ 

require_once 'Zend/Service/Twitter.php'; 

class Mytwitterapp_Twitteroauth extends Zend_Service_Twitter 
{ 
    /** 
    * Oauth 
    * @var Zend_Oauth_Token_Access 
    */ 
    protected $_token; 

    /** 
    * Array for Zend_Oauth_Consumer (i think) 
    * @var Zend_Config_Ini 
    */ 
    protected $_config; 

    /** 
    * @param object $token 
    * @return void 
    */ 
    public function __construct(Zend_Oauth_Token_Access $token) 
    { 
     $this->_config = new Zend_Config_Ini(APPLICATION_INI, APPLICATION_ENV); 

     $this->_token = $token; 
     $this->setUri('http://twitter.com'); 

     $client = $this->_token->getHttpClient($this->_config->oauth->toArray()); 
    } 

    public function _init() 
    { 
     $client = $this->_token->getHttpClient($this->_config->oauth->toArray()); 
    } 
} 

Et donc mon Model_Twitter, ressemble à quelque chose comme ceci:

<?php 

require_once 'Mytwitterapp/Twitteroauth.php'; 

class Twitter_Model_Twitter 
{ 
    private $_twitter; 
    private $_username; 
    private $_password; 

    public function __construct(array $options = null) 
    {   
     $oauth = new Zend_Session_Namespace('Twitter_Oauth'); 
     $token = unserialize($oauth->twitter_access_token); 
     $this->_twitter = new Mytwitterapp_Twitteroauth($token); 
    } 

    public function setOptions(array $options) 
    { 
     $methods = get_class_methods($this); 
     foreach ($options as $key => $value) { 
      $pieces = explode('_', $key); 
      foreach($pieces AS $piece_key => $piece_value) { 
       $pieces[$piece_key] = ucfirst($piece_value); 
      } 
      $name = implode('',$pieces); 
      $method = 'set' . $name; 
      if (in_array($method, $methods)) { 
       $this->$method($value); 
      } 
     } 
     return $this; 
    } 

    public function setTwitter($obj) 
    { 
     $this->_twitter = $obj; 
     return $this; 
    } 


    public function verifyCredentials() 
    { 
     return $this->_twitter->account->verifyCredentials(); 
    } 

    public function userTimeline() 
    { 
     return $this->_twitter->status->userTimeline(); 
    } 
//...more code here... 
} 

Et enfin, je me attends à les utiliser quelque chose comme ceci:

$twitter_model = new Twitter_Model_Twitter(); 
$this->view->friendsTimeline = $twitter_model->friendsTimeline(); 
  1. Est-ce que je le fais correctement? (En termes d'extension de ma classe Zend_Service_Twitter).

  2. Comment implémenteriez-vous quelque chose comme ça?

Je reçois aussi cette erreur:

Zend_Rest_Client_Result_Exception: REST Response Error: fopen(/htdocs/twitter/application/views/helpers/Layout.php) [function.fopen]: failed to open stream: No such file or directory in /Applications/MAMP/bin/php5/lib/php/Zend/Rest/Client/Result.php on line 67 
+1

Le lien dans le message est malheureusement mort. – Ben

Répondre

5

D'accord, je mis une prime sur cette question et je ne sais pas comment l'enlever. Je vais y répondre moi-même. Pour les autres, savoir s'ils rencontrent le même problème.

D'abord, dans mon application.ini J'ai quelque chose comme ceci:

oauth.version   = "1.0" 
oauth.signatureMethod = "HMAC-SHA1" 
oauth.requestScheme  = "header" 
oauth.siteUrl   = "http://mysite.com/twitter/public" 
oauth.callbackUrl  = "http://mysite.com/twitter/public/login/callback" 
oauth.requestTokenUrl = "http://twitter.com/oauth/request_token" 
oauth.authorizeUrl  = "http://twitter.com/oauth/authorize" 
oauth.accessTokenUrl = "http://twitter.com/oauth/access_token" 
oauth.consumerKey  = "xxxxxx" 
oauth.consumerSecret = "xxxxxxxxxx" 

Ensuite, mon nouveau modèle est la suivante:

<?php 

/** 
* I'm trying to extend Zend_Service_Twitter to use Oauth instead 
*/ 

require_once 'Zend/Service/Twitter.php'; 

class Mytwitterapp_Twitteroauth extends Zend_Service_Twitter 
{ 
    /** 
    * Oauth 
    * @var Zend_Oauth_Token_Access 
    */ 
    protected $_token; 

    /** 
    * Array for Zend_Oauth_Consumer (i think) 
    * @var Zend_Config_Ini 
    */ 
    protected $_config; 

    /** 
    * @param object $token 
    * @return void 
    */ 
    public function __construct(Zend_Oauth_Token_Access $token) 
    { 
     $this->_config = new Zend_Config_Ini(APPLICATION_INI, APPLICATION_ENV); 
     $this->_token = $token; 
     $this->setUri('http://twitter.com'); 
     //$this->_authInitialized = true; 

     self::setHttpClient($token->getHttpClient($this->_config->oauth->toArray())); 
    } 
} 

Son utilisation ressemblerait à quelque chose comme ceci:

$oauth = new Zend_Session_Namespace('Twitter_Oauth'); 
$token = unserialize($oauth->twitter_access_token); 
$this->_twitter = new Mytwitterapp_Twitteroauth($token); 
3

Nous l'avons fait presque exactement pour Twitgoo.com (runnining full zend framework et l'intégration de twitter oauth login). Pour généraliser, nous avons créé deux modèles Zend_Auth_Identity - un pour la connexion par mot de passe un pour la connexion oauth. (en fait 3 où 1 est 'anon' et échoue tous Zend_Auth). L'identité détient le nom d'utilisateur et notre userid local au minimum - pour oauth il contient le Zend_Oauth_Token, pour mot de passe il contient le mot de passe (nous ne le stockons jamais). Ces modèles d'identité sont ce que le Zend_Auth_Adapter pour les retours de twitter, et ce que nous passons à notre extension Zend_Service_Twitter. Notre twitter prend alors un modèle Identity, et gère la mise en place de Twitter pour cela.

class Tg_Service_Twitter extends Zend_Service_Twitter { 

    public function __construct(Tg_Auth_Identity $login) { 
     if ($login instanceof Tg_Auth_Identity_Password) { 
      $password = $login->getPassword(); 
     } else if ($login instanceof Tg_Auth_Identity_Oauth) { 
      $password = null; 
      $httpClient = $login->getOauthToken() 
       ->getHttpClient(Tg_Service_Twitter_Helper::getOauthOptions()); 
      self::setHttpClient($httpClient); 
     } else { 
      throw new Exception('not done yet'); 
     } 

     $username = $login->getUsername(); 

     self::setupHttpClient(); 
     parent::__construct($username, $password); 

     if ($login instanceof Tg_Auth_Identity_Oauth) { 
      //makes it skip basic auth 
      $this->_authInitialized = true; 
     } 
    } 

Le nom d'utilisateur de $ doit être mis de la connexion (qui twitter redonne à vous pendant obtenir un jeton d'accès) par certaines des fonctions de Service_Twitter.

Je peux ajouter plus de détails si nécessaire.

+0

Oui, je me souviens de Twitgoo du poste de Padriac. Je suis maintenant capable de GET/POST à ​​twitter.com en utilisant Zend_Oauth. Mon problème est que j'obtiens cette erreur: Erreur fatale Catchable: L'argument 2 passé à Zend_Oauth_Token_Access :: toQueryString() doit implémenter l'interface Zend_Oauth_Config_Interface, instance de Zend_Oauth_Client donnée, appelée dans /htdocs/twitter/library/Zend/Oauth/Client.php on ligne 131 et défini dans /htdocs/twitter/library/Zend/Oauth/Token/Access.php à la ligne 55 Avez-vous rencontré cette erreur lors du développement de Twitgoo? – wenbert

+0

Je l'ai eu le travail! Padraic Brady a répondu à mon fil dans la liste de diffusion ZF ... C'était en fait un bug. Je viens de mettre à jour Oauth de l'Incubateur et le problème est parti. – wenbert

+0

Ah ouais, j'ai oublié de mentionner que :-) - J'avais un correctif temporaire avant que l'incubateur ne soit mis à jour avec le correctif. – Justin

0

L'homme, merci pour cela.Était à peu près perdre mon esprit sur un nouveau projet qui a déjà eu un tas d'appels Zend_Service_Twitter en elle.