簡體   English   中英

使用AJAX操作編輯Symfony行為

[英]Edit Symfony behavior with AJAX actions

假設我有一個使用很多AJAX請求的應用程序。

當我的請求是AJAX時,是否可以編輯Symfony行為並自動調用indexAjaxAction而不是indexAction

我已經知道我可以使用Request::isXmlHttpRequest()方法測試請求是否為Ajax,但我希望它是自動的( 即,無需在每個controllerAction中進行測試)。

服務/捆綁包已經成功了嗎?

范例:

<?php 

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class FooController extends Controller
{
    public function indexAction($vars)
    {
        $request = $this->getRequest();         
        if($request->isXmlHttpRequest()) {
            return $this->indexAjaxAction($vars);
        }
        // Do Stuff
    }

    public function indexAjaxAction($vars){ /* Do AJAX stuff */ }
}

變成

<?php 

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class FooController extends Controller
{
    public function indexAction($vars) { }
    public function indexAjaxAction($vars) { }

    // Other functions
}

一種方法是在常規的KttpKernel::handleRaw 進程中使用經過稍微修改的控制器解析器,而不是當前的控制器解析器。

請注意,我的想法可能是錯誤的,未經測試。

控制器解析程序類具有id controller_resolver.class ,您可以使用配置中的自定義變量覆蓋該ID

在您的app/config/config.yml ...

.. config stuff ..

parameters:
    controller_resolver.class: Acme\SomeBundle\Controller\ControllerResolver

然后在您的新ControllerResolver ...

namespace Acme\SomeBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\ControllerResolver
                    as BaseControllerResolver;

class ControllerResolver extends BaseControllerResolver
{
    /**
     * {@inheritdoc
     */
    public function getArguments(Request $request, $controller)
    {
        if (is_array($controller) && $request->isXmlHttpRequest()) {
            $action = preg_replace(
                '/^(.*?)Action$/', 
                '$1AjaxAction', 
                $controller[1]
            );

            try {
                $r = new \ReflectionMethod($controller[0], $action);

                return $this->doGetArguments(
                    $request, 
                    $controller, 
                    $r->getParameters()
                );
            } catch( \Exception $e) {
                // Do nothing
            }
        }

        return parent::getArguments($request, $controller);
    }
}

此類僅擴展當前的控制器解析器,並且將嘗試使用youractionAjaxAction如果它存在於控制器中),然后在遇到錯誤時退回到常規解析器(未找到方法);

另外,您也可以使用...

if (is_array($controller) && $request->isXmlHttpRequest()) {
    $controller[1] = preg_replace(
        '/^(?P<action>.*?)Action$/', 
        '$1AjaxAction', 
        $controller[1]
    );
}

return parent::getArguments($request, $controller);

..它將僅更新所調用的動作,然后將其發送到常規解析器而不會回退,這意味着可以使用XmlHttpRequest調用的每個動作都需要一個相應的AjaxAction。

您可能想研究FOSRestBundle for Symfony,如果您有1個操作可以根據請求方法返回json數據或呈現的html模板,則它可能非常有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM