我需要将 ajax 请求转发到当前控制器的其他 Action 方法。我使用 Forward 插件,但它不起作用。手册中有一个关于如何使用 Forward Plugin 的示例:
$foo = $this->forward()->dispatch('foo', array('action' => 'process'));
return array(
'somekey' => $somevalue,
'foo' => $foo,
);
我的代码:
// From Ajax on the page. I apply to the indexAction of FooController,
// I use RegEx route
xhr.open('get', '/fooindex', true);
// My Controller
namespace Foo\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
// I extend the AbstractActionController, the manual says it's important for the Forward Plugin to work
class FooController extends AbstractActionController {
// This is the action I send my request from Ajax
public function indexAction() {
// if the request if Ajax request I forward the run to the nextAction method
if ($this->getRequest()->isXmlHttpRequest()) {
// I do as manual says
$rs = $this->forward()->dispatch('FooController', array('action' => 'next'));
}
}
public function nextAction() {
// And I just want to stop here to see that the Forward Plugin works
// But control doesn't reach here
exit('nextAction');
}
}
我在控制台中得到的错误是:
GET http://test.localhost/fooindex 500 (Internal Server Error)
如果我不使用 Forward 一切正常,请求就可以了indexAction
。只有 Forward 会抛出错误。
为使 Forward 插件工作,调用它的控制器必须是 ServiceLocatorAware;否则,插件将无法检索所请求控制器的配置和注入实例。
实现上述每个接口都是冗余的教训;你不会经常想要这样做。因此,我们开发了两个抽象的基本控制器,您可以扩展以开始使用。
AbstractActionController 实现了以下每个接口:
Zend\Stdlib\DispatchableInterface Zend\Mvc\InjectApplicationEventInterface Zend\ServiceManager\ServiceLocatorAwareInterface Zend\EventManager\EventManagerAwareInterface
所以我的FooController
extends AbstractActionController
,它实现ServiceLocatorAwareInterface
了,所以 Forward 必须工作,但它没有。我错过了什么?如何让它发挥作用?