Как расширить классы фреймворка Yii и где разместить файлы
Я хочу расширить некоторые встроенные каркасные классы, но есть некоторые моменты, которые мне не совсем ясны:
- Я полагаю, что я должен поместить мои классы в папку компонентов, это правильное место?
- Должен ли я назвать классы как
Subfolder_ClassName
и файлы какClassName.php
? - Как я наследую? Пути включения по умолчанию не включают саму платформу. Я предполагаю, что есть встроенный способ сделать это без того, чтобы я изменил путь включения / начать играть с функцией автозагрузки или просто жестким кодом включения в моем коде.
Правильно?
2 ответа
Размещение исходных файлов
Положить их под /protected/components
это естественный выбор. Если позже вы разработаете более общие классы, которые можно будет повторно использовать в разных проектах, вы можете подумать о том, чтобы поместить их в отдельный каталог.
Наименование и структура каталогов
Это будет зависеть от масштаба вашего приложения. Если у вас нет много компонентов (скажем, под 20), то ИМХО вам не нужна структура каталогов, components
каталог хорош для всех из них. Другой практический подход - поместить ваши бизнес-компоненты в один каталог, а ваши HTML-компоненты - в другой (например, widgets
).
Включая родительские классы
Ваш конфигурационный файл должен иметь такой раздел:
// autoloading model and component classes
'import'=>array(
'application.models.activerecord.*',
'application.models.forms.*',
'application.components.*',
'application.classes.*',
// etc
),
Этот раздел на самом деле приводит к CModule::setImport
вызывается в вашем приложении для регистрации классов, которые могут быть автоматически загружены. Если вы хотите расширить эти классы, вам не нужно ничего делать.
Если некоторые из ваших компонентов зависят от классов Yii, которые не импортируются, как указано выше, вам необходимо явно импортировать их, используя Yiibase::import
прежде чем объявить свой класс. Например:
Yii::import('zii.widgets.jui.CJuiSlider');
class MySlider extends CJuiSlider {
// class contents here
}
Регистрация псевдонимов для путей
Если вы хотите создать свои собственные псевдонимы для путей импорта (например, чтобы иметь путь myapp.components
вы можете ссылаться при импорте классов), вы можете сделать это с помощью Yiibase::setPathOfAlias
, Хорошим местом для этого является самый верх вашего файла конфигурации:
<?php
Yii::setPathOfAlias('myapp.components','components/my/');
// This is the main Web application configuration. Any writable
// CWebApplication properties can be configured here.
return array(
// your whole app configuration is here, and you can now do this:
'import'=>array(
// ...other imports...
'myapp.components.*',
// ...other imports...
),
);
Если вы хотите создать дочерний класс в yii-Framework, вы можете поместить файл определения класса в project/protected/components
, Зависит от лучших практик, которые вы хотите использовать (т.е. будете ли вы создавать десятки пользовательских классов по сравнению с одним или двумя, которые расширяют классы FW), но размещение вашего файла непосредственно в компонентах должно быть приемлемым с точки зрения организации.
Для наследования вы можете просто создать свой файл по следующим направлениям:
class MyNewClass extends CFrameworkClass
{
//All your stuff
}
Обратите внимание, что по соглашению классы фреймворка yii имеют "C" перед ними (то есть CController), я не добавляю "C" туда (CFramwork..) по любой другой причине, кроме соблюдения соглашения.