2009-08-19 17 views
4

Als Erstes kann ich erfolgreich mit Oauth authentifizieren. Ich benutze Padraics Tutorial hier gefunden: http://blog.astrumfutura.com/archives/411-Writing-A-Simple-Twitter-Client-Using-the-PHP-Zend-Frameworks-OAuth-Library-Zend_Oauth.htmlZend Framework: Zend_Oauth und Zend_Service_Twitter

Jetzt ist mein Problem, dass ich bereits ein Twitter-Modell mit Zend_Service_Twitter habe. Aber da Zend_Service_Twitter ein Passwort benötigt, entscheide ich mich, es zu erweitern. Meine neue Klasse ist wie folgt:

<?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()); 
    } 
} 

Und so mein Model_Twitter, sieht etwa so aus:

<?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... 
} 

Und so schließlich erwarte ich diese wie dies mit etwas zu verwenden:

$twitter_model = new Twitter_Model_Twitter(); 
$this->view->friendsTimeline = $twitter_model->friendsTimeline(); 
  1. Mache ich es richtig? (In Bezug auf die Erweiterung meiner Zend_Service_Twitter-Klasse).

  2. Wie würden Sie so etwas implementieren?

ich auch diesen Fehler:

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

Der Link in der Post ist leider tot. – Ben

Antwort

5

Okay, legte ich ein Kopfgeld auf diese Frage und ich weiß nicht, wie es zu entfernen. Ich werde es selbst beantworten. Für andere zu wissen, ob sie das gleiche Problem haben.

Zuerst in meinem application.ini Ich habe so etwas wie dies:

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" 

Dann mein neues Modell ist dies:

<?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())); 
    } 
} 

Mit ihm etwas würde wie folgt aussehen:

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

Wir haben fast genau dies für Twitgoo.com (runnining voll zend Framework und twitter oauth Login Integration) durchgeführt.

zu verallgemeinern, die wir erstellt zwei Zend_Auth_Identity Modelle - ein für Passwort Login eines für oauth Login. (eigentlich 3, wo 1 'anon' ist und alle Zend_Auth ausfällt). Die Identität enthält mindestens den Benutzernamen und unsere lokale Benutzer-ID - für oauth hält es die Zend_Oauth_Token, für das Passwort enthält es das Passwort (wir speichern es nie). Diese Identitätsmodelle sind das, was die Zend_Auth_Adapter für Twitter zurückgibt, und was wir an unsere Zend_Service_Twitter Erweiterung weitergeben.

Unser Twitter nimmt dann ein Identity-Modell und kümmert sich um die Einrichtung von Twitter dafür.

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; 
     } 
    } 

Der $ username ist erforderlich, von der Anmeldung festgelegt werden (die twitter Sie gibt wieder während Zugriffstoken immer) von einigen der Service_Twitter Funktionen.

Ich kann weitere Details hinzufügen, wenn nötig.

+0

Ja, ich erinnere mich an Twitgoo aus Padriacs Post. Ich bin jetzt in der Lage, mit Zend_Oauth GET/POST zu twitter.com. Mein Problem ist, dass ich diesen Fehler erhalte: Catalable fatal error: Argument 2 übergeben an Zend_Oauth_Token_Access :: toQueryString() muss die Schnittstelle Zend_Oauth_Config_Interface implementieren, Instanz von Zend_Oauth_Client gegeben, in /htdocs/twitter/library/Zend/Oauth/Client.php aufgerufen Zeile 131 und definiert in /htdocs/twitter/library/Zend/Oauth/Token/Access.php on line 55 Haben Sie diesen Fehler bei der Entwicklung von Twitgoo? – wenbert

+0

Ich habe es funktioniert! Padraic Brady hat auf meinen Thread in der ZF-Mailing-Liste geantwortet ... Es war tatsächlich ein Fehler. Ich habe gerade Oauth vom Incubator aktualisiert und das Problem ist weg. – wenbert

+0

Ah ja, ich habe vergessen zu erwähnen, dass :-) - Ich hatte einen vorläufigen Patch, bevor Inkubator mit dem Update aktualisiert wurde. – Justin

0

Mann, danke dafür.War gerade dabei, meine Meinung über ein neues Projekt zu verlieren, das bereits eine Menge von Zend_Service_Twitter Calls enthielt.