Вопрос

Я пытаюсь вызвать метод моей API, но я получаю это исключение:

FatalErrorException: Error: Call to undefined method 
Project\Bundle\ApiBundle\Controller\UserController::userCreate() in
Symfony/src/Project/Bundle/UserBundle/Controller/UserController.php line 56
.

Я пытаюсь вызвать метод моей API для создания пользователя, чтобы не повторить один и тот же код дважды.API будет использоваться мобильным устройством.В браузере, когда пользователь пытается зарегистрироваться, он вызывает маршрут, который позвонит API создать пользователя.Это то, что я пытаюсь сделать ...

Если я добавлю прямо URL API для создания пользователя, он отлично работает. Генеракодицетагкод Но когда я называю этот метод в моем контроллере, как здесь:

public function registerAction()
{
  $apiUserController = new \Moodress\Bundle\ApiBundle\Controller\UserController;
  $answer = $apiUserController->userCreate();
  return $this->redirect($this->generateUrl('moodress_home'));
} 
.

Он не в состоянии найти мой метод UserCreate в Usercontroller ...

Вот мой usercontroller:

class UserController extends Controller
{
    /**
    * @Post("/user/create")
    */
    public function userCreateAction()
    {
    $userManager  = $this->get('fos_user.user_manager');
    $jsonErrorCreator = $this->get('moodress_api.create_error_json');

    $user         = $userManager->createUser();
    $user->setEnabled(true);
    $request      = $this->get('request');
    $name         = $request->request->get('name');
    $email        = $request->request->get('email');
    $password     = $request->request->get('password');
    $verification = $request->request->get('verification');

    // We check if all parameters are set
    $code = 0;
    if ($name === null)                                        $code = 200;
    else if ($email    === null)                               $code = 201;
    else if ($password === null)                               $code = 202;
    else if ($verification === null)                           $code = 203;
    else if ($password !== $verification)                      $code = 204;
    else if ($userManager->findUserByUsername($name) !== null) $code = 205;
    else if ($userManager->findUserByEmail($email)   !== null) $code = 206;
     if ($code != 0)
                return ($jsonErrorCreator->createErrorJson($code, null));
    // We set parameters to user object
    $user->setUsername($name);
    $user->setEmail($email);
    $encoder = $this->get('security.encoder_factory')->getEncoder($user);
    $password_user = $encoder->encodePassword($password, $user->getSalt());
    $user->setPassword($password_user);

    $clientManager = $this->get('fos_oauth_server.client_manager.default');
    $client = $clientManager->createClient();
    $client->setRedirectUris(array('http://localhost:8888/app_dev.php'));
    $client->setAllowedGrantTypes(array('token', 'authorization_code'));
    $clientManager->updateClient($client);

    $user->setClient($client);
    // We save the user in the database
    $userManager->updateUser($user);

    // We use the json service for returning the data
    $jsonCreator = $this->get('moodress_api.create_json');
    $response = $jsonCreator->createJson($user);
    return $response;
}
.

Мы просто пытаемся позвонить в метод API и вернуть результат ... Какой лучший способ назвать методом FosrestBundle?

Спасибо

Это было полезно?

Решение

<Сильное> Решение:

Вы, вероятно, должны лучше использовать Переадресация вроде бы:

$response = $this->forward('AcmeYourBundle:User:userCreate', array());
// modify the response

return $response;
.

<Сильные> Объяснение:

Вы пытались вызвать несуществующие действия.

public function userCreateAction() { /* ... */ }
.

... который нужно назвать так:

$answer = $apiUserController->userCreateAction();
.

... вместо

$answer = $apiUserController->userCreate();
.

Не создавайте объекты контроллера вручную:

Далее вы не можете просто создать новый объект контроллера и использовать его мгновенно

$controller = new \Moodress\Bundle\ApiBundle\Controller\UserController();
.

Вам нужно - по крайней мере - ввести контейнер для вызовов $this->get('...') на работу:

$controller->setContainer($this->container);
.

Вы должны сильно рефакторировать свой код, хотя ... Действие Way Way Tooth Lat.

<Сильные> Советы:

Как вы, кажется, довольно новые для Symfony - вот несколько других советов:

    .
  • Вы должны создать тип входа в систему и использовать это вместо того, чтобы получить данные из запроса напрямую (или использовать, который уже предоставлен FosuserBundle)
  • Вы должны добавить метаданные валидации на ваш класс пользователя и подтвердить его, используя службу Validator (пользовательские сопоставления, которые уже предоставляются FosuserBundle)
  • есть jsonresponse класс, который вы можете использовать < / li>
  • Коды состояния HTTP - это константы в классе запроса, который вы можете использовать

Просто используйте следующее:

use Symfony\Component\HttpFoundation\JsonResponse;

return new JsonResponse($data, JsonResponse::HTTP_OK); // 200
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top