Yii 控制台应用程序 - Class 'Guzzle\Http\Client' 未找到

Yii console app - Class 'Guzzle\Http\Client' not found

我的配置:

/trunk/common/extensions/Api/Api.php

/trunk/vendor/guzzle

网络应用配置:/trunk/members/config/main.php

...
'components' => array(
        'api' => array(
            'class' => 'common.extensions.Api.Api'
        )
        ...
)
...

控制台配置:/trunk/console/config/main.php

...
'components' => array(
        'api' => array(
            'class' => 'common.extensions.Api.Api'
        )
        ...
)
...

Client.php

命名空间Guzzle\Http;


Guzzle 是通过 composer 安装的。

当我 运行 通过 webapp 请求 API 时,一切正常

当我通过控制台应用 运行 API 时,抛出以下错误 PHP 致命错误:Class 'Guzzle\Http\Client' 未在 /var/www/core/trunk/common/extensions/Api/Api.php 的第 20 行

中找到

知道下一步该怎么做吗?任何帮助表示赞赏!提前致谢!

首先,验证文件 Guzzle/Http/Client.php 是否存在(我想是的,因为您可以在 webapp 中使用扩展名)。

其次,在控制器 class 文件的开头,插入以下行:

Yii::import('application.vendors.*');
require_once('Guzzle/Http/Client.php');

使用带命名空间的第 3 方库

为了使用遵循 PSR-0 的命名空间库(例如 Zend Framework 2 或 Symfony2),您需要将其根注册为路径别名。

Yii::setPathOfAlias('Guzzle',Yii::getPathOfAlias('application.vendors.Guzzle'));

在上面的代码中,我们定义的别名名称应与库中使用的第一个命名空间部分相匹配。

如果这一切都不起作用,它可能是控制台应用程序的一个非常奇怪的 Yii 错误的参考(也有同样的问题):

Larry Ullmans 论坛中的问题:

http://www.larryullman.com/forums/index.php?/topic/3392-console-application-php-fatal-error-cannot-redeclare-class/

我的问题: Using box/spout 3rd party library in Yii application command

使用第 3 方自动加载器

一些 3rd-Party 库(例如 PHPUnit)使用它们自己的 class 自动加载器,它们按规则执行 class 文件包含,这与 Yii 自动加载器中使用的不同。

为了避免此类问题,请确保在 Yii 自动加载器之前注册任何第 3 方 class 自动加载器。

require_once('vendor/autoload.php'); // register 3rd-party autoloader
require_once('/path/to/framework/yii.php'); // register Yii autoloader

如果第 3 方 class 自动加载器作为单独的函数或方法出现,您可以使用 Yii::registerAutoloader() 方法来注册它。在这种情况下,Yii 会自动将它放在自己的自动加载器之前。

require_once('/path/to/framework/yii.php'); // register Yii autoloader
...
Yii::registerAutoloader(array('SomeLibrary','autoload')); // register 3rd-party autoloader
...

(c) source

找到解决方案:

Api.php

require 'vendor/autoload.php'; // <-- I had to include this line so the class to be loaded
use Guzzle\Http\Client;