我正在使用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中使用特征。
答案 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;
}
}
}
);