经验说明,很多时候一个动作会在验证一些东西后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类提供了一些代理来快速地访问请求方法