我已经在这里待了几天了。看起来像是世界上最简单的事情,但对于我的生活,我无法让它发挥作用。
我想在我的Controller中使用这个类:
https://github.com/neitanod/forceutf8
该类名为Encoding.php,它有一个名称空间ForceUTF8。
我已经尝试了以下所有方法:
App::uses('Encoding','Vendor'); //(copying Encoding.php directly in the Vendor dir)
App::uses('Encoding','Vendor/ForceUTF8'); //(copying Encoding.php in ForceUTF8 subdir)
App::uses('Encoding’,’Lib'); //(copying Encoding.php directly in the Lib dir)
App::uses('Encoding’,’Lib/ForceUTF8'); //(copying Encoding.php in ForceUTF8 subdir)
require_once(APP . 'Vendor' . DS . 'Encoding.php'); //(use plain old php require_once to load class from Vendor dir)
无论我做什么,我都会得到同样的错误:Class' Encoding'没找到。
我发现CakePHP文档在这个问题上非常混乱。一方面它说不使用App::uses
用于非CakePHP类,因为这些类可能不遵循CakePHP标准。很公平。相反,他们说使用App::import
。但是有很多帖子说App::import
只不过是require_once的包装。
因此,在无法让App::uses
或App::import
工作后,我尝试了require_once
。同样的错误。然后我在这里发现了一条帖子,所以即使使用require_once
,你仍然需要初始化'该类为了使CakePHP能够看到/使用它。那怎么办? App::uses
。所以我回到了我开始的地方。
有些东西告诉我命名空间导致问题。当我使用require_once
时,找到 类(我非常肯定)因为,例如,如果我改变了
require_once(APP . 'Vendor' . DS . 'Encoding.php');
到
require_once(APP . 'Vendor' . DS . 'blabla.php');
它给我一个错误,找不到文件。
但即使require_once
似乎找到它,CakePHP仍然说找不到类。
如何加载命名空间供应商文件?
答案 0 :(得分:2)
在Cakephp 2.x中,请按照以下步骤进行操作
在类文件顶部添加
将\ Dropbox用作dbx;
[我的案例中Dropbox是供应商目录]
use \Dropbox as dbx;
App::build(array('Vendor/Dropbox' => array('%s' . 'Dropbox' . DS)), App::REGISTER);
// Autoload the classes in the 'vendors'
spl_autoload_register(function ($class) {
foreach (App::path('Vendor') as $base) {
$path = $base . str_replace('\\', DS, $class) . '.php';
if (file_exists($path)) {
include $path;
return;
}
}
});
现在调用你的类方法。
答案 1 :(得分:1)
Cake2.x不支持名称空间,因此您需要编写自己的加载程序
spl_autoload_register(function ($class) {
foreach (App::path('Vendor') as $base) {
$path = $base . str_replace('\\', DS, $class) . '.php';
if (file_exists($path)) {
include $path;
return;
}
}
});
更多信息:
http://www.dereuromark.de/2012/08/06/namespaces-in-vendor-files-and-cake2-x/
答案 2 :(得分:0)
基于这篇文章: http://www.dereuromark.de/2012/08/06/namespaces-in-vendor-files-and-cake2-x/comment-page-1
我使用的是paypal sdk。这是我的代码。
在bootstrap.php中:
// Add 'vendors' as sub-package of 'Vendor' to the application
App::build(array('Vendor/vendors' => array('%s' . 'vendors' . DS)), App::REGISTER);
// Autoload the classes in the 'vendors'
spl_autoload_register(function ($class) {
foreach (App::path('Vendor/vendors') as $base) {
$path = $base . str_replace('\\', DS, $class) . '.php';
if (file_exists($path)) {
include $path;
return;
}
}
});
在PaypalComponent中:
use PayPal\Rest\ApiContext;
use PayPal\Auth\OAuthTokenCredential;
在函数中使用这些类:
$this->apiContext = new ApiContext(
new OAuthTokenCredential()
);