Php 使用AJAX操作编辑Symfony行为

Php 使用AJAX操作编辑Symfony行为,php,ajax,symfony,Php,Ajax,Symfony,假设我有一个使用大量AJAX请求的应用程序 当我的请求是AJAX时,有没有一种方法可以编辑Symfony行为并自动调用indexaxaction而不是indexAction 我已经知道,我可以使用request::isXmlHttpRequest()方法测试请求是否是Ajax,但我希望它是自动的(即不在每个controllerAction中进行测试) 服务/捆绑包是否已经成功 例如: 您可能需要查看Symfony的FOSRestBundle,如果您有一个操作,根据请求方法可以返回json数据或呈

假设我有一个使用大量AJAX请求的应用程序

当我的请求是AJAX时,有没有一种方法可以编辑Symfony行为并自动调用
indexaxaction
而不是
indexAction

我已经知道,我可以使用
request::isXmlHttpRequest()
方法测试请求是否是Ajax,但我希望它是自动的(即不在每个controllerAction中进行测试)

服务/捆绑包是否已经成功

例如:


您可能需要查看Symfony的FOSRestBundle,如果您有一个操作,根据请求方法可以返回json数据或呈现html模板,那么它将非常有用您可能需要查看Symfony的FOSRestBundle,如果您有一个操作可以返回json数据或呈现的html模板,这将非常有用,具体取决于请求方法

您可能需要查看Symfony的FOSRestBundle,如果您有一个操作可以返回json数据或呈现的html模板,这将非常有用,具体取决于请求方法

您可能需要查看Symfony的FOSRestBundle,如果您有一个操作可以根据请求方法返回json数据或呈现的html模板,那么它将非常有用。一种方法是使用稍微修改的控制器解析器,而不是常规
KttpKernel::handleRaw
中的当前控制器解析器

请注意,我在这里的想法可能是错误的,这是未经测试的

控制器冲突解决程序类具有id
controller\u resolver.class
,您可以使用

在你的
app/config/config.yml

.. config stuff ..

parameters:
    controller_resolver.class: Acme\SomeBundle\Controller\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);
    }
}
然后在新的
控制器Resolver

.. config stuff ..

parameters:
    controller_resolver.class: Acme\SomeBundle\Controller\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);
if(is_数组($controller)&&$request->isXmlHttpRequest()){
$controller[1]=预更换(
“/^(?P.*)操作$/”,
“$1AjaxAction”,
$controller[1]
);
}
返回父::getArguments($request,$controller);

。。只需更新所调用的操作,然后将其发送到常规解析程序,无需任何回退,这意味着可以使用
XmlHttpRequest
调用的每个操作都需要相应的AjaxAction。

一种方法是使用稍加修改的控制器解析器,而不是常规
KttpKernel::handleRaw
中的当前控制器解析器

请注意,我在这里的想法可能是错误的,这是未经测试的

控制器冲突解决程序类具有id
controller\u resolver.class
,您可以使用

在你的
app/config/config.yml

.. config stuff ..

parameters:
    controller_resolver.class: Acme\SomeBundle\Controller\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);
    }
}
然后在新的
控制器Resolver

.. config stuff ..

parameters:
    controller_resolver.class: Acme\SomeBundle\Controller\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);
if(is_数组($controller)&&$request->isXmlHttpRequest()){
$controller[1]=预更换(
“/^(?P.*)操作$/”,
“$1AjaxAction”,
$controller[1]
);
}
返回父::getArguments($request,$controller);

。。只需更新所调用的操作,然后将其发送到常规解析程序,无需任何回退,这意味着可以使用
XmlHttpRequest
调用的每个操作都需要相应的AjaxAction。

一种方法是使用稍加修改的控制器解析器,而不是常规
KttpKernel::handleRaw
中的当前控制器解析器

请注意,我在这里的想法可能是错误的,这是未经测试的

控制器冲突解决程序类具有id
controller\u resolver.class
,您可以使用

在你的
app/config/config.yml

.. config stuff ..

parameters:
    controller_resolver.class: Acme\SomeBundle\Controller\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);
    }
}
然后在新的
控制器Resolver

.. config stuff ..

parameters:
    controller_resolver.class: Acme\SomeBundle\Controller\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);
if(is_数组($controller)&&$request->isXmlHttpRequest()){
$controller[1]=预更换(
“/^(?P.*)操作$/”,
“$1AjaxAction”,
$controller[1]
);
}
返回父::getArguments($request,$controller);

。。只需更新所调用的操作,然后将其发送到常规解析程序,无需任何回退,这意味着可以使用
XmlHttpRequest
调用的每个操作都需要相应的AjaxAction。

一种方法是使用稍加修改的控制器解析器,而不是常规
KttpKernel::handleRaw
中的当前控制器解析器

请注意,我在这里的想法可能是错误的,这是未经测试的

控制器冲突解决程序类具有id
controller\u resolver.class
,您可以使用

在你的
app/config/config.yml

.. config stuff ..

parameters:
    controller_resolver.class: Acme\SomeBundle\Controller\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);
    }
}
然后在新的
控制器Resolver

.. config stuff ..

parameters:
    controller_resolver.class: Acme\SomeBundle\Controller\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
,如果它遇到错误,则返回到常规解析程序