[英]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.