Php 使用AJAX操作编辑Symfony行为
假设我有一个使用大量AJAX请求的应用程序 当我的请求是AJAX时,有没有一种方法可以编辑Symfony行为并自动调用Php 使用AJAX操作编辑Symfony行为,php,ajax,symfony,Php,Ajax,Symfony,假设我有一个使用大量AJAX请求的应用程序 当我的请求是AJAX时,有没有一种方法可以编辑Symfony行为并自动调用indexaxaction而不是indexAction 我已经知道,我可以使用request::isXmlHttpRequest()方法测试请求是否是Ajax,但我希望它是自动的(即不在每个controllerAction中进行测试) 服务/捆绑包是否已经成功 例如: 您可能需要查看Symfony的FOSRestBundle,如果您有一个操作,根据请求方法可以返回json数据或呈
indexaxaction
而不是indexAction
我已经知道,我可以使用request::isXmlHttpRequest()
方法测试请求是否是Ajax,但我希望它是自动的(即不在每个controllerAction中进行测试)
服务/捆绑包是否已经成功
例如:
您可能需要查看Symfony的FOSRestBundle,如果您有一个操作,根据请求方法可以返回json数据或呈现html模板,那么它将非常有用您可能需要查看Symfony的FOSRestBundle,如果您有一个操作可以返回json数据或呈现的html模板,这将非常有用,具体取决于请求方法您可能需要查看Symfony的FOSRestBundle,如果您有一个操作可以返回json数据或呈现的html模板,这将非常有用,具体取决于请求方法您可能需要查看Symfony的FOSRestBundle,如果您有一个操作可以根据请求方法返回json数据或呈现的html模板,那么它将非常有用。一种方法是使用稍微修改的控制器解析器,而不是常规KttpKernel::handleRaw
中的当前控制器解析器
请注意,我在这里的想法可能是错误的,这是未经测试的
控制器冲突解决程序类具有idcontroller\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
中的当前控制器解析器
请注意,我在这里的想法可能是错误的,这是未经测试的
控制器冲突解决程序类具有idcontroller\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
中的当前控制器解析器
请注意,我在这里的想法可能是错误的,这是未经测试的
控制器冲突解决程序类具有idcontroller\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
中的当前控制器解析器
请注意,我在这里的想法可能是错误的,这是未经测试的
控制器冲突解决程序类具有idcontroller\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
,如果它遇到错误,则返回到常规解析程序