我希望有人向我解释_forward正在做什么,我无法看到_forward是否也在渲染动作的附加视图或只是执行动作。
还可以在视图脚本中将参数传递给$ this->动作吗?
更一般地说,我的问题是如何编写确认页面,让我们说用户输入一些东西,你想向他展示确认,前进对于那种情况是意味着什么?
答案 0 :(得分:22)
_forward是内部重定向。当_redirect发送一个标题告诉客户端浏览器转到其他URL时,_forward告诉Dispatcher在其他地方内部重定向请求。
如果您考虑正常的调度顺序:
preDispatch()
someAction()
postDispatch()
在该进程中的任何时刻调用_forward将导致以下步骤无法执行。因此,如果在preDispatch()中调用_forward,则不会调用someAction(),依此类推。如果你在someAction()中使用_forward()并且你正在使用viewRenderer动作助手来渲染你的视图(你让框架选择要渲染的视图脚本),那么在someAction()中不会呈现任何视图脚本。
当请求转发到新的控制器/模块时,整个调度过程将在那里重复。
您可以使用以下方式找出正在调度的操作:
$action = $this->getRequest()->getParam('action');
$ action将是动作的url形式,因此如果方法名为'someKindOfAction',$ action将包含'some-kind-of'。您也可以为控制器和模块执行此操作。
答案 1 :(得分:10)
我对Zend的体验是有限的,我希望我没有向你展示你已经看过的东西但according to the docs(12.7.6。效用方法):
_forward($ action,$ controller = null,$ module = null,array $ params = null):执行另一个操作。 如果在preDispatch()中调用,则将跳过当前请求的操作,以支持新操作。否则,在处理当前操作后,将执行_forward()中请求的操作。
所以这听起来像什么时候被称为重要的背景。在后一种情况下,它将首先执行被称为然后执行转发操作的操作。例外情况是从 preDispatch 处理程序
调用它答案 2 :(得分:9)
我认为重要的是要注意_forward是非常低效的,你应该总是直接调用你的方法。当你执行_forward时,init(),pre和post调度再次运行。根据init中的内容,可以运行(并插入)两次相同的数据库记录。
易于使用但浪费。如果您对代码进行了分析,并且正在敲打为什么一切都被调用两次,那么_forward就是原因。如果你喜欢我并在init()中实例化一些对象以供整个课程使用,那么你最终会实例化两次!我对我的代码进行了加载测试,我通过直接调用动作名称获得了更好的性能,比如foo(),而不是_forward('foo');
我认为大多数人都知道的另一个非主题提示是,它尽可能使用单引号,正确的PHP解析器必须检查字符串中的嵌入变量。我不知道这会带来多少真实世界的性能,特别是如果你使用的是操作码缓存,但这是最好的做法。
答案 3 :(得分:3)
当外部重定向不是正确的选项时,将使用转发。 用例(有点笨拙,但最好能弥补): 你有一个可以添加你的宠物(狗或猫)的表格。每个都有不同的模型。您在表单中包含一个选择狗/猫的选择。然后在你的行动中你做:
if($form->isValid($_POST)){
switch($form->select->getValue()){
case "dog":
$this->_forward('add-dog','pets','default');
break;
case "cat":
$this->_forward('add-cat','pets','default');
break;
}
}
你在不同的行动中为猫和狗处理不同的事情。这样做的好处是所有参数都是一起发送的。相比之下,当您使用$ this-> _redirect()时,POST参数将会丢失。这在某些情况下是预期的行为(例如,在添加评论后,您将重定向到评论列表页面以避免双重帖子和消息“页面需要再次发送数据......”。
答案 4 :(得分:2)
我发誓曾经在那里的框架文档的一部分解释了一般级别的调度工作流程。 Theres this diagram,但解释_forward的作用却非常复杂。
在操作中,_forward将设置$request->isDispatched = false
,并设置请求以调用_forward中指定的控制器/操作。在postDispatch期间,将检查isDispatched - 如果为false,则使用新请求再次运行整个事件。
所以......如果在你的行动中你手动渲染视图,它们仍然会被渲染。行动中的一切仍然会发生,其后只是另一个动作也会发生。
[编辑后编辑]
转发不适用于响应/确认后发布 - 使用重定向。 $this->_helper->redirector->gotoUrl()
等。