Мне нужно создать раскрывающийся список состояний, чтобы, как только я выберу страну из drop_down страны, с помощью Ajax должно появиться раскрывающееся меню этой страны. Я получаю сообщение об ошибке после ошибки.

Попытка вызвать неопределенный метод с именем «getDoctrine» класса «FOS \ UserBundle \ Controller \ RegistrationController»

Вызывается AJAX и контроллеру передается идентификатор страны, основная проблема - это функция getDoctrine. Вот мой контроллер.

Я новичок в Symfony, пожалуйста, помогите мне.

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;
    }

Вот мой аякс

$(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);
             }
           });
        }
    });
});
1
Ananddon 24 Дек 2015 в 09:24

3 ответа

Лучший ответ

Вы пробовали:

public function getStateAction(Request $request)
{   
    $em1 = $this->container->get('doctrine')->getManager();

    /.../
}

getDoctrine() - это метод класса Symfony\Bundle\FrameworkBundle\Controller\Controller, не расширенный от FOS\UserBundle\Controller\RegistrationController

2
scoolnico 24 Дек 2015 в 08:46

Я предполагаю, что вы используете версию FOSUserBundle, которая не является последней основной версией. Ваша проблема связана с тем, что до версии dev-master RegistrationController расширял Symfony\Component\DependencyInjection\ContainerAware, а не Symfony\Bundle\FrameworkBundle\Controller\Controller. Класс Controller расширяет ContainerAware и содержит набор быстрых вызовов, таких как getDoctrine, generateUrl и isGranted.

Метод getDoctrine просто вызывает контейнер как ..

/**
 * 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');
}

У вас есть 2 варианта: скопировать метод getDoctrine в свой класс или просто использовать $this->container->get('doctrine') напрямую.

3
qooplmao 24 Дек 2015 в 13:34

Я добавил эту строку в свой контроллер, и контроллер наследовал от контейнера, а не от контроллера. Спасибо за помощь @scoolnico.

 public function getStateAction(Request $request)
        {               
                $em = $this->getDoctrine()->getManager();
                /../


        }
0
Ananddon 7 Янв 2016 в 06:01