Как стать автором
Обновить

Контроллер для работы с медиа-файлами в Kohana

Время на прочтение2 мин
Количество просмотров2.5K
Приветствую!
Данная статья будет скорее полезна для новичков, но, с учетом отсутствия обширной документации по фреймворку, таких немало и поэтому я решил все-таки опубликовать ее.
На написание этой статьи меня также сподвигло множество вопросов, связанных с работой с медиа-файлами в Kohana и некоторые куски кода во многих просматренных мной исходниках проектов на Ko3 (люблю рассматривать реализации различных проектов на этом фреймворке — за отсутствием документации порой сильно помогает).
И так, что же мы будем делать?
Мы напишем контроллер, который будет обрабатывать запросы вида media/css/default и возвращать нам (кэшированный, если есть) файл views/.../media/css/default.css, например.

Код на 90% позаимствован из модуля userguide.

И так, код:
class Controller_Media extends Kohana_Controller{
    
    public function action_index($path, $file)
    {
		$this->request->check_cache(sha1($this->request->uri));
		//В папках media/css и media/js у нас лежат только файлы с расширением .css и .js соответственно, значит расширение = имени директории
		if($path == 'css' || $path == 'js')
		{
			$ext = $path;
		}
		else
		{
          	$ext = pathinfo($file, PATHINFO_EXTENSION);
			$file = substr($file, 0, -(strlen($ext) + 1));
		}
         
		//У меня функция View::GetTplName() возвращает имя текущего шаблона, то есть медиа-файлы шаблона default, например, лежат в views/default/media/... Если вам это не нужно - достаточно просто убрать View::GetTplName() и один слэш в пути.
	 	if ($file = Kohana::find_file('views/'.View::GetTplName().'/media/'.$path, $file, $ext))
	 	{
			// Возвращаем в качестве ответа содержимое файла, если он существует
			$this->request->response = file_get_contents($file);

			// Ну а тут устанавливаем соответствующие файлу заголовки
			$this->request->headers['Content-Type']   = File::mime_by_ext($ext);
			$this->request->headers['Content-Length'] = filesize($file);
			$this->request->headers['Last-Modified']  = date('r', filemtime($file));
		}
		else
		{
			// Или ошибку 404, если файл не найден
			$this->request->status = 404;
		}
    }
}


Вот, собственно, и все. Теперь, чтобы загрузить views/default/media/css/default.css достаточно обратиться к media/css/default, а чтобы загрузить картинку из, скажем, views/default/media/img/logo.png обращаемся к media/img/logo.png
А за это у нас будет отвечать вот такой вот маршрут:
Route::set('media', 'media/<path>/<file>', array('file' => '.*'))
    ->defaults(array(
        'controller' => 'media',
        'action' => 'index'
    ));


Жду ваших комментариев и надеюсь, что этот небольшой пост кому-нибудь, да поможет.
Теги:
Хабы:
Всего голосов 5: ↑3 и ↓2+1
Комментарии13

Публикации

Истории

Ближайшие события