经验说明,很多时候一个动作会在验证一些东西后redirect或者forward另一个动作。这就是为什么sfActions类有很多的方法命名为forwardIf(), forwardUnless(), forward404If(), forward404Unless(), redirectIf(), 和 redirectUnless(),这些方法简单地使用一个测试结果参数true(那些xxxIf()方法)或false(那些xxxUnless()方法):
public function executeShow() { $article = ArticlePeer::retrieveByPK($this->getRequestParameter('id')); $this->forward404If(!$article); } public function executeShow() { $article = ArticlePeer::retrieveByPK($this->getRequestParameter('id')); $this->forward404Unless($article); }
这些方法不仅仅是减少你的代码行数,他们还使得你的程序更加易读。
当动作调用forward404()或者其他类似方法,symfony抛出管理404响应的sfError404Exception异常,也就是说如果你想显示404信息,你无需访问控制器,你只是抛出这个异常即可。
模块中多个动作重复代码的处理方式
preExecute()与postExecute()方法是一个模块中多个动作共同的东西。可以在调用executeAction()之前和之后执行。
class mymoduleActions extends sfActions { public function preExecute() { // 这里的代码在每一个动作调用之前执行 ... } public function executeIndex() { ... } public function executeList() { ... $this->myCustomMethod(); // 调用自定义的方法 } public function postExecute() { // 这里的代码会在每个动作结束后执行 ... } protected function myCustomMethod() { // 添加自己的方法,虽然他们没有以execute开头 // 在这里,最好将方法定义为protected(保护的)或者private(私有的) ... } }
访问请求
getRequestParameter(“myparam”)方法常用来获取myparam参数的值,实际上这个方法是一系列请求调用参数仓库的代理:getRequest()->getParameter(“myparam”)。动作类使用sfWebRequest访问请求对象,通过getRequest()访问他们的方法。
sfWebRequest对象的方法
方法名
功能
输入示例
Request Information
getMethod()
Request对象
Returns sfRequest::GET or sfRequest::POST constants
getMethodName()
Request对象名
'POST'
getHttpHeader('Server')
给定HTTP头的值
'Apache/2.0.59 (Unix) DAV/2 PHP/5.1.6'
getCookie('foo')
指定名称Cookie的值
'bar'
isXmlHttpRequest()*
是否是AJAX请求?
true
isSecure()
是否是SSL请求
true
Request Parameters
hasParameter('foo')
参数是否在请求中有
true
getParameter('foo')
指定参数的值
'bar'
getParameterHolder()->getAll()
所有请求参数的数组
URI-Related Information
getUri()
完整URI
'http://localhost/myapp_dev.php/mymodule/myaction'
getPathInfo()
路径信息
'/mymodule/myaction'
getReferer()**
来自那里?
'http://localhost/myapp_dev.php/'
getHost()
主机名
'localhost'
getScriptName()
前端控制器路径与名称
'myapp_dev.php'
Client Browser Information
getLanguages()
可接受语言的列表
Array( [0] => fr [1] => fr_FR [2] => en_US [3] => en )
getCharsets()
可接受字符集的列表
Array( [0] => ISO-8859-1 [1] => UTF-8 [2] => * )
getAcceptableContentTypes()
可接受内容类型数组
sfActions类提供了一些代理来快速地访问请求方法