使用CakePHP 2的特征和命名空间的正确方法是什么?

时间:2014-01-28 00:50:19

标签: php cakephp namespaces traits

我正在使用CakePHP 2.4.5和PHP 5.5,并且想要使用特征。

我在Utility / VariablesTrait.php中有一个名为VariablesTrait的特征。

为了利用命名空间,我给它一个App\Utility\VariablesTrait的命名空间,因为Utility\VariablesTrait看起来有点过于全局,前者在CakePHP 3中会更好。

在我想要使用它的课程中,我在课堂上有use App\Utility\VariablesTrait;语句。对于备份,我在文件顶部还有一个App::uses('VariablesTrait', 'Utility');语句。我不确定在查找特征时是否使用了SPL自动加载器,这就是为什么我首先要使用命名空间。

小问题是app目录是app,并且由于目录结构应该匹配名称空间(我认为),我将其重命名为App。但是,CakeRequest :: _ base()硬编码app,因此确定控制器不能很好地工作。

所以,我正在尝试确定这是否是CakePHP错误,或者是否有更合适的方法在CakePHP 2中使用特征。

2 个答案:

答案 0 :(得分:1)

一种简单的方法是使用CakePHP build添加您的包文件夹,然后按您选择的名称引用它,例如:

将此添加到bootstrap.php

/**
 * Add New Package Locations
 */
App::build(['Controller/Trait' => [APP . 'Controller' . DS . 'Trait' . DS]], App::REGISTER);

然后使用它来吸引你的特质:

App::uses('TestTrait', 'Controller/Trait');

您还可以一次添加多个包文件夹,这样您可以显然执行以下操作:

/**
 * Add New Package Locations
 */
App::build(['All/Trait' => [
    APP . 'Controller' . DS . 'Trait' . DS,
    APP . 'Model' . DS . 'Trait' . DS,
    APP . 'Lib' . DS . 'Trait' . DS
]], App::REGISTER);

答案 1 :(得分:0)

我的理解是CakePHP没有自动加载。我使用以下命令导入命名空间类:

spl_autoload_register(
function ( $class )
{
    foreach ( App::path('Vendor', 'MyFile') as $base )
    {
        $path = $base . str_replace('\\', DS, $class) . '.php';
        if ( file_exists($path) )
        {
            return include $path;
        }
    }
}
);