こんにちは。ビンゴ細羽です。
FuelPHPでaws-sdk-phpを使おうと思い、ちょうどcomposer対応していてラッキー!、
と思いきや、少しハマったのでメモ。
composer.jsonにrequireとして追加してcomposer updateを実行。
1 2 3 4 5 |
{ "require": { "aws/aws-sdk-php": "2.*" } } |
1 |
$ php composer.phar update |
以上で準備が完了。
例えば、テストとして以下の様なコードを実行してみたところ、「Class AWS not found」的なエラーになりました。。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
class Hoge { public static function upload($file, $file_type, $config) { try { $s3 = Aws::factory(array( 'key' => $config['key'], 'secret' => $config['secret'], 'region' => Region::AP_NORTHEAST_1))->get('s3'); $response = $s3->putObject(array( 'Bucket' => $config['bucket'], 'Key' => 'path/to/image', 'Body' => EntityBody::factory(fopen($file, 'r')), 'ContentType' => $file_type, 'StorageClass' => 'STANDARD', 'ServerSideEncryption' => 'AES256', 'ACL' => CannedAcl::PUBLIC_READ)); return true; } catch(S3Exception $e) { \Log::error('ERROR '.$e->getMessage()); return false; } } } |
色々試行錯誤した結果、とりあえず以下のようにbootstrap.phpで、
Awsのnamespaceを追加することで動くようにはなりました。
1 2 |
// fuel/app/bootstrap.php に以下の行を追加 Autoloader::add_namespace('Aws', APPPATH.'vendor/aws/aws-sdk-php/src/Aws', true); |
使う側ではuseしておくと便利。
1 2 3 4 5 6 7 8 9 10 |
use Aws\Common\Aws; use Aws\Common\Enum\Region; use Aws\S3\Enum\CannedAcl; use Aws\S3\Exception\S3Exception; use Guzzle\Http\EntityBody; class Hoge { // 長いので中身は割愛。。。 } |
この辺りはcomposerのautoloadが上手いことやってくれると盲信していたので、
突然の名前解決エラーはハマりました。。
もっとちゃんとした解決が求められている気がするので、autoloaderを正しく理解しなければ。