php - form - symfony2 ajax jquery example
¿Es posible restringir una ruta solo para AJAX? (6)
Lo que estás buscando no existe en la configuración de enrutamiento de Symfony.
Request :: isXmlHttpRequest incluso no es 100% confiable y comprueba los encabezados HTTP que pone su biblioteca de JavaScript:
Funciona si su biblioteca de JavaScript establece un encabezado HTTP X-Requerido-Con. Se sabe que funciona con Prototype, Mootools, jQuery.
¿Es posible restringir una ruta Symfony 2 solo para solicitudes XHR? Quiero declarar rutas, que solo son accesibles a través de AJAX.
No quiero poner líneas adicionales en cada acción específica de AJAX como esa:
if ($request->isXmlHttpRequest()) {
// do something
} else {
// do something else
}
Quiero definir:
- una regla para las solicitudes AJAX
- una regla para solicitudes GET / POST a la misma URL
para poder tener condiciones como la anterior.
Mi consejo sería definir su propio servicio de enrutador en lugar de default , que se extendería desde Symfony/Bundle/FrameworkBundle/Routing/Router
, y redefinir el método resolveParameters() con la implementación de su propia lógica para manejar requisitos adicionales.
Y luego, podrías hacer algo como esto en tu enrutamiento:
your_route:
pattern: /somepattern
defaults: { somedefaults }
requirements:
_request_type: some_requirement
No estoy seguro de que pueda evitar que se realice la solicitud, sin embargo, puede verificar si hay una solicitud XHR en el Controlador al verificar la Solicitud actual.
El código se vería así:
if ($request->isXmlHttpRequest()) {
// ...
}
Esto no es 100% confiable, debido a, entre otras cosas, inconsistencias del navegador y la posibilidad de interferencia de proxy. Sin embargo, es el método predominante para verificar una solicitud asincrónica y es recomendado por muchos. Si eres cr
Parámetro de URL
Una alternativa sería agregar un parámetro en su URL para identificar la solicitud como asíncrona. Esto se logra agregando ?ajax=1
a su URL. Luego, verifique el parámetro con:
$AjaxRequest = $request->getParameter(''ajax'');
If($AjaxRequest == 1) {
//...
}
Por supuesto, en este punto también podría crear una ruta específica, por ejemplo, /ajax/index/
.
No, no puedes. No depende de qué marco está utilizando, las solicitudes AJAX básicamente son solo solicitudes a un servidor. No hay una solución 100% confiable, solo "hacks".
Puede usar los requirements para alcanzar el resultado descrito.
Entonces, supongamos que estás definiendo rutas en formato yml, tienes que hacer algo como esto
my_route:
pattern: /path/to/route
defaults: { _controller: CompanyBundle:Controller:Action, _format: html }
requirements:
_format: xmlhttp /* not sure about the correct format because
i''ve never checked about */
Y, por supuesto, puede usar _method: POST
o _method: GET
Sé que esta pregunta es un poco más antigua, pero mientras tanto, se presentó una nueva forma de lograrlo en Symfony 2.4 .
Ruta completamente personalizada que coincide con las condiciones
Para una restricción ajax se vería así:
contact:
path: /contact
defaults: { _controller: AcmeDemoBundle:Main:contact }
condition: "request.isXmlHttpRequest()"
También es posible en Anotación:
/**
* ContactAction
*
* @Route("/contact", name="contact", condition="request.isXmlHttpRequest()")
*/