Symfony控制层深入详解(2)

在前端控制器中一个sfContext::getInstance()的调用。在动作中,getContext()方法是单例模式(即所有的调用都是第一个实例,这对于存储指向与给定请求相关的symfony核心对象的索引的情况是非常有用的)。

sfController:控制器对象 (->getController())
sfRequest:请求对象 (->getRequest())
sfResponse:响应对象 (->getResponse())
sfUser:用户Session对象 (->getUser())
sfDatabaseConnection:数据库链接 (->getDatabaseConnection())
sfLogger:日志对象 (->getLogger())
sfI18N:国际化对象(->getI18N())
可以在代码的任何位置放置sfContext::getInstance()。

动作终止

当动作执行完成后会出现各种行为,动作方法的返回值决定视图如何被实施。sfView类的常量经常被指定与模板来显示动作的结果。如果一个默认视图被调用,动作应该以下面的代码结束:

return sfView::SUCCESS;

Symfony将寻找actionNameSuccess.php的模板,这是默认的行为,所以如果你忽略了return语句,symfony也将查找actionNameSuccess.php模板,空动作也将触发同样的行为,如下:

# 将调用indexSuccess.php模板 public function executeIndex() { return sfView::SUCCESS; } # 将调用listSuccess.php模板 public function executeList() { }

如果要调用错误视图,动作将以下面语句结束:

# symfony将查找actionNameError.php模板 return sfView::ERROR;

调用自定义视图

# symfony将查找actionNameMyResult.php模板 return 'MyResult';

如果动作不想调用模板(比如批处理和任务计划cron),可以使用下面的语句

return sfView::NONE;

上面情况下,视图层将被忽略,HTML代码可以直接在动作中输出,symfony提供了一个特殊的方法renderText()来实现。这种情况比较适用于AJAX交互。

public function executeIndex() { echo "<html><body>Hello, World!</body></html>"; return sfView::NONE; } // 等价方法 public function executeIndex() { return $this->renderText("<html><body>Hello, World!</body></html>"); }

有些时候你需要发送空的响应但包含定义的头信息(特别是X-JSON头),定义头通过sfResponse对象,并且放回sfView::HEADER_ONLY常量:

public function executeRefresh() { $output = '<"title","My basic letter"],["name","Mr Brown">'; $this->getResponse()->setHttpHeader("X-JSON", '('.$output.')'); return sfView::HEADER_ONLY; }

如果动作必须呈交特定模板,使用setTemplate()方法来忽略return语句:

$this->setTemplate('myCustomTemplate');

跳向另一个动作

有些情况下,动作以请求一个新的动作作为结束,例如,一个动作处理表单的POST提交在更新数据库后通常会转向到另一个动作。另一个例子是动作别名:index动作经常是来完成显示,所以实际上是跳向了list动作。

有两种方式来实现另一个动作的执行:

① 向前(Forwards)方式

$this->forward('otherModule','otherAction');

② 重定向(Redirection)方式

$this->redirect('otherModule/otherAction'); $this->redirect('http://www.google.cn');

Forward和redirect后面的语句将不会被执行,你可以理解为他们等价于return语句。他们抛出sfStopException异常来停止动作的执行

两者的区别:forward是内部的处理,对用户是透明的,即用户不会感觉到动作发生了变化,URL也不会更改。相反,redirection是动作的真正跳转,URL的改变是最直接的反映。

如果动作是被POST提交表单调用的,你最好使用redirect。这样,如果用户刷新了结果页面,POST表单不会被重复提交;另外,后退按钮也能很好的返回到表单显示页面而不是一个警告窗口询问用户是否重新提交POST请求。

Forward404()方法是一种常用的特殊forward,他跳到“页面无法找到”动作。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/acc323a5fe49d6e20da85f99c0a4d6da.html