Как расширить классы фреймворка Yii и где разместить файлы

Я хочу расширить некоторые встроенные классы фреймворка, но есть некоторые моменты, о которых я не знаю:

  1. Я предполагаю, что я должен поместить свои классы в папку с компонентами, это правильное место?
  2. Должен ли я называть классы как Subfolder_ClassName и файлы как ClassName.php?
  3. Как мне унаследовать? Пути включения по умолчанию не включают сам фреймворк. Я предполагаю, что есть встроенный способ сделать это без изменения пути включения / начала воспроизведения с функцией автозагрузки или просто жесткого кода, включаемого в мой код.

Верно?


person Itay Moav -Malimovka    schedule 17.09.2011    source источник


Ответы (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...
   ),
);
person Jon    schedule 17.09.2011

Если вы хотите создать дочерний класс класса в yii-Framework, да, вы можете поместить файл определения класса в project/protected/components. Зависит от лучших практик, которые вы хотите использовать (например, будете ли вы создавать десятки пользовательских классов вместо одного или двух, которые расширяют классы FW), но размещение вашего файла непосредственно в компонентах должно быть хорошо с точки зрения организации.

Чтобы наследовать, вы можете просто создать свой файл в следующих строках:

class MyNewClass extends CFrameworkClass
{
    //All your stuff

} 

Обратите внимание, что по соглашению классы фреймворка yii имеют перед собой «C» (т. е. CController), я не добавляю «C» туда (CFramwork..) по какой-либо другой причине, кроме соблюдения соглашения.

person DJSunny    schedule 17.09.2011
comment
Итак, я создал подпапку в компонентах и ​​попробовал именно это, система не может найти родительский класс (zii/widgets/CMenu) - person Itay Moav -Malimovka; 17.09.2011