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 论坛中的问题:
我的问题:
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
...
找到解决方案:
Api.php
require 'vendor/autoload.php'; // <-- I had to include this line so the class to be loaded
use Guzzle\Http\Client;
我的配置:
/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 论坛中的问题:
我的问题: 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
...
找到解决方案:
Api.php
require 'vendor/autoload.php'; // <-- I had to include this line so the class to be loaded
use Guzzle\Http\Client;