【问题标题】:How to autoload multiple classes in Yii extension?如何在 Yii 扩展中自动加载多个类?
【发布时间】:2014-06-12 07:24:57
【问题描述】:

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

我想在我的 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.

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

我试过这个:

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

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

这里是 SDK 及其目录结构的链接。 Authorize.net SDK

【问题讨论】:

    标签: php yii


    【解决方案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 将大大改善您的工作流程。但是,如果您真的不想使用 composer,那么只需在 index.php 中要求 autoload.php

    然后像在文档中一样使用这个库类。不要将它配置为扩展 - 这个库不是 Yii 特定的。在任何代码部分都可以使用它,例如:

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

    【讨论】:

    • 非常感谢您的回答。在不使用作曲家的情况下还有其他方法吗?
    • 我更新了答案,也许现在会更清楚:)
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-20
        • 2023-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-26
        • 1970-01-01
        相关资源
        最近更新 更多