如何在Yii扩展中自动加载多个类?

时间:2014-06-12 07:24:58

标签: php yii

我不确定问题的标题是否正是我想问的问题。

我想在我的Yii应用程序中使用Authorize.net。 Authorize.net有一个由多个类组成的API,为了使API工作,所有类都应该自动加载。在它的SDK中有一个名为autoload.php的文件。请注意,autoload.php不是一个类,它只包含一个函数。这是它的代码:

spl_autoload_register(function($className) {
static $classMap;

if (!isset($classMap)) {
    $classMap = require __DIR__ . DIRECTORY_SEPARATOR . 'classmap.php';
}

if (isset($classMap[$className])) {
    include $classMap[$className];
}
});

通过在我的代码中要求此文件,我可以成功地使用API​​。像:

require 'sdk-php-master/autoload.php
//I can make successful API calls after requiring autoload.php to be loaded.

但现在问题是我想在Yii中使用相同的API。我将SDK文件夹放在extensions目录中。现在我需要设置扩展路径才能在我的应用程序中使用它。现在问题是我应该在config.php中为类名设置什么才能使它工作?

我试过了:

'authorize' => array(
            'class' => 'application.extensions.authorize.autoload',
        ),

但这不起作用,因为autoload.php不是一个类,所以不应该这样。应自动加载的所有必需类都放在application.extensions.authorize.lib目录中。我应该如何在Yii中自动加载所有这些,因为根据我的知识,我们在config.php中只能有一个用于类的条目。

以下是SDK及其目录结构的链接。 Authorize.net SDK

3 个答案:

答案 0 :(得分:1)

此库使用composer,我建议你to use composer in your project来管理你的库,你就不会有自动加载的麻烦。

在根项目目录中基本创建composer.json并在其中放置授权部分(以及任何其他内容)

{
    "require": {
    "authorizenet/authorizenet": "~1.8"
    }
}

在你的主要index.php地方:

require '/path/to/vendor/autoload.php';

require $yii

之前的某个地方

然后致电composer install。简而言之,关于作曲家this guide的更多细节应该没问题。

<强>更新 当您需要一些外部库时,Composer将极大地改善您的工作流程。但是如果你真的不想使用作曲家,那么只需autoload.php中的index.php

然后在docs中使用此库类。不要将其配置为扩展名 - 此库不是Yii特定的。在任何代码部分中只需使用它,例如:

define("AUTHORIZENET_API_LOGIN_ID", "YOURLOGIN");
define("AUTHORIZENET_TRANSACTION_KEY", "YOURKEY");
$subscription                          = new AuthorizeNet_Subscription;
$subscription->name                    = "PHP Monthly Magazine";
...

答案 1 :(得分:0)

我找到了解决方法。我刚刚在config main.php中导入了所有必需的文件夹,如下所示:

 'import' => array(
        'application.extensions.*',
        'application.models.*',
        'application.components.*',
        'application.extensions.authorize.*',
        'application.extensions.authorize.lib.*',
        'application.extensions.authorize.lib.shared.*',
    ),

答案 2 :(得分:0)

您可以使用protected/config/main.php文件中的以下代码自动加载所有Authorize.net文件:

Yii::setPathOfAlias('Authorize', dirname(__FILE__).'/../extensions/sdk-php-master');
Yii::import('Authorize.autoload', true);