【问题标题】:Creating A Class That wraps AWS SDK创建一个包装 AWS 开发工具包的类
【发布时间】:2021-10-29 12:23:35
【问题描述】:

我正在使用 AWS PHP 开发工具包。通常,我会在我的程序中做这样的事情:

require '/aws_sdk/aws-autoloader.php';
use Aws\Rds\RdsClient; 
use Aws\Ec2\Ec2Client;
use Aws\Exception\AwsException;

try {
    $ec2Client = new Aws\Ec2\Ec2Client([
        'version' => 'latest',
        'region' => 'us-west-1,
        'profile' => 'default'
    ]); 
} catch (Ec2Exception $ex) {
    pretty_echo($ex->getMessage());
}

我想做的是编写一个使用 Aws\Rds\RdsClient、Aws\Ec2\Ec2Client 和 Aws\Exception\AwsException 的类。

以下是我的命名空间(esd_aws_sdk.php):

<?php

namespace Esd\AwsSdk;
require PHP_BASE.'/aws_sdk/aws-autoloader.php';
use Aws\Rds\RdsClient; 
use Aws\Ec2\Ec2Client;
use Aws\Exception\AwsException;

class Clients
{  
    public $region;
    public $profile;
    public $Ec2Client = FALSE;
    public $RdsClient = FALSE;
    
    function __construct($region, $profile) {
        $this->region = $region;
        $this->profile = $profile;
        $this->createAwsClients();
    }
    
    private function createAwsClients()
    {
        {
            try {
                $this->Ec2Client = new Aws\Ec2\Ec2Client([
                    'version' => 'latest',
                    'region' => $this->region,
                    'profile' => $this->profile
                ]); 
            } catch (Ec2Exception $ex) {
                echo($ex->getMessage());
            }
        }    
        try {
            $this->RdsClient = new Aws\Rds\RdsClient([
                'version' => 'latest',
                'region' => $this->region,
                'profile' => $this->profile
            ]);    
        } catch (RdsException $ex) {
            echo($ex->getMessage());
        }        
    }
}

以及测试程序:test.php

<?php

SetPaths();
include_once 'aws_sdk.php';
use Esd\AwsSdk;

$AwsClients = new Esd\AwsSdk\Clients('us-east-1', 'airtable');

function SetPaths()
{
    $ds = DIRECTORY_SEPARATOR;
    $dir = explode($ds, __DIR__);
    $dir_last_key = count($dir) - 1;
    unset($dir[$dir_last_key]);
    $app_root = implode($ds, $dir);
    define('APP_CODE',$app_root.$ds.'code'.$ds);
    define('APP_INCLUDE',$app_root.$ds.'include'.$ds);
    define('APP_DATA',$app_root.$ds.'data'.$ds);
    define('APP_LOG',$app_root.$ds.'log'.$ds);
    unset($dir[$dir_last_key - ($depth + 1)]);
    define('SECTION_COMMON',implode($ds, $dir).$ds.'common'.$ds);
    unset($dir[$dir_last_key - ($depth +2)]);
    define('PHP_BASE',implode($ds, $dir).$ds);    
}

但是当我运行 test.php 时,我得到以下信息:

Fatal error: Uncaught Error: Class 'Esd\AwsSdk\Aws\Ec2\Ec2Client' not found in /Users/esd-mac/php/aws/aws/code/aws_sdk.php:26 
Stack trace: #0 /Users/esd-mac/php/aws/aws/code/aws_sdk.php(19): Esd\AwsSdk\Clients->createAwsClients() #1 /Users/esd-mac/php/aws/aws/code/test.php(7): Esd\AwsSdk\Clients->__construct('us-east-1', 'airtable') #2 {main} thrown in /Users/esd-mac/php/aws/aws/code/aws_sdk.php on line 26

有什么想法吗?

【问题讨论】:

    标签: php aws-sdk aws-php-sdk


    【解决方案1】:

    粗糙。不过,回到基础,PHP 解析器似乎并不认为它可以找到您所布置的类文件。我认为我们需要了解更多信息才能从中得到一个好的答案,但是我会尝试一些故障排除步骤:

    1. 您使用的类成员名称与您的类名称 ($this->Ec2Client = new Aws\Ec2\Ec2Client) 相同,这使您的调试工作变得更加困难。即使只是在您构建时,我也会更改为$this-&gt;computeClient = Ec2Client
    2. 很难判断您的 Use 语句是否正确工作,尤其是当您在 new 调用中调用整个命名空间时。我会将 Use 语句更改为 Use Aws\Ec2\Ec2Client as Ec2Client; 之类的内容,以便您可以说 = new Ec2Client。此时您的错误看起来会更有意义,因为它们会告诉您 Ec2Client 是否意味着任何东西(并验证 Use 语句是否具有正确的路径)
    3. 如果我不得不猜测,PHP 认为您正在尝试访问 Esd/AwsSdk 命名空间内的 Aws\Ec2\Ec2Client。尝试添加前导斜杠以通知 PHP 您正在从根加载 (\Aws\Ec2\Ec2Client)

    【讨论】:

    • 当我创建每个客户端时,我需要添加一个前导斜杠以通知 PHP 我正在从根 (\Aws\Ec2\Ec2Client) 和 (\Aws\Rds\RdsClient) 加载
    猜你喜欢
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 2018-05-20
    • 2019-05-04
    • 2017-09-17
    • 2015-10-17
    • 2011-11-10
    • 2012-05-24
    相关资源
    最近更新 更多