无法在 zend 框架 3 中使用 ajax 发送

Can't send with ajax in zend framework 3

我正在尝试发送一个 ajax 来调用我在 GrupoUsuarioController 中的函数 'alterarPermissoesAction'。

js代码:

$.ajax({
    type: 'POST',
    url: '<?= $this->url( 'grupo-usuario-insumo', [ 'action' => 'alterarPermissoes' ] ) ?>',
    data: dados,
    dataType: 'json',
    success: function( r ) {
        console.log( r );
    }
});

当我这样做时,zf3 尝试呈现一个页面并将该页面作为响应发送给我。

return image

我应该怎么做才能让 zf3 停止尝试呈现页面?

在您的控制器中,alterarPermissoesAction 必须以 :

结尾
return $this->getResponse()->setContent(
            Json::encode(
                [
                    [your response]
                ]));

但不要应用您必须在 Module.php 中指定的布局,例如:

public function onBootstrap(MvcEvent $e)
{
    ...
    $sharedEvents = $e->getApplication()
        ->getEventManager()
        ->getSharedManager();
    $sharedEvents->attach(__NAMESPACE__, 'dispatch', 
        function ($e) {
            $result = $e->getResult();
            if ($result instanceof \Zend\View\Model\ViewModel) {
                $result->setTerminal($e->getRequest()->isXmlHttpRequest());
            } else {
                throw new \Exception([your message]);
            }
        });
}

如果您想要数据响应,您应该确保通过 ViewJsonStrategy 使用不同的 ViewHelper。将以下内容添加到您的模块配置中。

'view_manager' => [
    'strategies' => [
        'ViewJsonStrategy', // This is an alias, so add as string
    ],
],

接下来,您的控制器中有一个动作必须知道它必须 return Json。您可以使用 JsonModel 执行此操作。 Example in a good book - 下面的示例代码(来自 link):

namespace Application\Controller;

use Zend\Mvc\Controller\ActionController;
use Zend\View\Model\JsonModel;

class IndexController extends ActionController
{
    public function getJsonAction()
    {
        return new JsonModel([
            'status' => 'SUCCESS',
            'message'=>'Here is your data',
            'data' => [
                'full_name' => 'John Doe',
                'address' => '51 Middle st.'
            ]
        ]);
    }
}

如果您希望能够有条件地使用它,例如对于没有页面刷新的动态表单响应,您想检查请求是否为 XmlHttpRequest,如下所示:

namespace Application\Controller;

use Zend\Mvc\Controller\ActionController;
use Zend\View\Model\JsonModel;

class IndexController extends ActionController
{
    public function getJsonAction()
    {
        if ($this->getRequest()->isXmlHttpRequest()) {

            return new JsonModel([
                'status' => 'SUCCESS',
                'message'=>'Here is your data',
                'data' => [
                    'full_name' => 'John Doe',
                    'address' => '51 Middle st.'
                ]
            ]);
        }

        return [
            'normal' => 'response',
        ];
    }
}