3.9.2 Um Exemplo
Aqui está um exemplo simples de como usar DataSources e o HttpSocket para implementar um datasource muito básico para o Twitter, que lhe permita consultar a Twitter API bem como submeter novas atualizações de status para uma conta configurada.
Este exemplo só irá funcionar nas versões de PHP 5.2 e superior, em virtude do uso de json_decode para processamento dos dados no formato JSON.
Você deve salvar o datasource do Twitter em app/models/datasources/twitter_source.php:
<?php
/**
* Twitter DataSource
*
* Usado para ler e escrever no Twitter, atravé dos models.
*
* PHP Version 5.x
*
* CakePHP(tm) : Rapid Development Framework (http://www.cakephp.org)
* Copyright 2005-2009, Cake Software Foundation, Inc. (http://www.cakefoundation.org)
*
* Disponibilizado sob licença MIT.
* Redistribuições dos arquivos devem manter a nota de copyright acima.
*
* @filesource
* @copyright Copyright 2009, Cake Software Foundation, Inc. (http://www.cakefoundation.org)
* @link http://cakephp.org Projeto CakePHP(tm)
* @license http://www.opensource.org/licenses/mit-license.php A licença MIT
*/
App::import('Core', 'HttpSocket');
class TwitterSource extends DataSource {
protected $_schema = array(
'tweets' => array(
'id' => array(
'type' => 'integer',
'null' => true,
'key' => 'primary',
'length' => 11,
),
'text' => array(
'type' => 'string',
'null' => true,
'key' => 'primary',
'length' => 140
),
'status' => array(
'type' => 'string',
'null' => true,
'key' => 'primary',
'length' => 140
),
)
);
public function __construct($config) {
$auth = "{$config['login']}:{$config['password']}";
$this->connection = new HttpSocket(
"http://{$auth}@twitter.com/"
);
parent::__construct($config);
}
public function listSources() {
return array('tweets');
}
public function read($model, $queryData = array()) {
if (!isset($queryData['conditions']['username'])) {
$queryData['conditions']['username'] = $this->config['login'];
}
$url = "/statuses/user_timeline/";
$url .= "{$queryData['conditions']['username']}.json";
$response = json_decode($this->connection->get($url), true);
$results = array();
foreach ($response as $record) {
$record = array('Tweet' => $record);
$record['User'] = $record['Tweet']['user'];
unset($record['Tweet']['user']);
$results[] = $record;
}
return $results;
}
public function create($model, $fields = array(), $values = array()) {
$data = array_combine($fields, $values);
$result = $this->connection->post('/statuses/update.json', $data);
$result = json_decode($result, true);
if (isset($result['id']) && is_numeric($result['id'])) {
$model->setInsertId($result['id']);
return true;
}
return false;
}
public function describe($model) {
return $this->_schema['tweets'];
}
}
?>
<?php/*** Twitter DataSource** Usado para ler e escrever no Twitter, atravé dos models.** PHP Version 5.x** CakePHP(tm) : Rapid Development Framework (http://www.cakephp.org)* Copyright 2005-2009, Cake Software Foundation, Inc. (http://www.cakefoundation.org)** Disponibilizado sob licença MIT.* Redistribuições dos arquivos devem manter a nota de copyright acima.** @filesource* @copyright Copyright 2009, Cake Software Foundation, Inc. (http://www.cakefoundation.org)* @link http://cakephp.org Projeto CakePHP(tm)* @license http://www.opensource.org/licenses/mit-license.php A licença MIT*/App::import('Core', 'HttpSocket');class TwitterSource extends DataSource {protected $_schema = array('tweets' => array('id' => array('type' => 'integer','null' => true,'key' => 'primary','length' => 11,),'text' => array('type' => 'string','null' => true,'key' => 'primary','length' => 140),'status' => array('type' => 'string','null' => true,'key' => 'primary','length' => 140),));public function __construct($config) {$auth = "{$config['login']}:{$config['password']}";$this->connection = new HttpSocket("http://{$auth}@twitter.com/");parent::__construct($config);}public function listSources() {return array('tweets');}public function read($model, $queryData = array()) {if (!isset($queryData['conditions']['username'])) {$queryData['conditions']['username'] = $this->config['login'];}$url = "/statuses/user_timeline/";$url .= "{$queryData['conditions']['username']}.json";$response = json_decode($this->connection->get($url), true);$results = array();foreach ($response as $record) {$record = array('Tweet' => $record);$record['User'] = $record['Tweet']['user'];unset($record['Tweet']['user']);$results[] = $record;}return $results;}public function create($model, $fields = array(), $values = array()) {$data = array_combine($fields, $values);$result = $this->connection->post('/statuses/update.json', $data);$result = json_decode($result, true);if (isset($result['id']) && is_numeric($result['id'])) {$model->setInsertId($result['id']);return true;}return false;}public function describe($model) {return $this->_schema['tweets'];}}?>
A implementaçāo de seu model pode ser tāo simples quanto isto:
<?php
class Tweet extends AppModel {
public $useDbConfig = 'twitter';
}
?>
<?phpclass Tweet extends AppModel {public $useDbConfig = 'twitter';}?>
Se o esquema nāo tiver sido definido no próprio datasource, você vai receber uma mensagem de erro neste ponto.
E as opções de configuraçāo em seu arquivo app/config/database.php devem ser algo parecido com:
<?php var $twitter = array( 'datasource' => 'twitter', 'login' => 'username', 'password' => 'password', ); ?>
<?phpvar $twitter = array('datasource' => 'twitter','login' => 'username','password' => 'password',);?>
Usando os conhecidos métodos de model a partir do controller:
<?php
// Isto irá usar o usuário definido na configuraçāo $twitter como mostrado acima:
$tweets = $this->Tweet->find('all');
// Encontra os tweets de outro usuário
$conditions= array('username' => 'caketest');
$otherTweets = $this->Tweet->find('all', compact('conditions'));
?>
<?php// Isto irá usar o usuário definido na configuraçāo $twitter como mostrado acima:$tweets = $this->Tweet->find('all');// Encontra os tweets de outro usuário$conditions= array('username' => 'caketest');$otherTweets = $this->Tweet->find('all', compact('conditions'));?>
De forma semelhante, pode-se salvar um novo registro de status:
<?php
$this->Tweet->save(array('status' => 'Esta é uma atualzaçāo'));
?>
<?php$this->Tweet->save(array('status' => 'Esta é uma atualzaçāo'));?>


























