Файловая система фреймворка Kohana использует иерархическую структуру каталогов. Иерархия в Kohana (при загрузке файла используется метод Kohana::find_file) построена по следующему принципу (файл ищется в каталогах в следующем порядке):
1. Application Path (каталог с приложением)
Определен как APPPATH в index.php. Значение по умолчанию — application.
2. Module Path (каталог с модулями)
Определен как ассоциативный массив Kohana::modules в APPPATH/bootstrap.php. Каждое из значений массива будет найдено в том порядке, в котором это значение определено.
3. System Path (системный каталог)
Определен как SYSPATH в index.php. Значение по умолчанию — system. Все классы и файлы, составляющие ‘ядро’ фреймворка, определены здесь.
Файлы, находящиеся в каталогах с уровнем выше, имеют приоритет над файлами находящимися в тех же каталогах, обладающими уровнем ниже, что позволяет перегружать любые файлы, путем перемещения этих файлов, с тем же именем, в каталог более высшего уровня.
На этом изображении показаны только определенные файлы, но его можно использовать для иллюстрации примеров работы с каскадной файловой системой:
- Если Kohana ‘ловит’ ошибку, то это будет отображаться в представлении kohana/error.php, поэтому вызывается Kohana::find_file(‘views’, ‘kohana/error’). Это означает, что будет вызван файл из каталога application/views/kohana/error.php, потому что он имеет преимущество перед файлом расположенным в каталоге system/views/kohana/error.php. Используя такой подход, можно изменять вывод ошибок без редактирования системного каталога.
- Если использовать View::factory(‘welcome’) и вызвать Kohana::find_file(‘views’, ‘welcome’), метод вернет application/views/welcome.php, потому что каталог application имеет преимущество над файлом в каталоге modules/common/views/welcome.php. Используя такой подход, можно изменять некоторые файлы в модуле без редактирования самого модуля.
- Если использовать класс Cookie, то метод Kohana::auto_load вызовет Kohana::find_file(‘classes’, ‘cookie’), который вернет application/classes/cookie.php. Предположив, что класс Cookie расширяет Kohana_Cookie, автозагрузчик вызовет Kohana::find_file(‘classes’, ‘kohana/cookie’), который вернет system/classes/kohana/cookie.php, потому что файл с таким именем больше нигде не существует. Этот пример показывает прозрачность расширения.
- Если использовать View::factory(‘user’), то будет вызван Kohana::find_file(‘views’, ‘user’), который вернет modules/common/views/user.php.
- Если необходимо внести изменения в config/database.php, то необходимо скопировать этот файл в application/config/database.php и сделать в нем изменения. Важно помнить, что файлы конфигурации будут объединены , а не заменены.
Типы файлов
Верхний уровень каталогов (application, module, system) имеет следующие каталоги по умолчанию:
classes/
Все классы, которые необходимы для автозагрузки, должны храниться здесь. Каталог включает в себя контроллеры, модели и все остальные классы. Все классы должны соответствовать соглашению по именованию классов.
config/
Конфигурационные файлы возвращают ассоциативный массив параметров, которые могут быть загружены с помощью Kohana::$config. Конфигурационные файлы объединяются, а не заменяются.
i18n/
Файлы перевода возвращают ассоциативный массив. Перевод осуществляется с помощью метода __(). Для перевода «Hello World!» на испанский язык, необходимо вызвать __(‘Hello World!’) и установить значение I18n::$lang на ‘es-es’. Файлы i18n объединяются, а не заменяются.
messages/
Файлы сообщений возвращают ассоциативный массив строк, которые могут быть загружены с помощью Kohana::message. Файлы сообщений отличаются от файлов i18n тем, что они не переводятся так как пишутся на языке, используемом по умолчанию и вызываются по односложному ключу. Файлы сообщения объединяются, а не заменяются.
views/
Представления являются обычными php-файлами, которые используются для генерации HTML или другого вида вывода информации. Файлы представления загружаются в объект View и присваиваются переменным, которые затем конвертируются во фрагменты HTML. Множественные файлы представления могут быть вложены друг в друга.
other
Можно включать любые другие каталоги в каскадную файловую систему. Примеры включаемых каталогов: guide, media, vendor. Например, чтобы найти media/logo.png в каскадной файловой системе, необходимо вызвать Kohana::find_file(‘media’,'logo’,'png’).
Поиск файлов
Путь к любому файлу в файловой системе можно найти используя вызов Kohana::find_file:
// найти полный путь к "classes/cookie.php" $path = Kohana::find_file('classes', 'cookie'); // найти полный путь к "views/user/login.php" $path = Kohana::find_file('views', 'user/login');
Если файл не имеет php расширения, то передать его расширение можно в качестве третьего параметра.
// найти полный путь к "guide/menu.md" $path = Kohana::find_file('guide', 'menu', 'md'); // если в переменной $name находится "2000-01-01-first-post", будет искать "posts/2000-01-01-first-post.textile" $path = Kohana::find_file('posts', $name, '.textile');
Сторонние библиотеки
Расширения или сторонние библиотеки, которые не специфичны для Kohana, называются vendor-расширениями и располагаются в папке vendor, в application или в папке module. Поскольку эти библиотеки не следуют соглашению по именованию файлов, то они не могут быть автоматически загружены, так что необходимо загрузить их вручную. Некоторые примеры сторонних библиотек: Markdown, DOMPDF, Mustache и Swiftmailer.
Например, при использовании библиотеки DOMPDF, необходимо скопировать эту библиотеку в application/vendor/dompdf и подключить автозагрузочный класс DOMPDF. Может быть полезно делать это в контроллере в методе before, как часть модуля init.php или используя конструктор класса singleton:
require Kohana::find_file('vendor', 'dompdf/dompdf/dompdf_config','inc');
Теперь можно использовать DOMPDF без загрузки дополнительных файлов.
$pdf = new DOMPDF;
Пожалуйста, зарегистрируйтесь для комментирования.