williamsdb
williamsdb

Reputation: 1064

Where to put Use statements for Amazon AWS SDK in Codeigniter 3

I am trying to integrate the Amazon AWS SDK for PHP into my Codeigniter 3 app. I am loading the SDK from Composer. The issue is that I can't work out where to put the use statements.

If I put them here:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

use Aws\S3\S3Client;

use Aws\Exception\AwsException;

class S3_model extends CI_Model {

  public function __construct()
  {
    parent::__construct();

    //Create a S3Client
    $s3 = new Aws\S3\S3Client([
        'profile' => 'default',
        'version' => 'latest',
        'region' => 'eu-west-1'
    ]);

I get Class 'Aws\S3\S3Client' not found.

I have Composer autoloaded:

$config['composer_autoload'] = TRUE;

And this is the contents of my autoload.php file:

/*
| -------------------------------------------------------------------
|  Auto-load Packages
| -------------------------------------------------------------------
| Prototype:
|
|  $autoload['packages'] = array(APPPATH.'third_party', '/usr/local/shared');
|
*/
$autoload['packages'] = array();

/*
| -------------------------------------------------------------------
|  Auto-load Libraries
| -------------------------------------------------------------------
| These are the classes located in system/libraries/ or your
| application/libraries/ directory, with the addition of the
| 'database' library, which is somewhat of a special case.
|
| Prototype:
|
|   $autoload['libraries'] = array('database', 'email', 'session');
|
| You can also supply an alternative library name to be assigned
| in the controller:
|
|   $autoload['libraries'] = array('user_agent' => 'ua');
*/
$autoload['libraries'] = array('database', 'smartie' => 'smarty', 'session');

/*
| -------------------------------------------------------------------
|  Auto-load Drivers
| -------------------------------------------------------------------
| These classes are located in system/libraries/ or in your
| application/libraries/ directory, but are also placed inside their
| own subdirectory and they extend the CI_Driver_Library class. They
| offer multiple interchangeable driver options.
|
| Prototype:
|
|   $autoload['drivers'] = array('cache');
|
| You can also supply an alternative property name to be assigned in
| the controller:
|
|   $autoload['drivers'] = array('cache' => 'cch');
|
*/
$autoload['drivers'] = array();

/*
| -------------------------------------------------------------------
|  Auto-load Helper Files
| -------------------------------------------------------------------
| Prototype:
|
|   $autoload['helper'] = array('url', 'file');
*/
$autoload['helper'] = array('url','utility','postrecycler');

/*
| -------------------------------------------------------------------
|  Auto-load Config files
| -------------------------------------------------------------------
| Prototype:
|
|   $autoload['config'] = array('config1', 'config2');
|
| NOTE: This item is intended for use ONLY if you have created custom
| config files.  Otherwise, leave it blank.
|
*/
$autoload['config'] = array();

/*
| -------------------------------------------------------------------
|  Auto-load Language files
| -------------------------------------------------------------------
| Prototype:
|
|   $autoload['language'] = array('lang1', 'lang2');
|
| NOTE: Do not include the "_lang" part of your file.  For example
| "codeigniter_lang.php" would be referenced as array('codeigniter');
|
*/
$autoload['language'] = array();

/*
| -------------------------------------------------------------------
|  Auto-load Models
| -------------------------------------------------------------------
| Prototype:
|
|   $autoload['model'] = array('first_model', 'second_model');
|
| You can also supply an alternative model name to be assigned
| in the controller:
|
|   $autoload['model'] = array('first_model' => 'first');
*/
$autoload['model'] = array();

Here is my composer.json

{
    "description": "The CodeIgniter framework",
    "name": "codeigniter/framework",
    "type": "project",
    "homepage": "https://codeigniter.com",
    "license": "MIT",
    "support": {
        "forum": "http://forum.codeigniter.com/",
        "wiki": "https://github.com/bcit-ci/CodeIgniter/wiki",
        "slack": "https://codeigniterchat.slack.com",
        "source": "https://github.com/bcit-ci/CodeIgniter"
    },
    "require": {
        "php": ">=5.3.7",
        "jublonet/codebird-php": "3.1",
        "phpmailer/phpmailer": "^6.0",
        "dg/rss-php": "^1.3",
        "tpyo/amazon-s3-php-class": "^0.5.1",
        "filp/whoops": "^2.4",
        "stripe/stripe-php": "^7.3",
        "aws/aws-sdk-php": "^3.133"
    },
    "suggest": {
        "paragonie/random_compat": "Provides better randomness in PHP 5.x"
    },
    "require-dev": {
        "mikey179/vfsstream": "1.1.*",
        "phpunit/phpunit": "4.* || 5.*"
    }
}

If I put them at the top of the class I get Trait 'Aws\S3\S3Client' not found.

I'm not sure where else to go! Anyone else had any success?

Upvotes: 1

Views: 1739

Answers (3)

Boominathan Elango
Boominathan Elango

Reputation: 1191

You should require autoload file where you using vendor files

 $config['composer_autoload'] = TRUE;
 require_once APPPATH.'vendor/autoload.php';

Refer this link Reference link

Upvotes: 0

williamsdb
williamsdb

Reputation: 1064

In the end I was able to get the code to work by making the change as follows:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class S3_model extends CI_Model {

  private $s3;

  public function __construct()
  {
    parent::__construct();

    //Create a S3Client
    $this->s3 = new Aws\S3\S3Client([
        'version' => 'latest',
        'region' => 'eu-west-1'
        ]);

Upvotes: 1

Priyanka Sankhala
Priyanka Sankhala

Reputation: 868

put vender inside libraries and make a library file using following source code

include("vendor/autoload.php");
//require 'vendor/aws/aws.phar';

 use Aws\S3\S3Client;

class S3
{
 private $S3;
 public function __construct()
 {
     $ci = &get_instance();
     $this->S3 = S3Client::factory($ci->config->item("aws_credentials"));
 }

 public function listBuckets()
 {
     $result = $this->S3->listBuckets();
     return $result;
 }

and put require function and use all lib function in controller

NOTE:- inside config folder there is a file s3.php its s3 configartion files insie this put the keys and bucket region.

Upvotes: 0

Related Questions