symfony权威指南(4、1)之动作

2024-06-02 19:18
文章标签 指南 动作 权威 symfony

本文主要是介绍symfony权威指南(4、1)之动作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在之前的页面创建基础一文中简要的介绍了一下关于动作的相关知识,在这篇文章中我们将继续深入讨论一下symfony的动作。


1、通常情况下动作都写在actions.class.php文件中,但是当action过多的时候,可以考虑将动作拆分,一个动作独立成一个文件,如下所示:

之前的版本:

actions.class.php

<?php/*** php actions.** @package    blog* @subpackage php* @author     Your name here* @version    SVN: $Id: actions.class.php 12479 2008-10-31 10:54:40Z fabien $*/
class phpActions extends sfActions
{/*** Executes index action** @param sfRequest $request A request object*/public function executeIndex(sfWebRequest $request){$this->forward('default', 'module');}public function executeTest(){$this->hour = date("H", time());}public function executeAnother(){$this->name = $this->getRequestParameter('name');}
}
现在的版本:

actions.class.php

<?php/*** php actions.** @package    blog* @subpackage php* @author     Your name here* @version    SVN: $Id: actions.class.php 12479 2008-10-31 10:54:40Z fabien $*/
class phpActions extends sfActions
{/*** Executes index action** @param sfRequest $request A request object*/public function executeIndex(sfWebRequest $request){$this->forward('default', 'module');}
}
anotherAction.class.php

<?php
class anotherAction extends sfAction
{public function execute(sfWebRequest $request){$this->name = $this->getRequestParameter('name');}}

testAction.class.php

<?php
class testAction extends sfAction
{public function execute($request){$this->hour = date("H", time());}}



2、在动作类里你可以获取控制器相关的信息和symfony 的核心对象,如下所示:
// Retrieving request parameters
$password = $this->getRequestParameter('password');
// Retrieving controller information
$moduleName = $this->getModuleName();
$actionName = $this->getActionName();
// Retrieving framework core objects
$request = $this->getRequest();
$userSession = $this->getUser();
$response = $this->getResponse();
$controller = $this->getController();
$context = $this->getContext();
// Setting action variables to pass information to the template
$this->setVar('foo', 'bar');
$this->foo = 'bar'; // Shorter version

sfController: 控制器对象(->getController()) 

sfRequest: 请求对象(->getRequest()) 

sfResponse: 应答对象 (->getResponse()) 

sfUser: 用户session 对象 (->getUser()) 

sfDatabaseConnection: 数据库链接对象(->getDatabaseConnection()) 

sfLogger: 日志对象 (->getLogger()) 

sfI18N:国际化对象 (->getI18N())


3、symfony中可以使用sfview类中的常量决定用哪个模板展示动作的结果,分为以下几种:


return sfView::SUCCESS;
这是动作的默认方式,即使省略不写,symfony一样会去找寻actionNameSuccess模板


return sfView::ERROR;
当有错误发生时,这样结尾, symfony就会去找寻actionNameError模板

return 'MyResult';

这个是自定义模板,这样返回时,symfony将会去找寻actionNameMyResult模板

return sfView::NONE;
有时我们并不需要试图展示,比如,这个动作是一个接口的时候,就可以使用如上代码,告诉symfony不要展示视图。

return sfView::HEADER_ONLY;
在一些情况下,你需要回复一个空的应答但要有HTTP 头(特别是X-JSONHTTP头)。返回HTTP 头sfView::HEADER_ONLY 常量,下面是一个示例:

public function executeRefresh()
{
$output = '<"title","My basic letter"],["name","Mr Brown">';
$this->getResponse()->setHttpHeader("X-JSON", '('.$output.')');
return sfView::HEADER_ONLY;
}
如果动作需要一个特殊的模板,去掉return 声明, 用 setTemplate()方法。
$this->setTemplate('myCustomTemplate');


4、动作跳转

symfony中提供了两个方法可以执行另一个动作,redirect和forward:

如果动作转发给另一个动作:

$this->forward('otherModule', 'index');
如果跳转到另一个动作:

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


其中forward方法有以下几种变种:

forward404()
forwardIf()
forwardUnless()
forward404If()
forward404Unless()

redirect方法也有相似的变种:

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);
}


5、动作共享代码

如果你需要在执行每个动作前都要执行一段代码,你可以把这段代码放入动作类里的preExecute()方法里。你可能猜到如果你想在执行每个动作后执行一段代
码,那你可以把这段代码放入postExecute()方法里。如下示例所示:

class mymoduleActions extends sfActions
{
public function preExecute()
{
// 这里的代码会在每个动作之前执行
...
}
public function executeIndex()
{
...
}
public function executeList()
{
...
$this->myCustomMethod(); // 可以使用动作类里定义的方法
}
public function postExecute()
{
// 这里的代码会在每次执行完动作之后执行
...
}
protected function myCustomMethod()
{
// 还可以添加自己的方法,只要不以"execute"开头
// 最好把这样的方法声明成protected 或者private
...
}
}

注:如果访问的动作做了跳转,preExecute和postExecute将不会执行。

6、访问请求

如果请求有附件,sfWebRequest 对象可以访问或移动这些文件,如下示例:

sfWebRequest 对象知道如何处理附件
class mymoduleActions extends sfActions
{
public function executeUpload()
{
if ($this->getRequest()->hasFiles())
{
foreach ($this->getRequest()->getFileNames() as $fileName)
{
$fileSize = $this->getRequest()->getFileSize($fileName);
$fileType = $this->getRequest()->getFileType($fileName);
$fileError = $this->getRequest()->hasFileError($fileName);
$uploadDir = sfConfig::get('sf_upload_dir');
$this->getRequest()->moveFile('file',
$uploadDir.'/'.$fileName);
}
}
}
}

以下是sfWebRequest 对象里的方法列表:

名称 功能 输出例子
getMethod()请求的方返回sfRequest::GET 或者sfRequest::POST常量
getMethodName()请求方法'POST'
getHttpHeader('Server')某个指定HTTP头的值
'Apache/2.0.59 (Unix) DAV/2 PHP/5.1.6'
getCookie('foo')某个cookie 的'bar'
isXmlHttpRequest()是否Ajaxtrue
isSecure()是否SSLtrue
hasParameter('foo')请求里是否包含某个参数?true
getParameter('foo')某个参数的值'bar'
getParameterHolder()->getAll()包含所有参数的数 
getUri()完整URI'http://localhost/myapp_dev.php/mymodule/myaction'
getPathInfo()路径信息'/mymodule/myaction'
getReferer()来源'http://localhost/myapp_dev.php/'
getHost() 主机'localhost'
getScriptName()前端控制器的路径和名'myapp_dev.php'
getLanguages()所有可接受的语言组成的数Array( [0] => fr [1] => fr_FR [2] => en_US
[3] => en )
getCharsets()所有可接受的字符集组成的数组Array( [0] => ISO-8859-1 [1] => UTF-8 [2]
=> * )
getAcceptableContentType()所有可接受的内容类型组成的数 

这篇关于symfony权威指南(4、1)之动作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1024848

相关文章

使用JavaScript将PDF页面中的标注扁平化的操作指南

《使用JavaScript将PDF页面中的标注扁平化的操作指南》扁平化(flatten)操作可以将标注作为矢量图形包含在PDF页面的内容中,使其不可编辑,DynamsoftDocumentViewer... 目录使用Dynamsoft Document Viewer打开一个PDF文件并启用标注添加功能扁平化

电脑显示hdmi无信号怎么办? 电脑显示器无信号的终极解决指南

《电脑显示hdmi无信号怎么办?电脑显示器无信号的终极解决指南》HDMI无信号的问题却让人头疼不已,遇到这种情况该怎么办?针对这种情况,我们可以采取一系列步骤来逐一排查并解决问题,以下是详细的方法... 无论你是试图为笔记本电脑设置多个显示器还是使用外部显示器,都可能会弹出“无HDMI信号”错误。此消息可能

如何安装 Ubuntu 24.04 LTS 桌面版或服务器? Ubuntu安装指南

《如何安装Ubuntu24.04LTS桌面版或服务器?Ubuntu安装指南》对于我们程序员来说,有一个好用的操作系统、好的编程环境也是很重要,如何安装Ubuntu24.04LTS桌面... Ubuntu 24.04 LTS,代号 Noble NumBAT,于 2024 年 4 月 25 日正式发布,引入了众

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

用Unity2D制作一个人物,实现移动、跳起、人物静止和动起来时的动画:中(人物移动、跳起、静止动作)

上回我们学到创建一个地形和一个人物,今天我们实现一下人物实现移动和跳起,依次点击,我们准备创建一个C#文件 创建好我们点击进去,就会跳转到我们的Vision Studio,然后输入这些代码 using UnityEngine;public class Move : MonoBehaviour // 定义一个名为Move的类,继承自MonoBehaviour{private Rigidbo

如何掌握面向对象编程的四大特性、Lambda 表达式及 I/O 流:全面指南

这里写目录标题 OOP语言的四大特性lambda输入/输出流(I/O流) OOP语言的四大特性 面向对象编程(OOP)是一种编程范式,它通过使用“对象”来组织代码。OOP 的四大特性是封装、继承、多态和抽象。这些特性帮助程序员更好地管理复杂的代码,使程序更易于理解和维护。 类-》实体的抽象类型 实体(属性,行为) -》 ADT(abstract data type) 属性-》成

49个权威的网上学习资源网站

艺术与音乐 Dave Conservatoire — 一个完全免费的音乐学习网站,口号是“让每一个人都可以接受世界级的音乐教育”,有视频,有练习。 Drawspace — 如果你想学习绘画,或者提高自己的绘画技能,就来Drawspace吧。 Justin Guitar — 超过800节免费的吉他课程,有自己的app,还有电子书、DVD等实用内容。 数学,数据科学与工程 Codecad

使用条件变量实现线程同步:C++实战指南

使用条件变量实现线程同步:C++实战指南 在多线程编程中,线程同步是确保程序正确性和稳定性的关键。条件变量(condition variable)是一种强大的同步原语,用于在线程之间进行协调,避免数据竞争和死锁。本文将详细介绍如何在C++中使用条件变量实现线程同步,并提供完整的代码示例和详细的解释。 什么是条件变量? 条件变量是一种同步机制,允许线程在某个条件满足之前进入等待状态,并在条件满