Issue Details (XML | Word | Printable)

Key: ZF-5791
Type: Improvement Improvement
Status: Closed Closed
Resolution: Fixed
Priority: Minor Minor
Assignee: Jon Whitcraft
Reporter: Jon Whitcraft
Votes: 0
Watchers: 0
Operations

If you were logged in you would be able to see more operations.
Google issue summary
Zend Framework

Create an abstract class for use with the Amazon Web Servies.

Created: 15/Feb/09 08:12 AM   Updated: 13/Dec/09 08:55 AM   Resolved: 07/Apr/09 05:59 PM
Component/s: Zend_Service_Amazon
Affects Version/s: None
Fix Version/s: 1.8.0

Time Tracking:
Not Specified

File Attachments: 1. Zip Archive AmazonAbstractClass.zip (3 kB)

Issue Links:
Related
 


 Description  « Hide

Create an abstract class to set a standard way for to handle the access and secret keys with all the AWS components.

AbstractClass
<?php

require_once 'Zend/Service/Abstract.php';

abstract class Zend_Service_Amazon_Abstract extends Zend_Service_Abstract
{
    /**
     * @var string Amazon Access Key
     */
    protected static $defaultAccessKey = null;

    /**
     * @var string Amazon Secret Key
     */
    protected static $defaultSecretKey = null;

    /**
     * @var string Amazon Secret Key
     */
    protected $secretKey;

    /**
     * @var string Amazon Access Key
     */
    protected $accessKey;

    /**
     * Set the keys to use when accessing SQS.
     *
     * @param  string $access_key
     * @param  string $secret_key
     * @return void
     */
    public static function setKeys($accessKey, $secretKey)
    {
        self::$defaultAccessKey = $accessKey;
        self::$defaultSecretKey = $secretKey;
    }

    /**
     * Create Amazon Sqs client.
     *
     * @param  string $access_key
     * @param  string $secret_key
     * @return void
     */
    public function __construct($accessKey=null, $secretKey=null)
    {
        if(!$accessKey) {
            $accessKey = self::$defaultAccessKey;
        }
        if(!$secretKey) {
            $secretKey = self::$defaultSecretKey;
        }
        if(!$accessKey || !$secretKey) {
            require_once 'Zend/Service/Amazon/Exception.php';
            throw new Zend_Service_Amazon_Exception("AWS keys were not supplied");
        }
        $this->accessKey = $accessKey;
        $this->secretKey = $secretKey;
    }

    /**
     * Method to fetch the Access Key
     *
     * @return string
     */
    protected function getAccessKey()
    {
        return $this->accessKey;
    }

    /**
     * Method to fetch the Secret AWS Key
     *
     * @return string
     */
    protected function getSecretKey()
    {
        return $this->secretKey;
    }
}
TestCase
<?php

require_once 'Zend/Service/Amazon/Abstract.php';

require_once 'PHPUnit/Framework/TestCase.php';

/**
 * Zend_Service_Amazon_Sqs_Queue test case.
 */
class AmamzonAbstract extends PHPUnit_Framework_TestCase
{
    /**
     * Prepares the environment before running a test.
     */
    protected function setUp()
    {
        parent::setUp();
    }

    /**
     * Cleans up the environment after running a test.
     */
    protected function tearDown()
    {
        parent::tearDown();
    }

    public function testNoKeysThrowException()
    {
        try {
            $class = new TestAmamzonAbstract();
            $this->fail('Exception should be thrown when no keys are passed in.');
        } catch(Zend_Service_Amazon_Exception $zsae) {}
    }

    public function testConstructorWithKeysDoesNotThrowException()
    {
        try {
            $class = new TestAmamzonAbstract('TestAccessKey', 'TestSecretKey');
        } catch(Zend_Service_Amazon_Exception $zsae) {
            $this->fail('Exception should be thrown when no keys are passed in.');
        }
    }

    public function testSetStaticKeys()
    {
        TestAmamzonAbstract::setKeys('TestAccessKey', 'TestSecretKey');
        $class = new TestAmamzonAbstract();

        $this->assertEquals('TestAccessKey', $class->returnAccessKey());
        $this->assertEquals('TestSecretKey', $class->returnSecretKey());
    }

    public function testPassKeysIntoConstructor()
    {
        $class = new TestAmamzonAbstract('TestAccessKey', 'TestSecretKey');

        $this->assertEquals('TestAccessKey', $class->returnAccessKey());
        $this->assertEquals('TestSecretKey', $class->returnSecretKey());
    }

    public function testPassedInKeysOverrideStaticSetKeys()
    {
        TestAmamzonAbstract::setKeys('TestStaticAccessKey', 'TestStaticSecretKey');
        $class = new TestAmamzonAbstract('TestAccessKey', 'TestSecretKey');

        $this->assertEquals('TestAccessKey', $class->returnAccessKey());
        $this->assertEquals('TestSecretKey', $class->returnSecretKey());
    }
}

class TestAmamzonAbstract extends Zend_Service_Amazon_Abstract
{
    public function returnAccessKey()
    {
        return $this->accessKey;
    }

    public function returnSecretKey()
    {
        return $this->secretKey;
    }
}


Jon Whitcraft added a comment - 15/Feb/09 08:13 AM

Abstract Class for use with Amazon Aws Services.


Jon Whitcraft added a comment - 15/Feb/09 08:14 AM

Test case for the attached class.


Jon Whitcraft added a comment - 15/Feb/09 09:21 AM

Removed the files and made the code inline.


Jon Whitcraft added a comment - 15/Feb/09 09:23 AM

Zip file for easy download.


Ralph Schindler added a comment - 23/Feb/09 02:04 PM

The use of statics for the access and secret key imply that you cannot use more than one amazon account per request, is that by design?

-ralph


Jon Whitcraft added a comment - 23/Feb/09 04:51 PM

Ralph - Yes that is correct. This can easily be changed..

Jon


Jon Whitcraft added a comment - 11/Mar/09 01:30 PM - edited

Ralph

If you look at the _construct method you will notice that if you don't specify a key or secret key it will use the static keys. The static properties are a way to have default keys set so you don't need to provide the keys everytime you create a new instance but you can if you need to specify new keys.

Jon


Jon Whitcraft added a comment - 07/Apr/09 05:59 PM

This got checked in with the Ec2 Component.