Pregunta

Estoy tratando de llamar a un método de mi API, pero obtengo esta excepción:

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

Intento llamar al método de mi API para crear un usuario para no repetir el mismo código dos veces.La API sería utilizada por dispositivo móvil.En un navegador, cuando un usuario intenta registrarse, llama una ruta que llamará a la API Crear usuario.Es lo que estoy tratando de hacer ...

Si llamo directamente a la API de URL para crear usuario, funciona perfectamente. app_dev.php/api/user/create Pero cuando llamo a este método en mi controlador como aquí:

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

No es capaz de encontrar mi método UserCreate en UserController ...

Aquí está mi 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;
}

Solo estamos tratando de llamar al método API y recuperar el resultado ... ¿Cuál es la mejor manera de llamar a un método de FOSRESTBUNDLE?

gracias

¿Fue útil?

Solución

Solución:

Probablemente deberías usar mejor reenvío Me gusta esto:

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

return $response;

Explicación:

Intentaste llamar a una acción inexistente.

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

... que debe llamarse así:

$answer = $apiUserController->userCreateAction();

... en lugar de

$answer = $apiUserController->userCreate();

No cree objetos del controlador manualmente:

Además, no puede simplemente crear un nuevo objeto de controlador y usarlo instantáneamente

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

Debe, al menos, inyecte el contenedor para las llamadas de $this->get('...') para funcionar:

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

Debería refactoramente su código, aunque ... la acción es forma demasiado gordo.

consejos:

Como parece que es bastante nuevo en Symfony, aquí hay algunos otros consejos:

  • Debe crear un tipo de formulario de inicio de sesión y usar esto en lugar de obtener datos de la solicitud directamente (o usar el que ya está proporcionado por FOSUSERBUNDLE)
  • Debe agregar metadatos de validación a su clase de usuario y validarlo utilizando el servicio Validator (validación de usuarios, las asignaciones ya están proporcionadas por FOSUSERBUNDLE)
  • Hay una JSONRESPONSE clase que puedes usar < / li>
  • Los códigos de estado HTTP son constantes en la clase de solicitud que puede usar

Simplemente use lo siguiente:

use Symfony\Component\HttpFoundation\JsonResponse;

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top