Question

J'essaye d'appeler une méthode de mon API mais j'obtiens cette exception :

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

J'essaye d'appeler la méthode de mon API pour créer un utilisateur afin de ne pas répéter deux fois le même code.L'API serait utilisée par les appareils mobiles.Sur un navigateur, lorsqu'un utilisateur tente de s'inscrire, il appelle une route qui appellera l'API de création d'utilisateur.C'est ce que j'essaie de faire...

Si j'appelle directement l'API URL pour créer un utilisateur, cela fonctionne parfaitement.app_dev.php/api/user/createMais quand j'appelle cette méthode dans mon contrôleur comme ici :

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

Il n'arrive pas à trouver ma méthode userCreate dans UserController...

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

Nous essayons simplement d'appeler la méthode API et de récupérer le résultat...Quelle est la meilleure façon d’appeler une méthode du FOSRestBundle ?

Merci

Était-ce utile?

La solution

solution:

Vous devriez probablement mieux utiliser expéditeur comme ça:

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

return $response;

explication:

Vous avez essayé d'appeler une action inexistante.

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

...qui devrait s'appeler ainsi :

$answer = $apiUserController->userCreateAction();

...au lieu de

$answer = $apiUserController->userCreate();

Ne créez pas d'objets contrôleur manuellement :

De plus, vous ne pouvez pas simplement créer un nouvel objet contrôleur et l'utiliser instantanément

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

vous devez - au moins - injecter le conteneur pour $this->get('...') appels au travail :

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

Vous devriez cependant refactoriser fortement votre code...l'action est chemin trop gros.

conseils:

Comme vous semblez être assez nouveau sur Symfony, voici quelques autres conseils :

  • vous devez créer un type de formulaire de connexion et l'utiliser au lieu d'obtenir directement les données de la demande (ou utiliser celui déjà fourni par FOSUserBundle)
  • vous devez ajouter des métadonnées de validation à votre classe d'utilisateurs et les valider à l'aide du service de validation (les mappages de validation des utilisateurs sont déjà fournis par FOSUserBundle)
  • Il y a un Réponse Json classe que vous pouvez utiliser
  • Les codes d'état HTTP sont des constantes dans la classe de requête que vous pouvez utiliser

Utilisez simplement ce qui suit :

use Symfony\Component\HttpFoundation\JsonResponse;

return new JsonResponse($data, JsonResponse::HTTP_OK); // 200
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top