[英]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.