如何导入/使用带有命名空间

时间:2015-08-14 07:56:25

标签: cakephp cakephp-2.0

我已经在这里待了几天了。看起来像是世界上最简单的事情,但对于我的生活,我无法让它发挥作用。

我想在我的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::usesApp::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仍然说找不到类。

如何加载命名空间供应商文件?

3 个答案:

答案 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()
);