Kohana bit.ly – Czyli piszemy własny moduł

Kohana bit.ly – Czyli piszemy własny moduł

Written by sbl

Topics: Kohana 3

W raz z potrzebą użycia skracacza linków postanowiłem napisać malutki moduł do Kohana Framework (KO3). Zasada jego działania jest bardzo prosta, wypełniamy plik konfiguracyjny o login i API key i możemy w bardzo łatwy sposób generować skrócone linki z serwisu bit.ly

Na wstępie przedstawię budowę tego modułu.
Poniżej przedstawiam składnię każdego z plików.

Plik konfiguracyjny: (należy go skopiować do /application/config/bitly.php)

<?php defined('SYSPATH') or die('No direct script access.');
//File: /modules/bitly/config/bitly.php
return array(
        'default' => array(
		'username'        => 'yourlogin', // The bit.ly username
		'api_key'         => 'your_api_key', // Your bit.ly API key
		'type'            => 'json', // type of receive (json/xml)
		'version'         => '2.0.1', // API version
	),
);

Budowy powyższego pliku chyba wyjaśniać nie trzeba, wygląda on jak standardowa tablica pliku konfiguracyjnego w Kohana 3. Do wypełnienia są 4 atrybuty tj, username (login w serwisie bit.ly), api_key (klik), type (czyli rodzaj odpowiedzi od serwera API, do wyboru mamy dane w JSON oraz XML), version (wersja API).

Klasa dziedzicząca po Kohana_Bitly (którą za chwilę utworzymy)

<?php defined('SYSPATH') or die('No direct script access.');

      //File: /modules/bitly/classes/bitly.php

      class Bitly extends Kohana_Bitly {}

W tym pliku mamy jedynie definicję klasy Bitly oraz rozszerzenie jej o klasę Kohana_Bitly, która zostanie za chwilę stworzona w folderze „kohana” w katalogu naszego modelu.

Najważniejsza klasa modułu Kohana_Bitly

<?php defined('SYSPATH') or die('No direct script access.');
/**
 *
 * @see        http://bit.ly
 * @package    Kohana
 * @category   Bitly
 * @version    1.0
 * @author     www.sibul.linux.pl (sbl)
 * @copyright  (c) 2011 www.sibul.linux.pl (sbl)
 * @license    GNU/GPL
 */
//File: /modules/bitly/classes/kohana/bitly.php
class Kohana_Bitly {

	static protected $_instances = array();

	public static function instance($config = NULL)
	{
		// Create an instance checksum
		$config_checksum = sha1(serialize($config));

		// Load the Bitly instance for configuration
		if ( ! isset(self::$_instances[$config_checksum]))
		{
			self::$_instances[$config_checksum] = new Bitly($config);
		}

		// Return a the instance
		return self::$_instances[$config_checksum];
	}

	protected $_config;

	public $attributes = array();

	public $url;

    public $login;

    public $type;

    public $api_key;

    public $version;

	protected function __construct($url, $config = NULL)
	{
		// Set the URL
		$this->url = $url;

		if (empty($config))
		{
			$this->_config = Kohana::config('bitly.default'); //set the config
		}
		elseif (is_array($config))
		{
			// Setup the configuration
			$config += Kohana::config('bitly.default');
			$this->_config = $config;
		}
		elseif (is_string($config))
		{
			if ($config = Kohana::config('bitly.'.$config) === NULL)
			{
				throw new Kohana_Bitly_Exception('Bitly.__construct() , Invalid configuration group name : :config', array(':config' => $config));
			}

			$this->_config = $config + Kohana::config('bitly.default');
		}
	}

    public function short($url){

        $this->login    = $this->_config['username'];
        $this->type     = strtolower($this->_config['type']);
        $this->api_key  = $this->_config['api_key'];
        $this->version  = $this->_config['version'];

        $api_url = 'http://api.bit.ly/shorten?version='.$this->version.'&longUrl='.urlencode($url).'&login='.$this->login.'&apiKey='.$this->api_key.'&format='.$this->type;

	   $response = file_get_contents($api_url);

        switch($this->type){
            case "xml":
                $xml = simplexml_load_string($response);
                return 'http://bit.ly/'.$xml->results->nodeKeyVal->hash;
            break;

            case "json":
                $json = @json_decode($response,true);
                return $json['results'][$url]['shortUrl'];
            break;
    }
    }

}

Powyższa klasa zawiera 3 funkcje, w prawdzie mówiąc jedyną funkcją która skraca link jest „short” reszta to instancja klasy oraz konstruktor, który wczytuje plik konfiguracyjny i jego dane.

Mamy jeszcze jeden plik o nazwie exception.php, który dziedziczy po klasie Kohana_Exception obsługę wyjątków. Jego składnia jest bardzo prosta:

<?php defined('SYSPATH') or die('No direct script access.');
//File: /modules/bitly/classes/kohana/bitly/exception.php

class Kohana_Bitly_Exception extends Kohana_Exception { }

Musimy pamiętać by włączyć nasz nowo utworzony moduł w pliku bootstrap.php dodając nazwę z naszym modułem:

Kohana::modules(array(
	 'auth'       => MODPATH.'auth',       // Basic authentication
	 'cache'      => MODPATH.'cache',      // Caching with multiple backends
	 'database'   => MODPATH.'database',   // Database access
	 'image'      => MODPATH.'image',      // Image manipulation
	 'orm'        => MODPATH.'orm',        // Object Relationship Mapping
         'bitly'      => MODPATH.'bitly',
	));

Ostatnim krokiem jest uruchomienie kontrolera z naszym modułem by przetestować jego działanie.

Budowa kontrolera:

Dla przykładu stwórzmy kontroler dziedziczący po Controller o nazwie test (application/classes/controller/test.php) o następującej zawartości:

<?php defined('SYSPATH') or die('No direct script access.');

class Controller_Test extends Controller{

    public function action_index(){
        $url = 'http://sibul.linux.pl';
        $bitly = Bitly::instance();
        echo $bitly->short($url); // następuje wykonanie funkcji short z modułu Bitly, która pobiera skrócony adres z serwera API.
        //return http://bit.ly/gsVR1O
    }

}

Takim sposobem powstał prosty moduł ułatwiający pracę programiście poprzez skracanie linków za pomocą serwisu www.bit.ly

Pobierz paczkę z modułem