Да, вы можете.Поскольку Kohana проделывает некоторую хитрость с автозагрузкой, которую они называют «Каскадная файловая система», вы можете эффективно переопределить функциональность основных классов.Это то, что Code Igniter также делает, если вы знакомы.
В частности, это метод View :: factory, на который вы ссылаетесь. Источник .
public static function factory($file = NULL, array $data = NULL)
{
return new View($file, $data);
}
Как видите, это возвращает экземпляр View
.Первоначально View
не определен, поэтому PHP ищет его с помощью автозагрузки.Это когда вы можете воспользоваться функцией каскадной файловой системы, определив свой собственный класс View, который должен находиться в файле APPPATH/View.php
, где APPPATH
- это константа, определенная в index.php
. Здесь определены конкретные правила .
Итак, поскольку мы можем определить свой собственный класс View, мы готовы к работе.В частности, нам нужно переопределить View::capture
, который вызывается $view->render()
для захвата включения шаблона.
Взгляните на реализацию по умолчанию , чтобы понять, чтоделать и что доступно.Я изложил общую идею.
class View
{
/**
* Captures the output that is generated when a view is included.
* The view data will be extracted to make local variables. This method
* is static to prevent object scope resolution.
*
* $output = View::capture($file, $data);
*
* @param string filename
* @param array variables
* @return string
*/
protected static function capture($kohana_view_filename, array $kohana_view_data)
{
// there
$basename = $kohana_view_filename;
// assuming this is a mustache file, construct the full file path
$mustachePath = $some_prefix . $basename . ".mustache";
if (is_file($mustachePath))
{
// the template is a mustache template, so use whatever our custom
// rendering technique is
}
else
{
// it is some other template, use the default
parent::capture($basename, $kohana_view_data);
}
}
}