Я использую 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
. Тем не менее, приложение CakeRequest :: _ base () hardcodes, поэтому определение контроллера не так хорошо работает.
Итак, я пытаюсь определить, является ли это ошибкой CakePHP, или если есть более подходящий способ использования признаков в CakePHP 2.
Легкий способ сделать это – использовать 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);
Я понимаю, что 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; } } } );