Каскадная файловая система

Комментарии: 0  Просмотры: 5 842

Файловая система фреймворка 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;
Если вы хотите сконвертировать Представления в PDF-формат, используя DOMPDF, попробуйте модуль PDFView.

Обсудить на форуме




Оставить комментарий или два

Пожалуйста, зарегистрируйтесь для комментирования.