繁体   English   中英

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

[英]What's the correct method for using Traits and Namespaces for CakePHP 2?

我正在使用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中使用特征。

一个简单的方法是使用CakePHP 构建来添加你的包文件夹,然后只需用你选择的名称来引用它,例如:

将其添加到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);

我的理解是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;
        }
    }
}
);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM