【发布时间】:2011-09-03 01:09:55
【问题描述】:
我在 Kohana 3.1.3.1 中的 HMVC 子请求后保留变量的值时遇到问题,我想知道如何最好地处理/修复它。我以为 Kohana 中的附加请求是相互隔离的,但似乎并非如此......
首先,我创建了一个控制器来扩展 Controller_Template:
abstract class Controller_Website extends Controller_Template {
public $page_info;
public $allow_caching;
public function before()
{
// ... more unrelated code here ...
// Only do this if auto_render is TRUE (default)
if ($this->auto_render === TRUE AND $this->request->is_initial())
{
// Set our Page_Info to the values we just loaded from the database
$this->page_info = clone $this->navs[$slug];
}
// ... more unrelated code here ...
}
public function after()
{
// ... more unrelated code here ...
// For internal requests, let's just get everything except for the template
if (! $this->request->is_initial())
{
$this->response->body($this->template->main_view->render());
}
// Only if auto_render is still TRUE (Default)
if ($this->auto_render === TRUE AND $this->request->is_initial())
{
// ... more unrelated code here ...
// ... get stuff from the database to populate the template ...
// now render the response body
$this->response->body($this->template->render());
}
// ... more unrelated code here...
// including setting headers to disable/enable caching
}
}
下面是一个示例,其中一个控制器的外观如下:
class Controller_Events extends Controller_Website {
public function action_filtered()
{
// ... do some stuff ...
// and set some values
$this->page_info->page_title = 'Set in Events controller';
// and some more stuff including generating some output
}
}
现在我希望我的其他控制器之一能够在没有模板的情况下从事件控制器中提取输出。 Controller_Website(上图)负责从输出中排除模板,但考虑一下:
class Controller_Search extends Controller_Website {
public function action_index()
{
// ... do some stuff ...
// now let's include the result from our events controller
$this->template->main_view->events = Request::factory()
->controller('events')
->action('filtered')
->execute();
// and set some values
$this->page_info->page_title = 'Set in Search controller';
// and some more stuff including generating some output
}
}
所以当我的模板调用echo $this->page_info->page_title; 时(请记住,我的模板只包含在搜索控制器的输出中,而不是事件控制器的输出中),我希望它返回“在搜索控制器中设置” 而是返回“在事件控制器中设置”
问题是这个action_filtered() 方法很长,我设置了几个使用这种方法输出几个事件页面的路由(比如按年、月、地点、城市等过滤事件)所以在我的搜索控制器中复制此方法没有意义。因此需要 HMVC 请求。当过滤的操作被称为主/初始请求时,在$page_info 中设置值是有意义的,但是当它被称为子请求时,我需要保留在搜索控制器中设置的值,或者任何初始控制器是。
当然,我可以在事件控制器中创建一个 if 语句,仅当它是主请求时才更新这些值,但这显然不太理想。一定有办法让这个子请求独立于初始请求运行吗?
我做错了什么,或者解决这个问题的最佳方法是什么?
提前致谢!
私信
【问题讨论】:
-
一个澄清,只是为了确定:在初始请求中,您回显了一些变量,并且似乎通过调用 HMVC 请求更改了它的值?
-
@Tadeck - 是的,该变量只会在模板视图中回显(例如页面标题)。一旦运行 HMVC 请求,
$this->page_info->page_title(例如)将保持在事件控制器中设置的任何内容,并且我无法在搜索控制器中再更改它,即使我尝试在after()方法中更改它搜索控制器...
标签: php templates request kohana hmvc