Controller:
/**
* @Route("/email/{name}/{email}/{subject}/{message}", name="email")
* @Method({"GET", "POST"})
*/
public function indexAction($name, $email, $subject, $message, Request $request){
var_dump($name, $email, $subject, $message);
die;
}
Ajax:
<script type="text/javascript">
$(document).ready(function() {
$('#contact-form').submit(function(event) {
$.ajax({
type:'POST',
url:'./email',
data:"/"+$('#name').val()+"/"+$('#email').val()+"/"+$('#subject').val()+"/"+$('#message').val(),
success:function(response){
alert(response)
}
});
event.preventDefault();
});
});
</script>
I am trying to submit ajax request to the controller. Unfortunately i get 404, and the following error: No route found for "POST /email" (from "http://localhost/Portfolio/web/app_dev.php/")
PS. The code in the controller is for debuging purposes
the route /email/{name}/{email}/{subject}/{message}
means that you need to send the Request to an URL like this
/email/testName/example@gmail.com/TestSUbject/Testmessage
if you need the /email
route to work just change the @Route
annotation to /email
and in controller
$request->request->get('email');
//retrieve other fields
...
.. to access the values of the POST request
Also you can also use Symfony Forms to take the Advantages they offer like validation , CSRF Protection , etc
You should change your controller to accept only POST request and so you don't need to pass your arguments in the path :
/**
* @Route("/email, name="email")
* @Method({"POST"})
*/
public function indexAction(Request $request){
//your code here
}
To access your post parameters in the controller, use $name = $request->request->get('name');
or consider using Symfony Forms
You also need to change your ajax call to send an object in data
:
<script type="text/javascript">
$(document).ready(function() {
$('#contact-form').submit(function(event) {
$.ajax({
type:'POST',
url:'/email',
data: {
name: $('#name').val(),
subject: $('#subject').val(),
email: $('#email').val(),
message: $('#message').val()
},
success:function(response){
alert(response)
}
});
event.preventDefault();
});
});
</script>
This will properly send a POST request to /email