I need to create a drop-down of states such that as soon as i select country from country drop_down then states drop_down of that country should come up using Ajax. I am getting error following error.
Attempted to call an undefined method named "getDoctrine" of class "FOS\UserBundle\Controller\RegistrationController"
The AJAX is getting called and the id of the country is being passed to the controller , the main problem is the getDoctrine
function. Here is my controller.
I am new to symfony , please help me.
public function getStateAction(Request $request)
{
$em1 = $this->getDoctrine()->getManager();
$data = $request->request->all();
$countryId = $data['id'];
$repository = $em->getRepository('FOSUserBundle:State');
$query = $repository->createQueryBuilder('p');
$query->where('p.country ='.$countryId);
$query->orderBy('p.id', 'ASC');
$stateList = $query->getQuery()->getResult();
//print_r($stateList); die;
}
Here is my ajax
$(document).ready(function(){
$("#fos_user_registration_form_country_id").change(function(){
var countryId = $(this).val();
if(countryId!=0){
$.ajax({
type: "POST",
url: "{{ path('fos_user_registration_country') }}",
data: {id: countryId},
cache: false,
success: function(result){
("#fos_user_registration_form_state_id").append(result);
}
});
}
});
});
Did you try with:
public function getStateAction(Request $request)
{
$em1 = $this->container->get('doctrine')->getManager();
/.../
}
getDoctrine()
is a method of the class Symfony\Bundle\FrameworkBundle\Controller\Controller
who is not extended from FOS\UserBundle\Controller\RegistrationController
I assume you are using a version of FOSUserBundle that isn't the latest master version. Your issue is due to the fact that, up until the dev-master version, the RegistrationController
extended Symfony\Component\DependencyInjection\ContainerAware
rather than Symfony\Bundle\FrameworkBundle\Controller\Controller
. The Controller
class extends ContainerAware
and contains a bunch of shortcut calls like getDoctrine
, generateUrl
and isGranted
.
The getDoctrine
method just calls the container like..
/**
* Shortcut to return the Doctrine Registry service.
*
* @return Registry
*
* @throws \LogicException If DoctrineBundle is not available
*/
protected function getDoctrine()
{
if (!$this->container->has('doctrine')) {
throw new \LogicException('The DoctrineBundle is not registered in your application.');
}
return $this->container->get('doctrine');
}
You have 2 options: copy the getDoctrine
method into your class, or just use $this->container->get('doctrine')
directly.
I added this line to my controller and the controller was inheriting from container instead of controller. Thankyou for the help @scoolnico.
public function getStateAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
/../
}