Domanda

Sto cercando di chiamare un metodo della mia API ma ottengo questa eccezione:

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

Provo a chiamare il metodo della mia API per creare un utente per non ripetere lo stesso codice due volte.L'API sarebbe usato dal dispositivo mobile.Su un browser, quando un utente tenta di registrarsi, chiama un percorso che chiamerà l'API Crea utente.È quello che sto cercando di fare ...

Se chiamo direttamente l'API URL per creare utente, funziona perfettamente. app_dev.php/api/user/create. Ma quando chiamo questo metodo nel mio controller come qui:

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

Non è in grado di trovare il mio metodo UserCreate in UserController ...

Ecco il mio 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;
}
.

Stiamo solo cercando di chiamare il metodo API e torneremo il risultato ... Qual è il modo migliore per chiamare un metodo del fosrestbundle?

Grazie

È stato utile?

Soluzione

Soluzione:

Dovresti probabilmente usare meglio Inoltro come questo: Spiegazione:

Hai provato a chiamare un'azione inesistente.

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

... che dovrebbe essere chiamato come questo:

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

... invece di

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

Non creare oggetti controller manualmente:

Inoltre, non puoi semplicemente creare un nuovo oggetto controller e usarlo istantaneamente

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

È necessario - almeno - iniettare il contenitore per le chiamate $this->get('...'):

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

Dovresti refatturare pesantemente il tuo codice però ... L'azione è way troppo grasso.

Suggerimenti:

Come sembri essere abbastanza nuovo per symfony - qui ci sono alcuni altri suggerimenti:

    .
  • È necessario creare un tipo di modulo di accesso e utilizzare questo invece di ottenere direttamente i dati dalla richiesta (o utilizzare quello già fornito da fosuserbundle)
  • Dovresti aggiungere metadati di convalida alla classe utente e convalidarlo utilizzando il servizio di validatore (i mappati di convalida dell'utente sono già forniti da fosuserbundle)
  • C'è un jsonresponse classe che puoi usare < / Li >.
  • I codici di stato HTTP sono costanti nella classe di richiesta che è possibile utilizzare

Basta usare quanto segue:

use Symfony\Component\HttpFoundation\JsonResponse;

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top